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:
Anton Bannykh
2018-12-11 23:40:05 +03:00
committed by Anton Bannykh
parent a0ff581a2f
commit 2cbdc7ecb0
11 changed files with 2073 additions and 419 deletions
@@ -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);
@@ -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(
}
}
}
}
}