Refactor: ImplementationBodyCodegen#generateFieldForSingleton()
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user