Remove desriptors from ObjectClassLowering

This commit is contained in:
Georgy Bronnikov
2018-11-29 16:59:03 +03:00
parent 5f4b8dd0aa
commit 5d7a736cb1
@@ -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) }
}
} }