From 8f9fc100a3829289cc9f3183f4b701aa9b2f39dc Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Mon, 9 Oct 2017 16:00:06 +0300 Subject: [PATCH] Fix compilation of JS stdlib 1. Don't import intrinsics when compiling stdlib, use declarations from current module instead 2. Add constructor with one argument to SourceFilePathResolver, to fix bootstrapping issues. 3. Pass correct source roots to compiler when building stdlib, since now we pass module root by default, while stdlib source roots are outside of module root. --- .../js/sourceMap/SourceFilePathResolver.java | 4 +++ .../js/translate/context/StaticContext.java | 34 +++++++++++++++++-- .../testData/box/reflection/primitives.kt | 2 +- libraries/stdlib/js/build.gradle | 1 + 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/sourceMap/SourceFilePathResolver.java b/js/js.translator/src/org/jetbrains/kotlin/js/sourceMap/SourceFilePathResolver.java index 62de6bc3d2f..7f10a1386ab 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/sourceMap/SourceFilePathResolver.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/sourceMap/SourceFilePathResolver.java @@ -38,6 +38,10 @@ public class SourceFilePathResolver { @NotNull private final Map cache = new HashMap<>(); + public SourceFilePathResolver(@NotNull List sourceRoots) { + this(sourceRoots, null); + } + public SourceFilePathResolver(@NotNull List sourceRoots, @Nullable File outputDir) { this.sourceRoots = new HashSet<>(); for (File sourceRoot : sourceRoots) { 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 1071efb092c..c8e9b39e4c3 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 @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.builtins.FunctionTypesKt; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor; +import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.js.backend.ast.*; import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties; import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind; @@ -42,6 +43,7 @@ import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics; import org.jetbrains.kotlin.js.translate.utils.*; import org.jetbrains.kotlin.name.ClassId; import org.jetbrains.kotlin.name.FqName; +import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.resolve.BindingContext; import org.jetbrains.kotlin.resolve.BindingTrace; import org.jetbrains.kotlin.resolve.DescriptorUtils; @@ -54,6 +56,7 @@ import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt; import java.util.*; +import static org.jetbrains.kotlin.descriptors.FindClassInModuleKt.findClassAcrossModuleDependencies; import static org.jetbrains.kotlin.js.config.JsConfig.UNKNOWN_EXTERNAL_MODULE_NAME; import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isLibraryObject; import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject; @@ -141,6 +144,8 @@ public final class StaticContext { @NotNull private final SourceFilePathResolver sourceFilePathResolver; + private final boolean isStdlib; + public StaticContext( @NotNull BindingTrace bindingTrace, @NotNull JsConfig config, @@ -163,6 +168,10 @@ public final class StaticContext { classModelGenerator = new ClassModelGenerator(TranslationContext.rootContext(this)); this.sourceFilePathResolver = sourceFilePathResolver; + + ClassDescriptor exceptionClass = findClassAcrossModuleDependencies( + moduleDescriptor, ClassId.topLevel(new FqName("kotlin.Exception"))); + isStdlib = exceptionClass != null && DescriptorUtils.getContainingModule(exceptionClass) == moduleDescriptor; } @NotNull @@ -840,9 +849,30 @@ public final class StaticContext { @NotNull public JsExpression getReferenceToIntrinsic(@NotNull String name) { - JsName resultName = intrinsicNames.computeIfAbsent(name, k -> - importDeclaration(NameSuggestion.sanitizeName(name), "intrinsic:" + name, TranslationUtils.getIntrinsicFqn(name))); + JsName resultName = intrinsicNames.computeIfAbsent(name, k -> { + if (isStdlib) { + DeclarationDescriptor descriptor = findDescriptorForIntrinsic(name); + if (descriptor != null) { + return getInnerNameForDescriptor(descriptor); + } + } + return importDeclaration(NameSuggestion.sanitizeName(name), "intrinsic:" + name, TranslationUtils.getIntrinsicFqn(name)); + }); return pureFqn(resultName, null); } + + @Nullable + private DeclarationDescriptor findDescriptorForIntrinsic(@NotNull String name) { + PackageViewDescriptor rootPackage = currentModule.getPackage(FqName.ROOT); + FunctionDescriptor functionDescriptor = DescriptorUtils.getFunctionByNameOrNull( + rootPackage.getMemberScope(), Name.identifier(name)); + if (functionDescriptor != null) return functionDescriptor; + + ClassifierDescriptor cls = rootPackage.getMemberScope().getContributedClassifier( + Name.identifier(name), NoLookupLocation.FROM_BACKEND); + if (cls != null) return cls; + + return null; + } } diff --git a/js/js.translator/testData/box/reflection/primitives.kt b/js/js.translator/testData/box/reflection/primitives.kt index dec20551521..328994fe24d 100644 --- a/js/js.translator/testData/box/reflection/primitives.kt +++ b/js/js.translator/testData/box/reflection/primitives.kt @@ -1,4 +1,4 @@ -// EXPECTED_REACHABLE_NODES: 1003 +// EXPECTED_REACHABLE_NODES: 1118 // LANGUAGE_VERSION: 1.1 import kotlin.reflect.KClass diff --git a/libraries/stdlib/js/build.gradle b/libraries/stdlib/js/build.gradle index addc2f7488a..7f6d878086e 100644 --- a/libraries/stdlib/js/build.gradle +++ b/libraries/stdlib/js/build.gradle @@ -128,6 +128,7 @@ compileKotlin2Js { outputFile = "${buildDir}/classes/main/kotlin.js" sourceMap = true sourceMapPrefix = "./" + freeCompilerArgs += [ "-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir ].join(File.pathSeparator) ] } }