diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index 7ac19a1d67e..96e7a28ea06 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -960,38 +960,39 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { private void generateFieldForSingleton() { if (isEnumEntry(descriptor) || isClassObject(descriptor)) return; - ClassDescriptor classObjectDescriptor = descriptor.getDefaultObjectDescriptor(); - ClassDescriptor fieldTypeDescriptor; - JetClassOrObject original; if (isObject(descriptor)) { - original = 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; - } + createFieldForSingleton(descriptor, myClass); - 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 InstructionAdapter v = createOrGetClInitCodegen().v; v.anew(classAsmType); v.invokespecial(classAsmType.getInternalName(), "", "()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() {