diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsCodeOutliningLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsCodeOutliningLowering.kt index 62c74bc1a21..d47dfbedbb3 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsCodeOutliningLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/JsCodeOutliningLowering.kt @@ -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 diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java index 2431469a3cd..f242ccc9e68 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java @@ -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"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 902c771bee4..10b4993e6e8 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -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"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 74d0097f158..b0085c52349 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -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"); diff --git a/js/js.translator/testData/box/jsCode/init.kt b/js/js.translator/testData/box/jsCode/init.kt new file mode 100644 index 00000000000..f53e8569146 --- /dev/null +++ b/js/js.translator/testData/box/jsCode/init.kt @@ -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 +} \ No newline at end of file