[Scripting] fix receiver substitution in script JVM IR lowering

This commit is contained in:
Ilya Chernikov
2021-05-31 12:19:10 +02:00
committed by teamcityserver
parent a7b94b398a
commit 32b6cfe2ea
2 changed files with 17 additions and 7 deletions
@@ -494,15 +494,10 @@ private class ScriptToClassTransformer(
if (irScript.earlierScripts != null) {
val target = expression.symbol.owner
val receiver: IrValueParameter? = target.dispatchReceiverParameter
if (target.origin == IrDeclarationOrigin.DEFAULT_PROPERTY_ACCESSOR && receiver?.name == Name.special("<this>")) {
if (receiver?.name == Name.special("<this>")) {
val newReceiver = getAccessCallForEarlierScript(expression, receiver.type)
if (newReceiver != null) {
val builder = context.createIrBuilder(expression.symbol)
val newCall = builder.irCall(expression.symbol, target.returnType, origin = expression.origin).also {
it.copyTypeAndValueArgumentsFrom(expression)
it.dispatchReceiver = newReceiver
}
return super.visitCall(newCall)
expression.dispatchReceiver = newReceiver
}
}
}
@@ -146,6 +146,21 @@ class ReplTest : TestCase() {
)
}
@Test
// TODO: make it covering more cases
fun testIrReceiverOvewrite() {
checkEvaluateInRepl(
sequenceOf(
"fun f(a: String) = a",
"f(\"x\")"
),
sequenceOf(
null,
"x"
)
)
}
@Test
fun testNoEvaluationError() {
checkEvaluateInReplDiags(