JS: fix complex nested cross-module inlining (KT-26117 fixed)
This commit is contained in:
@@ -99,7 +99,6 @@ public class JsInliner extends JsVisitorWithContextImpl {
|
|||||||
inliner.additionalNameBindings.clear();
|
inliner.additionalNameBindings.clear();
|
||||||
inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment));
|
inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment));
|
||||||
|
|
||||||
inliner.inliningContexts.push(inliner.new JsInliningContext(inliner.new ListContext<JsStatement>()));
|
|
||||||
inliner.acceptStatement(fragment.getDeclarationBlock());
|
inliner.acceptStatement(fragment.getDeclarationBlock());
|
||||||
|
|
||||||
// There can be inlined function in top-level initializers, we need to optimize them as well
|
// 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);
|
inliner.accept(initWrapper);
|
||||||
initWrapper.getStatements().remove(initWrapper.getStatements().size() - 1);
|
initWrapper.getStatements().remove(initWrapper.getStatements().size() - 1);
|
||||||
|
|
||||||
inliner.inliningContexts.pop();
|
|
||||||
fragment.getInitializerBlock().getStatements().addAll(0, initWrapper.getStatements());
|
fragment.getInitializerBlock().getStatements().addAll(0, initWrapper.getStatements());
|
||||||
fragment.getNameBindings().addAll(inliner.additionalNameBindings);
|
fragment.getNameBindings().addAll(inliner.additionalNameBindings);
|
||||||
}
|
}
|
||||||
@@ -168,8 +166,16 @@ public class JsInliner extends JsVisitorWithContextImpl {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
startFunction(function);
|
if (statementContextForInline == null) {
|
||||||
return super.visit(function, context);
|
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) {
|
private void startFunction(@NotNull JsFunction function) {
|
||||||
JsContext<JsStatement> statementContext = statementContextForInline != null ? statementContextForInline :
|
inliningContexts.push(new JsInliningContext(statementContextForInline));
|
||||||
getLastStatementLevelContext();
|
|
||||||
|
|
||||||
inliningContexts.push(new JsInliningContext(statementContext));
|
|
||||||
|
|
||||||
assert !inProcessFunctions.contains(function): "Inliner has revisited function";
|
assert !inProcessFunctions.contains(function): "Inliner has revisited function";
|
||||||
inProcessFunctions.add(function);
|
inProcessFunctions.add(function);
|
||||||
@@ -247,9 +250,8 @@ public class JsInliner extends JsVisitorWithContextImpl {
|
|||||||
|
|
||||||
innerContext.traverse(statements);
|
innerContext.traverse(statements);
|
||||||
statementContexts.pop();
|
statementContexts.pop();
|
||||||
}
|
} else {
|
||||||
else {
|
if (statementContextForInline == null) statementContextForInline = getLastStatementLevelContext();
|
||||||
statementContextForInline = getLastStatementLevelContext();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
startFunction(functionWithWrapper.getFunction());
|
startFunction(functionWithWrapper.getFunction());
|
||||||
|
|||||||
+5
@@ -3970,6 +3970,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/inline/jsCodeVarDeclared.kt");
|
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")
|
@TestMetadata("lambdaInLambda.kt")
|
||||||
public void testLambdaInLambda() throws Exception {
|
public void testLambdaInLambda() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/inline/lambdaInLambda.kt");
|
runTest("js/js.translator/testData/box/inline/lambdaInLambda.kt");
|
||||||
|
|||||||
+5
@@ -3970,6 +3970,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/inline/jsCodeVarDeclared.kt");
|
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")
|
@TestMetadata("lambdaInLambda.kt")
|
||||||
public void testLambdaInLambda() throws Exception {
|
public void testLambdaInLambda() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/inline/lambdaInLambda.kt");
|
runTest("js/js.translator/testData/box/inline/lambdaInLambda.kt");
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
// EXPECTED_REACHABLE_NODES: 1529
|
||||||
|
// IGNORE_BACKEND: JS_IR
|
||||||
|
|
||||||
|
// TODO remove stdlib dependency
|
||||||
|
|
||||||
|
class A(val list: List<String>) {
|
||||||
|
init {
|
||||||
|
run {
|
||||||
|
list.map { it }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo() = list.map { it }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = A(listOf("OK")).foo().first()
|
||||||
Reference in New Issue
Block a user