diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt index 126fa6a3635..bdc41ce79c0 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/descriptors/DescriptorsFactory.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.backend.common.descriptors import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol @@ -16,5 +17,5 @@ interface DescriptorsFactory { fun getSymbolForEnumEntry(enumEntry: IrEnumEntrySymbol): IrFieldSymbol fun getOuterThisFieldDescriptor(innerClassDescriptor: ClassDescriptor): PropertyDescriptor fun getInnerClassConstructorWithOuterThisParameter(innerClassConstructor: ClassConstructorDescriptor): IrConstructorSymbol - fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor + fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol } \ No newline at end of file diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt index 38711afd3d4..cee3c335f00 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/JsDescriptorsFactory.kt @@ -26,10 +26,12 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl import org.jetbrains.kotlin.ir.declarations.IrEnumEntry import org.jetbrains.kotlin.ir.declarations.IrField +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl +import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import java.util.* @@ -114,10 +116,10 @@ class JsDescriptorsFactory( return IrConstructorSymbolImpl(newDescriptor) } - override fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor = - singletonFieldDescriptors.getOrPut(objectDescriptor) { - createObjectInstanceFieldDescriptor(objectDescriptor) - } + override fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol = + IrFieldSymbolImpl(singletonFieldDescriptors.getOrPut(singleton.descriptor) { + createObjectInstanceFieldDescriptor(singleton.descriptor) + }) private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor { assert(objectDescriptor.kind == ClassKind.OBJECT) { "Should be an object: $objectDescriptor" } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt index 67949f1c465..da26dc3c5f4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/descriptors/JvmDescriptorsFactory.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.ir.SourceManager +import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol @@ -126,10 +127,10 @@ class JvmDescriptorsFactory( ) } - override fun getFieldDescriptorForObjectInstance(objectDescriptor: ClassDescriptor): PropertyDescriptor = - singletonFieldDescriptors.getOrPut(objectDescriptor) { - createObjectInstanceFieldDescriptor(objectDescriptor) - } + override fun getSymbolForObjectInstance(singleton: IrClassSymbol): IrFieldSymbol = + IrFieldSymbolImpl(singletonFieldDescriptors.getOrPut(singleton.descriptor) { + createObjectInstanceFieldDescriptor(singleton.descriptor) + }) private fun createObjectInstanceFieldDescriptor(objectDescriptor: ClassDescriptor): PropertyDescriptor { assert(objectDescriptor.kind == ClassKind.OBJECT) { "Should be an object: $objectDescriptor" } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt index 04b7c7a0bf9..fb76548385d 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ObjectClassLowering.kt @@ -33,6 +33,8 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetFieldImpl import org.jetbrains.kotlin.codegen.JvmCodegenUtil.isCompanionObjectInInterfaceNotIntrinsic +import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol +import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformerVoidWithContext(), FileLoweringPass { @@ -53,7 +55,7 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer private fun process(irClass: IrClass) { if (irClass.descriptor.kind != ClassKind.OBJECT) return - val publicInstanceDescriptor = context.descriptorsFactory.getFieldDescriptorForObjectInstance(irClass.descriptor) + val publicInstance = context.descriptorsFactory.getSymbolForObjectInstance(irClass.symbol) val constructor = irClass.descriptor.unsubstitutedPrimaryConstructor ?: throw AssertionError("Object should have a primary constructor: ${irClass.descriptor}") @@ -61,7 +63,7 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer val publicInstanceOwner = if (irClass.descriptor.isCompanionObject) parentScope!!.irElement as IrDeclarationContainer else irClass if (isCompanionObjectInInterfaceNotIntrinsic(irClass.descriptor)) { // TODO rename to $$INSTANCE - val privateInstance = publicInstanceDescriptor.copy( + val privateInstance = publicInstance.descriptor.copy( irClass.descriptor, Modality.FINAL, Visibilities.PROTECTED/*TODO package local*/, @@ -69,36 +71,36 @@ class ObjectClassLowering(val context: JvmBackendContext) : IrElementTransformer false ) as PropertyDescriptor privateInstance.name - val field = createInstanceFieldWithInitializer(privateInstance, constructor, irClass) + val field = createInstanceFieldWithInitializer(IrFieldSymbolImpl(privateInstance), constructor, irClass) createFieldWithCustomInitializer( - publicInstanceDescriptor, + publicInstance, IrGetFieldImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, field.symbol), publicInstanceOwner ) } else { - createInstanceFieldWithInitializer(publicInstanceDescriptor, constructor, publicInstanceOwner) + createInstanceFieldWithInitializer(publicInstance, constructor, publicInstanceOwner) } } private fun createInstanceFieldWithInitializer( - instanceFieldDescriptor: PropertyDescriptor, + fieldSymbol: IrFieldSymbol, constructor: ClassConstructorDescriptor, instanceOwner: IrDeclarationContainer ): IrField = createFieldWithCustomInitializer( - instanceFieldDescriptor, + fieldSymbol, IrCallImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, constructor), instanceOwner ) private fun createFieldWithCustomInitializer( - instanceFieldDescriptor: PropertyDescriptor, + fieldSymbol: IrFieldSymbol, instanceInitializer: IrExpression, instanceOwner: IrDeclarationContainer ): IrField = IrFieldImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, JvmLoweredDeclarationOrigin.FIELD_FOR_OBJECT_INSTANCE, - instanceFieldDescriptor, + fieldSymbol, IrExpressionBodyImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, instanceInitializer) ).also { pendingTransformations.add { instanceOwner.declarations.add(it) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt index 222dc8046b4..5f3c7cb2239 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/SingletonReferencesLowering.kt @@ -37,7 +37,7 @@ class SingletonReferencesLowering(val context: JvmBackendContext) : BodyLowering } override fun visitGetObjectValue(expression: IrGetObjectValue): IrExpression { - val instanceFieldDescriptor = context.descriptorsFactory.getFieldDescriptorForObjectInstance(expression.descriptor) - return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceFieldDescriptor) + val instanceField = context.descriptorsFactory.getSymbolForObjectInstance(expression.symbol) + return IrGetFieldImpl(expression.startOffset, expression.endOffset, instanceField) } } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt index 47d5855bef5..bcc72543489 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFieldImpl.kt @@ -42,13 +42,20 @@ class IrFieldImpl( override val isExternal: Boolean ) : IrDeclarationBase(startOffset, endOffset, origin), IrField { - constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrFieldSymbol) : - this( - startOffset, endOffset, origin, symbol, - symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility, - !symbol.descriptor.isVar, - symbol.descriptor.isEffectivelyExternal() - ) + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrFieldSymbol, + initializer: IrExpressionBody? = null + ) : this( + startOffset, endOffset, origin, symbol, + symbol.descriptor.name, symbol.descriptor.type, symbol.descriptor.visibility, + !symbol.descriptor.isVar, + symbol.descriptor.isEffectivelyExternal() + ) { + this.initializer = initializer + } constructor(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: PropertyDescriptor) : this(startOffset, endOffset, origin, IrFieldSymbolImpl(descriptor))