From 141333bdcd22c9d257d88dbce50fa8499206a0f8 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Thu, 21 Sep 2023 17:04:02 +0200 Subject: [PATCH] K2: Update extension receiver after checking in CheckExtensionReceiver fixes receiver selection when the candidate has more that one possible extension receiver #KT-62129 fixed --- ...LightTreeBlackBoxCodegenTestGenerated.java | 6 ++++++ ...hIrFakeOverrideGeneratorTestGenerated.java | 6 ++++++ .../FirPsiBlackBoxCodegenTestGenerated.java | 6 ++++++ .../fir/resolve/calls/ResolutionStages.kt | 2 ++ .../withTwoContextReceivers.kt | 12 ++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ ...kBoxCodegenWithIrInlinerTestGenerated.java | 6 ++++++ .../LightAnalysisModeTestGenerated.java | 5 +++++ .../jvmhost/test/ScriptingHostTest.kt | 19 +++++++++---------- 9 files changed, 58 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java index fab5a61ae2c..f733224f73d 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenTestGenerated.java @@ -18358,6 +18358,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt"); } + @Test + @TestMetadata("withTwoContextReceivers.kt") + public void testWithTwoContextReceivers() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java index 9c3b568b296..5618df12c19 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated.java @@ -18358,6 +18358,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt"); } + @Test + @TestMetadata("withTwoContextReceivers.kt") + public void testWithTwoContextReceivers() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java index 4662a7b30b9..75c560eca88 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirPsiBlackBoxCodegenTestGenerated.java @@ -18358,6 +18358,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt"); } + @Test + @TestMetadata("withTwoContextReceivers.kt") + public void testWithTwoContextReceivers() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index 00fea07efbc..c8b3d870a86 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -126,6 +126,8 @@ object CheckExtensionReceiver : ResolutionStage() { isDispatch = false, ) + candidate.chosenExtensionReceiver = receiver.expression + sink.yieldIfNeed() } diff --git a/compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt new file mode 100644 index 00000000000..d0bbdda7ff4 --- /dev/null +++ b/compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt @@ -0,0 +1,12 @@ +// !LANGUAGE: +ContextReceivers +// TARGET_BACKEND: JVM_IR + +class A { val o = "O" } +class B { val k = "K" } + +val A.bar get() = o + +context(A, B) +fun ok() = bar + k + +fun box(): String = with(A()) { with(B()) { ok() } } 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 fd318ffef8f..080e45ab097 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 @@ -18358,6 +18358,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt"); } + @Test + @TestMetadata("withTwoContextReceivers.kt") + public void testWithTwoContextReceivers() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java index 17b0aedfec1..f5912779903 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenWithIrInlinerTestGenerated.java @@ -18358,6 +18358,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt"); } + @Test + @TestMetadata("withTwoContextReceivers.kt") + public void testWithTwoContextReceivers() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt"); + } + @Nested @TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index a1de396d866..81e49be185b 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -15234,6 +15234,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt"); } + @TestMetadata("withTwoContextReceivers.kt") + public void testWithTwoContextReceivers() throws Exception { + runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/withTwoContextReceivers.kt"); + } + @TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt index 73635f10b81..ac3db61855b 100644 --- a/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt +++ b/libraries/scripting/jvm-host-test/test/kotlin/script/experimental/jvmhost/test/ScriptingHostTest.kt @@ -246,9 +246,12 @@ class ScriptingHostTest : TestCase() { } @Test - fun testSimpleScriptWithImplicitReceiver() { - val greeting = listOf("3") - val script = "println(length)" + fun testImplicitReceiverWithExtensionProperty() { + // emulates the appropriate gradle kotlin dsl test + val script = """ + val String.implicitReceiver get() = this + require(implicitReceiver is String) + """.trimIndent() val definition = createJvmScriptDefinitionFromTemplate( compilation = { implicitReceivers(String::class) @@ -257,13 +260,9 @@ class ScriptingHostTest : TestCase() { implicitReceivers("abc") } ) - val output = captureOut { - val retVal = BasicJvmScriptingHost().eval( - script.toScriptSource(), definition.compilationConfiguration, definition.evaluationConfiguration - ).valueOrThrow().returnValue - if (retVal is ResultValue.Error) throw retVal.error - }.lines() - Assert.assertEquals(greeting, output) + BasicJvmScriptingHost().eval( + script.toScriptSource(), definition.compilationConfiguration, definition.evaluationConfiguration + ).throwOnFailure() } fun testScriptWithImplicitReceiversWithSameShortName() {