From 8ec418e90f33bca31464106a99a9766914669485 Mon Sep 17 00:00:00 2001 From: Anastasiya Shadrina Date: Mon, 26 Jul 2021 18:18:15 +0700 Subject: [PATCH] [PSI2IR] Generate delegating constructor call correctly --- .../generators/ArgumentsGenerationUtils.kt | 30 ++++++++++++++++++- .../psi2ir/generators/FunctionGenerator.kt | 1 + 2 files changed, 30 insertions(+), 1 deletion(-) 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 715dce27bf6..e7caf63df6c 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 @@ -61,6 +61,34 @@ import kotlin.math.min fun StatementGenerator.generateReceiverOrNull(ktDefaultElement: KtElement, receiver: ReceiverValue?): IntermediateValue? = receiver?.let { generateReceiver(ktDefaultElement, receiver) } +fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall( + ktDefaultElement: KtElement, + receiver: ContextClassReceiver? +): IntermediateValue? = + receiver?.let { + generateContextReceiverForDelegatingConstructorCall( + ktDefaultElement.startOffsetSkippingComments, + ktDefaultElement.endOffset, + receiver + ) + } + +fun StatementGenerator.generateContextReceiverForDelegatingConstructorCall( + defaultStartOffset: Int, + defaultEndOffset: Int, + receiver: ContextClassReceiver +): IntermediateValue { + val irReceiverType = receiver.type.toIrType() + val contextReceivers = receiver.classDescriptor.contextReceivers + val receiverParameter = contextReceivers.single { it.value == receiver } + return object : ExpressionValue(irReceiverType) { + override fun load(): IrExpression = IrGetValueImpl( + defaultStartOffset, defaultEndOffset, irReceiverType, + context.symbolTable.referenceValueParameter(receiverParameter) + ) + } +} + fun StatementGenerator.generateReceiver(ktDefaultElement: KtElement, receiver: ReceiverValue): IntermediateValue = generateReceiver(ktDefaultElement.startOffsetSkippingComments, ktDefaultElement.endOffset, receiver) @@ -226,7 +254,7 @@ fun StatementGenerator.generateCallReceiver( dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver) extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver) contextReceiverValues = if (ktDefaultElement is KtConstructorDelegationCall) contextReceivers.mapNotNull { - generateReceiverOrNull(ktDefaultElement, it as ContextClassReceiver) + generateContextReceiverForDelegatingConstructorCall(ktDefaultElement, it as ContextClassReceiver) } else contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) } } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt index 50bfb062655..2b9a6ff1f4b 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/FunctionGenerator.kt @@ -288,6 +288,7 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio ) }.apply { metadata = DescriptorMetadataSource.Function(it.descriptor) + contextReceiverParametersCount = ktContextReceiversElements.size } }.buildWithScope { irConstructor -> generateValueParameterDeclarations(irConstructor, ktParametersElement, null, ktContextReceiversElements)