diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index f1a7939d5e1..3f46fb2579f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -131,7 +131,7 @@ fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffse ) IrGetFieldImpl( defaultStartOffset, defaultEndOffset, - context.symbolTable.referenceField(context.additionalDescriptorStorage.getField(receiver)), + context.additionalDescriptorStorage.getSyntheticField(receiver).symbol, irReceiverType, thisReceiver ) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt index 838c70e179a..c6ef5b4e58d 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/BodyGenerator.kt @@ -350,7 +350,7 @@ class BodyGenerator( irBlockBody.statements.add( IrSetFieldImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, - context.symbolTable.referenceField(context.additionalDescriptorStorage.getField(receiverDescriptor.value)), + context.additionalDescriptorStorage.getSyntheticField(receiverDescriptor.value).symbol, receiver, IrGetValueImpl(UNDEFINED_OFFSET, UNDEFINED_OFFSET, irValueParameter.type, irValueParameter.symbol), context.irBuiltIns.unitType diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index 99393a8b19c..044396e6c94 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl import org.jetbrains.kotlin.ir.expressions.mapValueParameters import org.jetbrains.kotlin.ir.expressions.putTypeArguments import org.jetbrains.kotlin.ir.expressions.typeParametersCount +import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.types.IrSimpleType import org.jetbrains.kotlin.ir.util.SYNTHETIC_OFFSET import org.jetbrains.kotlin.ir.util.createIrClassFromDescriptor @@ -435,35 +436,18 @@ class ClassGenerator( private fun generateFieldsForAdditionalReceivers(irClass: IrClass, classDescriptor: ClassDescriptor) { for ((fieldIndex, receiverDescriptor) in classDescriptor.contextReceivers.withIndex()) { - val descriptor = PropertyDescriptorImpl.create( - classDescriptor, - Annotations.EMPTY, - Modality.FINAL, - DescriptorVisibilities.DEFAULT_VISIBILITY, - false, - Name.identifier("additionalReceiverField$fieldIndex"), - CallableMemberDescriptor.Kind.DECLARATION, - SourceElement.NO_SOURCE, - false, false, - classDescriptor.isExpect, - false, false, false - ) - descriptor.setType( - receiverDescriptor.type, emptyList(), DescriptorUtils.getDispatchReceiverParameterIfNeeded(classDescriptor), null, - emptyList() - ) - descriptor.initialize( - null, null, - FieldDescriptorImpl(Annotations.EMPTY, descriptor), - null - ) - context.additionalDescriptorStorage.put(receiverDescriptor.value, descriptor) - val irField = context.symbolTable.declareField( + val irField = context.irFactory.createField( UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.FIELD_FOR_CLASS_CONTEXT_RECEIVER, - descriptor, descriptor.type.toIrType(), - descriptor.visibility + IrFieldSymbolImpl(), + Name.identifier("additionalReceiverField$fieldIndex"), + receiverDescriptor.type.toIrType(), + DescriptorVisibilities.PRIVATE, + isFinal = true, + isExternal = false, + isStatic = false ) + context.additionalDescriptorStorage.put(receiverDescriptor.value, irField) irClass.addMember(irField) } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DescriptorStorageForAdditionalReceivers.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DescriptorStorageForAdditionalReceivers.kt index 4be1fe79b35..bf4e389282d 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DescriptorStorageForAdditionalReceivers.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DescriptorStorageForAdditionalReceivers.kt @@ -5,25 +5,25 @@ package org.jetbrains.kotlin.psi2ir.generators -import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor +import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue class DescriptorStorageForAdditionalReceivers { - private val fieldStorage: MutableMap = mutableMapOf() private val variableStorage: MutableMap = mutableMapOf() - - fun put(receiverValue: ReceiverValue, descriptor: PropertyDescriptor) { - fieldStorage[receiverValue] = descriptor - } + private val syntheticFieldStorage: MutableMap = mutableMapOf() fun put(expression: KtExpression, descriptor: VariableDescriptor) { variableStorage[expression] = descriptor } - fun getField(receiverValue: ReceiverValue) = - fieldStorage[receiverValue] ?: error("No field descriptor for receiver value $receiverValue") + fun put(receiverValue: ReceiverValue, irField: IrField) { + syntheticFieldStorage[receiverValue] = irField + } fun getVariable(expression: KtExpression) = variableStorage[expression] ?: error("No variable descriptor for receiver $expression") + + fun getSyntheticField(receiverValue: ReceiverValue) = + syntheticFieldStorage[receiverValue] ?: error("No synthetic field for receiver value $receiverValue") } \ No newline at end of file