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 42fc49121a5..74cf9609d52 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 @@ -229,6 +229,7 @@ public class JsInliner extends JsVisitorWithContextImpl { private void visit(@NotNull FunctionWithWrapper functionWithWrapper) { JsContext oldContextForInline = statementContextForInline; Map oldExistingImports = existingImports; + int oldInlineFunctionDepth = inlineFunctionDepth; ListContext innerContext = new ListContext<>(); @@ -238,6 +239,7 @@ public class JsInliner extends JsVisitorWithContextImpl { existingImports = new HashMap<>(); statementContexts.push(innerContext); statementContextForInline = innerContext; + inlineFunctionDepth++; for (JsStatement statement : wrapperBody.getStatements()) { processImportStatement(statement); @@ -268,14 +270,11 @@ public class JsInliner extends JsVisitorWithContextImpl { statementContextForInline = oldContextForInline; existingImports = oldExistingImports; + inlineFunctionDepth = oldInlineFunctionDepth; } @Override public boolean visit(@NotNull JsInvocation call, @NotNull JsContext context) { - if (InlineMetadata.decompose(call) != null) { - inlineFunctionDepth++; - } - if (!hasToBeInlined(call)) return true; JsFunction containingFunction = getCurrentNamedFunction(); @@ -294,9 +293,7 @@ public class JsInliner extends JsVisitorWithContextImpl { JsExpression argument = call.getArguments().get(i); call.getArguments().set(i, accept(argument)); } - inlineFunctionDepth++; visit(definition); - inlineFunctionDepth--; return false; } @@ -305,10 +302,6 @@ public class JsInliner extends JsVisitorWithContextImpl { @Override public void endVisit(@NotNull JsInvocation x, @NotNull JsContext ctx) { - if (InlineMetadata.decompose(x) != null) { - inlineFunctionDepth--; - } - if (hasToBeInlined(x)) { inline(x, ctx); } 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 431cb0973c1..183acf138e6 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 @@ -3875,6 +3875,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/inline/inlineChain.kt"); } + @TestMetadata("inlineChainCrossModule.kt") + public void testInlineChainCrossModule() throws Exception { + runTest("js/js.translator/testData/box/inline/inlineChainCrossModule.kt"); + } + @TestMetadata("inlineChainWithFewStatements.kt") public void testInlineChainWithFewStatements() throws Exception { runTest("js/js.translator/testData/box/inline/inlineChainWithFewStatements.kt"); @@ -3985,6 +3990,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/inline/kt26117.kt"); } + @TestMetadata("kt26466.kt") + public void testKt26466() throws Exception { + runTest("js/js.translator/testData/box/inline/kt26466.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 f5e80e5b612..6055cb95fc6 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 @@ -3875,6 +3875,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/inline/inlineChain.kt"); } + @TestMetadata("inlineChainCrossModule.kt") + public void testInlineChainCrossModule() throws Exception { + runTest("js/js.translator/testData/box/inline/inlineChainCrossModule.kt"); + } + @TestMetadata("inlineChainWithFewStatements.kt") public void testInlineChainWithFewStatements() throws Exception { runTest("js/js.translator/testData/box/inline/inlineChainWithFewStatements.kt"); @@ -3985,6 +3990,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/inline/kt26117.kt"); } + @TestMetadata("kt26466.kt") + public void testKt26466() throws Exception { + runTest("js/js.translator/testData/box/inline/kt26466.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/inlineChainCrossModule.kt b/js/js.translator/testData/box/inline/inlineChainCrossModule.kt new file mode 100644 index 00000000000..c4843b78adb --- /dev/null +++ b/js/js.translator/testData/box/inline/inlineChainCrossModule.kt @@ -0,0 +1,24 @@ +// EXPECTED_REACHABLE_NODES: 1192 +// IGNORE_BACKEND: JS_IR + +// MODULE: lib +// FILE: lib.kt + + +inline fun baz() = pp() + +fun pp(): String = "OK" + +// MODULE: mid(lib) +// FILE: mid.kt + +fun bar() { + foo() +} + +inline fun foo()= baz() + +// MODULE: main(mid) +// FILE: main.kt + +fun box() = foo() \ No newline at end of file diff --git a/js/js.translator/testData/box/inline/kt26466.kt b/js/js.translator/testData/box/inline/kt26466.kt new file mode 100644 index 00000000000..f4a39513ac7 --- /dev/null +++ b/js/js.translator/testData/box/inline/kt26466.kt @@ -0,0 +1,20 @@ +// EXPECTED_REACHABLE_NODES: 1269 +// IGNORE_BACKEND: JS_IR + +// MODULE: lib +// FILE: lib.kt + +class A(k: String) { + val ok = "O" + k +} + +inline fun o(k: String) = A(k).ok + +// MODULE: main(lib) +// FILE: main.kt + +class B { + val ok = run { o("K") } +} + +fun box() = B().ok \ No newline at end of file