From 9ca5e1b42157ab85c28dbb56c6af197a063a96c8 Mon Sep 17 00:00:00 2001 From: Pavel Mikhailovskii Date: Tue, 27 Dec 2022 11:52:36 +0000 Subject: [PATCH] KT-54357 Fix passing of context receivers to object literal constructors --- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../generators/ArgumentsGenerationUtils.kt | 3 ++- .../contextReceivers/kt54357.kt | 20 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt54357.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index a41c1b4c812..40fb6a8e368 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -17540,6 +17540,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt53846.kt"); } + @Test + @TestMetadata("kt54357.kt") + public void testKt54357() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt54357.kt"); + } + @Test @TestMetadata("overload.kt") public void testOverload() throws Exception { 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 9f7997c205e..2592181a46e 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 @@ -263,7 +263,8 @@ fun StatementGenerator.generateCallReceiver( extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver) contextReceiverValues = when (ktDefaultElement) { is KtConstructorDelegationCall, is KtSuperTypeCallEntry -> contextReceivers.mapNotNull { - generateContextReceiverForDelegatingConstructorCall(ktDefaultElement, it as ContextClassReceiver) + if (it is ContextClassReceiver) generateContextReceiverForDelegatingConstructorCall(ktDefaultElement, it) + else generateReceiverOrNull(ktDefaultElement, it) } else -> contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) } } diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt54357.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt54357.kt new file mode 100644 index 00000000000..ed1366065e2 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt54357.kt @@ -0,0 +1,20 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR + +fun box(): String { + with(A()) { + object : B(){ + init { + foo() + } + } + } + return "OK" +} + +class A { + fun foo() {} +} + +context(A) +open class B \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 3d187f07e39..4a198020b2d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -17540,6 +17540,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt53846.kt"); } + @Test + @TestMetadata("kt54357.kt") + public void testKt54357() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/kt54357.kt"); + } + @Test @TestMetadata("overload.kt") public void testOverload() throws Exception {