K2 Scripting: fix implicit receivers resolution order

#KT-65975 fixed
This commit is contained in:
Ilya Chernikov
2024-01-10 17:14:38 +01:00
committed by Space Team
parent 1847485d28
commit 49559d2a5a
3 changed files with 69 additions and 1 deletions
@@ -26,7 +26,7 @@ fun SessionHolder.collectTowerDataElementsForScript(owner: FirScript): TowerElem
owner.symbol, receiver.typeRef.coneType, receiver.labelName, session, scopeSession,
contextReceiverNumber = index,
)
}
}.asReversed()
return TowerElementsForScript(
contextReceivers,
@@ -292,6 +292,61 @@ class ScriptingHostTest : TestCase() {
Assert.assertEquals(result, output)
}
fun testScriptWithImplicitReceiversWithSameNamedProperty() {
val result = listOf("first")
val script = "println(v)"
val definition = createJvmScriptDefinitionFromTemplate<SimpleScriptTemplate>(
compilation = {
updateClasspath(classpathFromClass<kotlin.script.experimental.jvmhost.test.forScript.TestClass1>())
implicitReceivers(
kotlin.script.experimental.jvmhost.test.forScript.TestClass1::class,
kotlin.script.experimental.jvmhost.test.forScript.TestClass2::class
)
},
evaluation = {
implicitReceivers(
kotlin.script.experimental.jvmhost.test.forScript.TestClass1("first"),
kotlin.script.experimental.jvmhost.test.forScript.TestClass2("second")
)
}
)
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(result, output)
}
fun testScriptWithImplicitReceiverAndBaseClassWithSameNamedProperty() {
val result = listOf("base")
val script = "println(v)"
val definition = createJvmScriptDefinitionFromTemplate<SimpleScriptTemplate>(
compilation = {
updateClasspath(classpathFromClass<kotlin.script.experimental.jvmhost.test.forScript.TestClass1>())
implicitReceivers(
kotlin.script.experimental.jvmhost.test.forScript.TestClass1::class
)
baseClass(
kotlin.script.experimental.jvmhost.test.forScript.Base::class
)
},
evaluation = {
implicitReceivers(
kotlin.script.experimental.jvmhost.test.forScript.TestClass1("receiver")
)
}
)
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(result, output)
}
fun testScriptImplicitReceiversTransitiveVisibility() {
val result = listOf("42")
val script = """
@@ -0,0 +1,13 @@
/*
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package kotlin.script.experimental.jvmhost.test.forScript
open class Base {
val v: String = "base"
}
class TestClass1(val v: String)
class TestClass2(val v: String)