JS: store whole JsImportedModule's in the module local alias
Module references were stored as plain JsName's. When inlining a function from one fragment to another, those references should be re-interpreted in terms of the destination fragment. Storing the whole module information makes that much easier.
This commit is contained in:
committed by
Anton Bannykh
parent
a0ff581a2f
commit
2cbdc7ecb0
@@ -107,6 +107,9 @@ public final class StaticContext {
|
||||
@NotNull
|
||||
private final ModuleDescriptor currentModule;
|
||||
|
||||
@NotNull
|
||||
private final JsImportedModule currentModuleAsImported;
|
||||
|
||||
@NotNull
|
||||
private final NameSuggestion nameSuggestion = new NameSuggestion();
|
||||
|
||||
@@ -171,6 +174,7 @@ public final class StaticContext {
|
||||
this.rootScope = fragment.getScope();
|
||||
this.config = config;
|
||||
this.currentModule = moduleDescriptor;
|
||||
this.currentModuleAsImported = new JsImportedModule(Namer.getRootPackageName(), rootScope.declareName(Namer.getRootPackageName()), null);
|
||||
|
||||
JsName kotlinName = rootScope.declareName(Namer.KOTLIN_NAME);
|
||||
createImportedModule(new JsImportedModuleKey(Namer.KOTLIN_LOWER_NAME, null), Namer.KOTLIN_LOWER_NAME, kotlinName, null);
|
||||
@@ -697,15 +701,21 @@ public final class StaticContext {
|
||||
|
||||
@Nullable
|
||||
private JsName getModuleInnerName(@NotNull DeclarationDescriptor descriptor) {
|
||||
JsImportedModule module = getJsImportedModuleModule(descriptor);
|
||||
return module == null ? null : module.getInternalName();
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public JsImportedModule getJsImportedModuleModule(@NotNull DeclarationDescriptor descriptor) {
|
||||
ModuleDescriptor module = DescriptorUtils.getContainingModule(descriptor);
|
||||
if (currentModule == module) {
|
||||
return rootScope.declareName(Namer.getRootPackageName());
|
||||
return currentModuleAsImported;
|
||||
}
|
||||
String moduleName = suggestModuleName(module);
|
||||
|
||||
if (UNKNOWN_EXTERNAL_MODULE_NAME.equals(moduleName)) return null;
|
||||
|
||||
return getImportedModule(moduleName, null).getInternalName();
|
||||
return getImportedModule(moduleName, null);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -830,11 +840,14 @@ public final class StaticContext {
|
||||
String moduleName = suggestModuleName(declaration);
|
||||
if (moduleName.equals(Namer.KOTLIN_LOWER_NAME)) return null;
|
||||
|
||||
return exportModuleForInline(moduleName, getInnerNameForDescriptor(declaration));
|
||||
JsImportedModule importedModule = getJsImportedModuleModule(declaration);
|
||||
if (importedModule == null) return null;
|
||||
|
||||
return exportModuleForInline(moduleName, importedModule);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public JsExpression exportModuleForInline(@NotNull String moduleId, @NotNull JsName moduleName) {
|
||||
public JsExpression exportModuleForInline(@NotNull String moduleId, @NotNull JsImportedModule moduleName) {
|
||||
JsExpression moduleRef = modulesImportedForInline.get(moduleId);
|
||||
if (moduleRef == null) {
|
||||
JsExpression currentModuleRef = pureFqn(getInnerNameForDescriptor(getCurrentModule()), null);
|
||||
@@ -853,7 +866,7 @@ public final class StaticContext {
|
||||
}
|
||||
MetadataProperties.setLocalAlias(moduleRef, moduleName);
|
||||
|
||||
JsExpressionStatement importStmt = new JsExpressionStatement(JsAstUtils.assignment(lhsModuleRef, moduleName.makeRef()));
|
||||
JsExpressionStatement importStmt = new JsExpressionStatement(JsAstUtils.assignment(lhsModuleRef, moduleName.getInternalName().makeRef()));
|
||||
MetadataProperties.setExportedTag(importStmt, "imports:" + moduleId);
|
||||
getFragment().getExportBlock().getStatements().add(importStmt);
|
||||
|
||||
|
||||
+5
-4
@@ -418,16 +418,17 @@ public class TranslationContext {
|
||||
SuggestedName suggested = staticContext.suggestName(descriptor);
|
||||
if (suggested != null && getConfig().getModuleKind() != ModuleKind.PLAIN && isPublicInlineFunction()) {
|
||||
String moduleId = AnnotationsUtils.getModuleName(suggested.getDescriptor());
|
||||
if (moduleId != null) {
|
||||
JsExpression replacement = staticContext.exportModuleForInline(moduleId, name);
|
||||
JsImportedModule importedModule = staticContext.getJsImportedModuleModule(suggested.getDescriptor());
|
||||
if (moduleId != null && importedModule != null) {
|
||||
JsExpression replacement = staticContext.exportModuleForInline(moduleId, importedModule);
|
||||
result = replaceModuleReference(result, name, replacement);
|
||||
}
|
||||
else if (isNativeObject(suggested.getDescriptor()) && DescriptorUtils.isTopLevelDeclaration(suggested.getDescriptor())) {
|
||||
String fileModuleId = AnnotationsUtils.getFileModuleName(bindingContext(), suggested.getDescriptor());
|
||||
if (fileModuleId != null) {
|
||||
JsName fileModuleName = staticContext.getImportedModule(fileModuleId, null).getInternalName();
|
||||
JsImportedModule fileModuleName = staticContext.getImportedModule(fileModuleId, null);
|
||||
JsExpression replacement = staticContext.exportModuleForInline(fileModuleId, fileModuleName);
|
||||
result = replaceModuleReference(staticContext.getQualifiedReference(descriptor), fileModuleName, replacement);
|
||||
result = replaceModuleReference(staticContext.getQualifiedReference(descriptor), fileModuleName.getInternalName(), replacement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,7 +198,12 @@ class Merger(
|
||||
}
|
||||
}
|
||||
if (node is JsExpression) {
|
||||
node.localAlias = node.localAlias?.let { rename(it) }
|
||||
node.localAlias = node.localAlias?.let {
|
||||
JsImportedModule(it.externalName,
|
||||
rename(it.internalName),
|
||||
it.plainReference?.let { rename(it) }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
@@ -352,4 +357,4 @@ class Merger(
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user