diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt index 2f88cc231a4..6afa46b140c 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/FunctionReader.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.js.parser.parseFunction import org.jetbrains.kotlin.js.translate.context.Namer import org.jetbrains.kotlin.js.translate.context.TranslationContext import org.jetbrains.kotlin.js.translate.reference.CallExpressionTranslator +import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsDescriptorUtils.getExternalModuleName import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.inline.InlineStrategy @@ -149,14 +150,18 @@ class FunctionReader(private val context: TranslationContext) { val function = parseFunction(source, offset, ThrowExceptionOnErrorReporter, JsRootScope(JsProgram(""))) val moduleName = getExternalModuleName(descriptor)!! - val moduleNameLiteral = context.program().getStringLiteral(moduleName) - val moduleReference = context.namer().getModuleReference(moduleNameLiteral) + val moduleReference = context.getModuleExpressionFor(descriptor) ?: getRootPackage() val replacements = hashMapOf(moduleRootVariable[moduleName]!! to moduleReference, moduleKotlinVariable[moduleName]!! to Namer.kotlinObject()) replaceExternalNames(function, replacements) return function } + + private fun getRootPackage(): JsExpression { + val rootName = context.program().rootScope.declareName(Namer.getRootPackageName()) + return JsAstUtils.fqnWithoutSideEffects(rootName, null) + } } private val Char.isWhitespaceOrComma: Boolean diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java index 4f55be55afe..30721c2b3b2 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/StaticContext.java @@ -545,10 +545,8 @@ public final class StaticContext { JsNameRef result = getQualifierForParentPackage(((PackageFragmentDescriptor) containingDescriptor).getFqName()); - String moduleName = getExternalModuleName(descriptor); - if (moduleName == null) { - return result; - } + JsExpression moduleExpression = getModuleExpressionFor(descriptor); + if (moduleExpression == null) return result; if (LibrarySourcesConfig.UNKNOWN_EXTERNAL_MODULE_NAME.equals(moduleName)) { return null; @@ -655,6 +653,23 @@ public final class StaticContext { } } + @Nullable + public JsExpression getModuleExpressionFor(@NotNull DeclarationDescriptor descriptor) { + String moduleName = getExternalModuleName(descriptor); + if (moduleName == null) return null; + + if (LibrarySourcesConfig.UNKNOWN_EXTERNAL_MODULE_NAME.equals(moduleName)) return null; + + JsName moduleId = moduleName.equals(Namer.KOTLIN_LOWER_NAME) ? rootScope.declareName(Namer.KOTLIN_NAME) : + importedModules.get(moduleName); + if (moduleId == null) { + moduleId = rootScope.declareFreshName(Namer.LOCAL_MODULE_PREFIX + Namer.suggestedModuleName(moduleName)); + importedModules.put(moduleName, moduleId); + } + + return JsAstUtils.fqnWithoutSideEffects(moduleId, null); + } + private static JsExpression applySideEffects(JsExpression expression, DeclarationDescriptor descriptor) { if (expression instanceof HasMetadata) { if (descriptor instanceof FunctionDescriptor || diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java index efc46a1db80..4c873e59647 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/context/TranslationContext.java @@ -544,4 +544,9 @@ public class TranslationContext { "reports true for given constructor: " + constructor); callSites.add(new DeferredCallSite(constructor, invocationArgs, this)); } + + @Nullable + public JsExpression getModuleExpressionFor(@NotNull DeclarationDescriptor descriptor) { + return staticContext.getModuleExpressionFor(descriptor); + } }