JS: fix module parameter linking
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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()
|
||||
Reference in New Issue
Block a user