[JS IR] Not cast to declaration parent in JsCodeOutlineLowering, use parent otherwise

^KT-45057 fixed
This commit is contained in:
Ilya Goncharov
2021-02-19 17:28:17 +03:00
parent bd2601f289
commit 187d4998fa
5 changed files with 42 additions and 1 deletions
@@ -30,12 +30,14 @@ import org.jetbrains.kotlin.ir.expressions.IrContainerExpression
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.util.constructors
import org.jetbrains.kotlin.ir.util.dumpKotlinLike
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
import org.jetbrains.kotlin.js.backend.ast.*
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addIfNotNull
import java.lang.IllegalStateException
// Outlines `kotlin.js.js(code: String)` calls where JS code references Kotlin locals.
// Makes locals usages explicit.
@@ -164,7 +166,10 @@ private class JsCodeOutlineTransformer(
}
// We don't need this function's body. Using empty block body stub, because some code might expect all functions to have bodies.
outlinedFunction.body = backendContext.irFactory.createBlockBody(UNDEFINED_OFFSET, UNDEFINED_OFFSET)
outlinedFunction.parent = container as IrDeclarationParent
outlinedFunction.parent = when (container) {
is IrDeclarationParent -> container
else -> container.parent
}
kotlinLocalsUsedInJs.forEach { local ->
outlinedFunction.addValueParameter {
name = local.name
@@ -5105,6 +5105,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
runTest("js/js.translator/testData/box/jsCode/if.kt");
}
@TestMetadata("init.kt")
public void testInit() throws Exception {
runTest("js/js.translator/testData/box/jsCode/init.kt");
}
@TestMetadata("invocation.kt")
public void testInvocation() throws Exception {
runTest("js/js.translator/testData/box/jsCode/invocation.kt");
@@ -5105,6 +5105,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
runTest("js/js.translator/testData/box/jsCode/if.kt");
}
@TestMetadata("init.kt")
public void testInit() throws Exception {
runTest("js/js.translator/testData/box/jsCode/init.kt");
}
@TestMetadata("invocation.kt")
public void testInvocation() throws Exception {
runTest("js/js.translator/testData/box/jsCode/invocation.kt");
@@ -5120,6 +5120,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
runTest("js/js.translator/testData/box/jsCode/if.kt");
}
@TestMetadata("init.kt")
public void testInit() throws Exception {
runTest("js/js.translator/testData/box/jsCode/init.kt");
}
@TestMetadata("invocation.kt")
public void testInvocation() throws Exception {
runTest("js/js.translator/testData/box/jsCode/invocation.kt");
+21
View File
@@ -0,0 +1,21 @@
// EXPECTED_REACHABLE_NODES: 1282
package foo
class A {
var ok: String
init {
var ok = "fail"
ok = js(
"""
ok = 'OK'
return ok
"""
)
this.ok = ok
}
}
fun box(): String {
return A().ok
}