KT-3008: when inlining functions from external modules, replace calls to functions in the external module via new mechanism instead of Kotlin.modules

This commit is contained in:
Alexey Andreev
2016-06-21 15:17:26 +03:00
parent f029b720e7
commit 055be070e9
3 changed files with 31 additions and 6 deletions
@@ -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("<inline>")))
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
@@ -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 ||
@@ -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);
}
}