Refactor: ImplementationBodyCodegen#generateFieldForSingleton()

This commit is contained in:
Pavel V. Talanov
2015-01-30 18:27:31 +03:00
parent f482768acf
commit 7d5c0dc8bf
@@ -960,38 +960,39 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
private void generateFieldForSingleton() { private void generateFieldForSingleton() {
if (isEnumEntry(descriptor) || isClassObject(descriptor)) return; if (isEnumEntry(descriptor) || isClassObject(descriptor)) return;
ClassDescriptor classObjectDescriptor = descriptor.getDefaultObjectDescriptor();
ClassDescriptor fieldTypeDescriptor;
JetClassOrObject original;
if (isObject(descriptor)) { if (isObject(descriptor)) {
original = myClass; createFieldForSingleton(descriptor, myClass);
fieldTypeDescriptor = descriptor;
}
else if (classObjectDescriptor != null) {
JetObjectDeclaration classObject = ((JetClass) myClass).getClassObject();
assert classObject != null : "Class object not found: " + myClass.getText();
original = classObject;
fieldTypeDescriptor = classObjectDescriptor;
}
else {
return;
}
StackValue.Field field = StackValue.singleton(fieldTypeDescriptor, typeMapper); if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
v.newField(OtherOrigin(original), ACC_PUBLIC | ACC_STATIC | ACC_FINAL, field.name, field.type.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
if (isObject(descriptor)) {
// Invoke the object constructor but ignore the result because INSTANCE$ will be initialized in the first line of <init> // Invoke the object constructor but ignore the result because INSTANCE$ will be initialized in the first line of <init>
InstructionAdapter v = createOrGetClInitCodegen().v; InstructionAdapter v = createOrGetClInitCodegen().v;
v.anew(classAsmType); v.anew(classAsmType);
v.invokespecial(classAsmType.getInternalName(), "<init>", "()V", false); v.invokespecial(classAsmType.getInternalName(), "<init>", "()V", false);
return;
} }
else if (!isClassObjectWithBackingFieldsInOuter(fieldTypeDescriptor)) {
generateClassObjectInitializer(fieldTypeDescriptor); ClassDescriptor classObjectDescriptor = descriptor.getDefaultObjectDescriptor();
if (classObjectDescriptor == null) {
return;
} }
JetObjectDeclaration classObject = ((JetClass) myClass).getClassObject();
assert classObject != null : "Class object not found: " + myClass.getText();
createFieldForSingleton(classObjectDescriptor, classObject);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
if (!isClassObjectWithBackingFieldsInOuter(classObjectDescriptor)) {
generateClassObjectInitializer(classObjectDescriptor);
}
}
private void createFieldForSingleton(@NotNull ClassDescriptor fieldTypeDescriptor, @NotNull JetClassOrObject original) {
StackValue.Field field = StackValue.singleton(fieldTypeDescriptor, typeMapper);
v.newField(OtherOrigin(original), ACC_PUBLIC | ACC_STATIC | ACC_FINAL, field.name, field.type.getDescriptor(), null, null);
} }
private void generateClassObjectBackingFieldCopies() { private void generateClassObjectBackingFieldCopies() {