JS: fix module parameter linking

This commit is contained in:
Anton Bannykh
2018-10-26 14:29:45 +03:00
parent da02acd6e9
commit 4c5201d30e
5 changed files with 63 additions and 1 deletions
@@ -69,6 +69,8 @@ public class JsInliner extends JsVisitorWithContextImpl {
private final List<JsNameBinding> additionalNameBindings = new ArrayList<>();
private final Set<JsName> inlinedModuleAliases = new HashSet<>();
public static void process(
@NotNull JsConfig.Reporter reporter,
@NotNull JsConfig config,
@@ -94,9 +96,12 @@ public class JsInliner extends JsVisitorWithContextImpl {
inliner.processImportStatement(statement);
}
Map<JsName, JsImportedModule> moduleMap = fillModuleMap(buildModuleMap(fragments), fragmentsToProcess);
for (JsProgramFragment fragment : fragmentsToProcess) {
inliner.existingImports.clear();
inliner.additionalNameBindings.clear();
inliner.inlinedModuleAliases.clear();
inliner.existingNameBindings = CollectUtilsKt.collectNameBindings(Collections.singletonList(fragment));
inliner.acceptStatement(fragment.getDeclarationBlock());
@@ -110,6 +115,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
fragment.getInitializerBlock().getStatements().addAll(0, initWrapper.getStatements());
fragment.getNameBindings().addAll(inliner.additionalNameBindings);
inliner.addInlinedModules(fragment, moduleMap);
}
for (JsProgramFragment fragment : fragmentsToProcess) {
@@ -120,6 +126,29 @@ public class JsInliner extends JsVisitorWithContextImpl {
}
}
private void addInlinedModules(JsProgramFragment fragment, Map<JsName, JsImportedModule> moduleMap) {
Set<JsName> localMap = buildModuleMap(Collections.singletonList(fragment)).keySet();
for (JsName inlinedModuleName : inlinedModuleAliases) {
if (!localMap.contains(inlinedModuleName)) {
fragment.getImportedModules().add(moduleMap.get(inlinedModuleName));
}
}
}
private static Map<JsName, JsImportedModule> buildModuleMap(List<JsProgramFragment> fragments) {
return fillModuleMap(new HashMap<>(), fragments);
}
private static Map<JsName, JsImportedModule> fillModuleMap(Map<JsName, JsImportedModule> map, List<JsProgramFragment> fragments) {
for (JsProgramFragment fragment : fragments) {
for (JsImportedModule module : fragment.getImportedModules()) {
map.put(module.getInternalName(), module);
}
}
return map;
}
private JsInliner(
@NotNull JsConfig config,
@NotNull Map<JsName, FunctionWithWrapper> functions,
@@ -489,7 +518,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
}
}
private static void replaceExpressionsWithLocalAliases(@NotNull JsStatement statement) {
private void replaceExpressionsWithLocalAliases(@NotNull JsStatement statement) {
new JsVisitorWithContextImpl() {
@Override
public void endVisit(@NotNull JsNameRef x, @NotNull JsContext ctx) {
@@ -507,6 +536,7 @@ public class JsInliner extends JsVisitorWithContextImpl {
@SuppressWarnings("unchecked")
JsContext<JsNode> context = (JsContext) ctx;
context.replaceMe(alias.makeRef());
inlinedModuleAliases.add(alias);
}
}
@@ -3523,6 +3523,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
runTest("js/js.translator/testData/box/incremental/inlineLambda.kt");
}
@TestMetadata("inlineModuleVariable.kt")
public void testInlineModuleVariable() throws Exception {
runTest("js/js.translator/testData/box/incremental/inlineModuleVariable.kt");
}
@TestMetadata("jsModule.kt")
public void testJsModule() throws Exception {
runTest("js/js.translator/testData/box/incremental/jsModule.kt");
@@ -3523,6 +3523,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
runTest("js/js.translator/testData/box/incremental/inlineLambda.kt");
}
@TestMetadata("inlineModuleVariable.kt")
public void testInlineModuleVariable() throws Exception {
runTest("js/js.translator/testData/box/incremental/inlineModuleVariable.kt");
}
@TestMetadata("jsModule.kt")
public void testJsModule() throws Exception {
runTest("js/js.translator/testData/box/incremental/jsModule.kt");
@@ -156,6 +156,9 @@ class Merger(private val rootFunction: JsFunction, val internalModuleName: JsNam
)
}
}
if (node is JsExpression) {
node.localAlias = node.localAlias?.let { rename(it) }
}
}
})
return rootNode
@@ -0,0 +1,19 @@
// EXPECTED_REACHABLE_NODES: 1282
// MODULE: lib
// FILE: lib.kt
fun foo() = "OK"
// MODULE: main(lib)
// FILE: mainAux.kt
inline fun proxy() = foo()
// FILE: mainDummy.kt
// RECOMPILE
val dummy get() = js("\$module\$lib")
// FILE: main.kt
fun box() = proxy()