diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java index b96940b4f05..42fc49121a5 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/JsInliner.java @@ -99,7 +99,6 @@ public class JsInliner extends JsVisitorWithContextImpl { inliner.additionalNameBindings.clear(); inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment)); - inliner.inliningContexts.push(inliner.new JsInliningContext(inliner.new ListContext())); inliner.acceptStatement(fragment.getDeclarationBlock()); // There can be inlined function in top-level initializers, we need to optimize them as well @@ -109,7 +108,6 @@ public class JsInliner extends JsVisitorWithContextImpl { inliner.accept(initWrapper); initWrapper.getStatements().remove(initWrapper.getStatements().size() - 1); - inliner.inliningContexts.pop(); fragment.getInitializerBlock().getStatements().addAll(0, initWrapper.getStatements()); fragment.getNameBindings().addAll(inliner.additionalNameBindings); } @@ -168,8 +166,16 @@ public class JsInliner extends JsVisitorWithContextImpl { return false; } else { - startFunction(function); - return super.visit(function, context); + if (statementContextForInline == null) { + statementContextForInline = getLastStatementLevelContext(); + startFunction(function); + boolean result = super.visit(function, context); + statementContextForInline = null; + return result; + } else { + startFunction(function); + return super.visit(function, context); + } } } @@ -182,10 +188,7 @@ public class JsInliner extends JsVisitorWithContextImpl { } private void startFunction(@NotNull JsFunction function) { - JsContext statementContext = statementContextForInline != null ? statementContextForInline : - getLastStatementLevelContext(); - - inliningContexts.push(new JsInliningContext(statementContext)); + inliningContexts.push(new JsInliningContext(statementContextForInline)); assert !inProcessFunctions.contains(function): "Inliner has revisited function"; inProcessFunctions.add(function); @@ -247,9 +250,8 @@ public class JsInliner extends JsVisitorWithContextImpl { innerContext.traverse(statements); statementContexts.pop(); - } - else { - statementContextForInline = getLastStatementLevelContext(); + } else { + if (statementContextForInline == null) statementContextForInline = getLastStatementLevelContext(); } startFunction(functionWithWrapper.getFunction()); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 4a8facb06a2..847702a15f1 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3970,6 +3970,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/inline/jsCodeVarDeclared.kt"); } + @TestMetadata("kt26117.kt") + public void testKt26117() throws Exception { + runTest("js/js.translator/testData/box/inline/kt26117.kt"); + } + @TestMetadata("lambdaInLambda.kt") public void testLambdaInLambda() throws Exception { runTest("js/js.translator/testData/box/inline/lambdaInLambda.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java index 60d21c289d0..fc2e388fe9b 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java @@ -3970,6 +3970,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/inline/jsCodeVarDeclared.kt"); } + @TestMetadata("kt26117.kt") + public void testKt26117() throws Exception { + runTest("js/js.translator/testData/box/inline/kt26117.kt"); + } + @TestMetadata("lambdaInLambda.kt") public void testLambdaInLambda() throws Exception { runTest("js/js.translator/testData/box/inline/lambdaInLambda.kt"); diff --git a/js/js.translator/testData/box/inline/kt26117.kt b/js/js.translator/testData/box/inline/kt26117.kt new file mode 100644 index 00000000000..770b527e67b --- /dev/null +++ b/js/js.translator/testData/box/inline/kt26117.kt @@ -0,0 +1,16 @@ +// EXPECTED_REACHABLE_NODES: 1529 +// IGNORE_BACKEND: JS_IR + +// TODO remove stdlib dependency + +class A(val list: List) { + init { + run { + list.map { it } + } + } + + fun foo() = list.map { it } +} + +fun box() = A(listOf("OK")).foo().first() \ No newline at end of file