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) ] } }