K2: Update extension receiver after checking in CheckExtensionReceiver
fixes receiver selection when the candidate has more that one possible extension receiver #KT-62129 fixed
This commit is contained in:
committed by
Space Team
parent
56eedfebee
commit
141333bdcd
+6
@@ -18358,6 +18358,12 @@ public class FirLightTreeBlackBoxCodegenTestGenerated extends AbstractFirLightTr
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt");
|
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
|
@Nested
|
||||||
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+6
@@ -18358,6 +18358,12 @@ public class FirLightTreeBlackBoxCodegenWithIrFakeOverrideGeneratorTestGenerated
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt");
|
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
|
@Nested
|
||||||
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+6
@@ -18358,6 +18358,12 @@ public class FirPsiBlackBoxCodegenTestGenerated extends AbstractFirPsiBlackBoxCo
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt");
|
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
|
@Nested
|
||||||
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
@@ -126,6 +126,8 @@ object CheckExtensionReceiver : ResolutionStage() {
|
|||||||
isDispatch = false,
|
isDispatch = false,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
candidate.chosenExtensionReceiver = receiver.expression
|
||||||
|
|
||||||
sink.yieldIfNeed()
|
sink.yieldIfNeed()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Vendored
+12
@@ -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() } }
|
||||||
+6
@@ -18358,6 +18358,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt");
|
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
|
@Nested
|
||||||
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+6
@@ -18358,6 +18358,12 @@ public class IrBlackBoxCodegenWithIrInlinerTestGenerated extends AbstractIrBlack
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt");
|
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
|
@Nested
|
||||||
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
|||||||
+5
@@ -15234,6 +15234,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/extensionFunctions/contextReceivers/useFromAnotherModuleWithDefaultParameterValues.kt");
|
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")
|
@TestMetadata("compiler/testData/codegen/box/extensionFunctions/contextReceivers/fromKEEP")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
+9
-10
@@ -246,9 +246,12 @@ class ScriptingHostTest : TestCase() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testSimpleScriptWithImplicitReceiver() {
|
fun testImplicitReceiverWithExtensionProperty() {
|
||||||
val greeting = listOf("3")
|
// emulates the appropriate gradle kotlin dsl test
|
||||||
val script = "println(length)"
|
val script = """
|
||||||
|
val String.implicitReceiver get() = this
|
||||||
|
require(implicitReceiver is String)
|
||||||
|
""".trimIndent()
|
||||||
val definition = createJvmScriptDefinitionFromTemplate<SimpleScriptTemplate>(
|
val definition = createJvmScriptDefinitionFromTemplate<SimpleScriptTemplate>(
|
||||||
compilation = {
|
compilation = {
|
||||||
implicitReceivers(String::class)
|
implicitReceivers(String::class)
|
||||||
@@ -257,13 +260,9 @@ class ScriptingHostTest : TestCase() {
|
|||||||
implicitReceivers("abc")
|
implicitReceivers("abc")
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
val output = captureOut {
|
BasicJvmScriptingHost().eval(
|
||||||
val retVal = BasicJvmScriptingHost().eval(
|
script.toScriptSource(), definition.compilationConfiguration, definition.evaluationConfiguration
|
||||||
script.toScriptSource(), definition.compilationConfiguration, definition.evaluationConfiguration
|
).throwOnFailure()
|
||||||
).valueOrThrow().returnValue
|
|
||||||
if (retVal is ResultValue.Error) throw retVal.error
|
|
||||||
}.lines()
|
|
||||||
Assert.assertEquals(greeting, output)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testScriptWithImplicitReceiversWithSameShortName() {
|
fun testScriptWithImplicitReceiversWithSameShortName() {
|
||||||
|
|||||||
Reference in New Issue
Block a user