Remove desriptors from ObjectClassLowering
This commit is contained in:
+41
-62
@@ -8,22 +8,20 @@ package org.jetbrains.kotlin.backend.jvm.lower
|
|||||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||||
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext
|
||||||
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase
|
||||||
|
import org.jetbrains.kotlin.backend.common.descriptors.WrappedFieldDescriptor
|
||||||
|
import org.jetbrains.kotlin.backend.common.lower.createIrBuilder
|
||||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||||
import org.jetbrains.kotlin.codegen.JvmCodegenUtil.isCompanionObjectInInterfaceNotIntrinsic
|
import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.ir.IrStatement
|
import org.jetbrains.kotlin.ir.IrStatement
|
||||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||||
|
import org.jetbrains.kotlin.ir.builders.irCall
|
||||||
|
import org.jetbrains.kotlin.ir.builders.irExprBody
|
||||||
|
import org.jetbrains.kotlin.ir.builders.irGetField
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
import org.jetbrains.kotlin.ir.declarations.impl.IrFieldImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.IrExpression
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
|
import org.jetbrains.kotlin.ir.util.*
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
|
|
||||||
import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol
|
|
||||||
import org.jetbrains.kotlin.ir.types.IrType
|
|
||||||
import org.jetbrains.kotlin.ir.util.defaultType
|
|
||||||
import org.jetbrains.kotlin.ir.util.isObject
|
|
||||||
|
|
||||||
internal val objectClassPhase = makeIrFilePhase(
|
internal val objectClassPhase = makeIrFilePhase(
|
||||||
::ObjectClassLowering,
|
::ObjectClassLowering,
|
||||||
@@ -52,33 +50,42 @@ private class ObjectClassLowering(val context: JvmBackendContext) : IrElementTra
|
|||||||
|
|
||||||
val publicInstanceField = context.declarationFactory.getFieldForObjectInstance(irClass)
|
val publicInstanceField = context.declarationFactory.getFieldForObjectInstance(irClass)
|
||||||
|
|
||||||
val constructor = irClass.descriptor.unsubstitutedPrimaryConstructor
|
val constructor = irClass.constructors.find { it.isPrimary }
|
||||||
?: throw AssertionError("Object should have a primary constructor: ${irClass.descriptor}")
|
?: throw AssertionError("Object should have a primary constructor: ${irClass.name}")
|
||||||
val constructorSymbol = context.ir.symbols.externalSymbolTable.referenceConstructor(constructor)
|
|
||||||
|
|
||||||
val publicInstanceOwner = if (irClass.descriptor.isCompanionObject) parentScope!!.irElement as IrDeclarationContainer else irClass
|
val publicInstanceOwner = if (irClass.isCompanion) parentScope!!.irElement as IrDeclarationContainer else irClass
|
||||||
if (isCompanionObjectInInterfaceNotIntrinsic(irClass.descriptor)) {
|
if (irClass.isCompanion && irClass.parentAsClass.isJvmInterface) {
|
||||||
// TODO rename to $$INSTANCE
|
// TODO rename to $$INSTANCE
|
||||||
val privateInstance = publicInstanceField.descriptor.copy(
|
// TODO: mark as synthesized
|
||||||
irClass.descriptor,
|
val privateFieldDescriptor = WrappedFieldDescriptor()
|
||||||
Modality.FINAL,
|
val privateField = IrFieldImpl(
|
||||||
Visibilities.PROTECTED/*TODO package local*/,
|
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
|
||||||
CallableMemberDescriptor.Kind.SYNTHESIZED,
|
IrDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE,
|
||||||
false
|
IrFieldSymbolImpl(privateFieldDescriptor),
|
||||||
) as PropertyDescriptor
|
publicInstanceField.name,
|
||||||
val fieldSymbol = context.ir.symbols.externalSymbolTable.referenceField(privateInstance)
|
irClass.defaultType,
|
||||||
val field = createInstanceFieldWithInitializer(
|
Visibilities.PROTECTED/* TODO package local */,
|
||||||
fieldSymbol,
|
isFinal = true,
|
||||||
constructorSymbol,
|
isExternal = false,
|
||||||
irClass,
|
isStatic = true
|
||||||
irClass.defaultType
|
).apply {
|
||||||
)
|
privateFieldDescriptor.bind(this)
|
||||||
publicInstanceField.initializer =
|
parent = irClass
|
||||||
IrExpressionBodyImpl(IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, field.symbol, irClass.defaultType))
|
with(context.createIrBuilder(symbol)) {
|
||||||
|
initializer = irExprBody(
|
||||||
|
irCall(constructor)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
pendingTransformations.add { parentAsClass.declarations.add(this) }
|
||||||
|
}
|
||||||
|
|
||||||
|
with(context.createIrBuilder(publicInstanceField.symbol)) {
|
||||||
|
publicInstanceField.initializer = irExprBody(irGetField(null, privateField))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
val constructorCall =
|
with(context.createIrBuilder(publicInstanceField.symbol)) {
|
||||||
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irClass.defaultType, constructorSymbol, constructorSymbol.descriptor, 0)
|
publicInstanceField.initializer = irExprBody(irCall(constructor.symbol))
|
||||||
publicInstanceField.initializer = IrExpressionBodyImpl(constructorCall)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
publicInstanceField.parent = publicInstanceOwner
|
publicInstanceField.parent = publicInstanceOwner
|
||||||
@@ -86,32 +93,4 @@ private class ObjectClassLowering(val context: JvmBackendContext) : IrElementTra
|
|||||||
publicInstanceOwner.declarations.add(publicInstanceField)
|
publicInstanceOwner.declarations.add(publicInstanceField)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun createInstanceFieldWithInitializer(
|
|
||||||
fieldSymbol: IrFieldSymbol,
|
|
||||||
constructorSymbol: IrConstructorSymbol,
|
|
||||||
instanceOwner: IrDeclarationContainer,
|
|
||||||
objectType: IrType
|
|
||||||
): IrField =
|
|
||||||
createFieldWithCustomInitializer(
|
|
||||||
fieldSymbol,
|
|
||||||
IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, objectType, constructorSymbol, constructorSymbol.descriptor, 0),
|
|
||||||
instanceOwner,
|
|
||||||
objectType
|
|
||||||
)
|
|
||||||
|
|
||||||
private fun createFieldWithCustomInitializer(
|
|
||||||
fieldSymbol: IrFieldSymbol,
|
|
||||||
instanceInitializer: IrExpression,
|
|
||||||
instanceOwner: IrDeclarationContainer,
|
|
||||||
objectType: IrType
|
|
||||||
): IrField =
|
|
||||||
IrFieldImpl(
|
|
||||||
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE,
|
|
||||||
fieldSymbol, objectType
|
|
||||||
).also {
|
|
||||||
it.initializer = IrExpressionBodyImpl(instanceInitializer)
|
|
||||||
it.parent = instanceOwner
|
|
||||||
pendingTransformations.add { instanceOwner.declarations.add(it) }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user