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.
This commit is contained in:
committed by
Alexey Andreev
parent
ea8f3dcc65
commit
8f9fc100a3
@@ -38,6 +38,10 @@ public class SourceFilePathResolver {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private final Map<File, String> cache = new HashMap<>();
|
private final Map<File, String> cache = new HashMap<>();
|
||||||
|
|
||||||
|
public SourceFilePathResolver(@NotNull List<File> sourceRoots) {
|
||||||
|
this(sourceRoots, null);
|
||||||
|
}
|
||||||
|
|
||||||
public SourceFilePathResolver(@NotNull List<File> sourceRoots, @Nullable File outputDir) {
|
public SourceFilePathResolver(@NotNull List<File> sourceRoots, @Nullable File outputDir) {
|
||||||
this.sourceRoots = new HashSet<>();
|
this.sourceRoots = new HashSet<>();
|
||||||
for (File sourceRoot : sourceRoots) {
|
for (File sourceRoot : sourceRoots) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.builtins.FunctionTypesKt;
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor;
|
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.*;
|
||||||
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
|
import org.jetbrains.kotlin.js.backend.ast.metadata.MetadataProperties;
|
||||||
import org.jetbrains.kotlin.js.backend.ast.metadata.SideEffectKind;
|
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.js.translate.utils.*;
|
||||||
import org.jetbrains.kotlin.name.ClassId;
|
import org.jetbrains.kotlin.name.ClassId;
|
||||||
import org.jetbrains.kotlin.name.FqName;
|
import org.jetbrains.kotlin.name.FqName;
|
||||||
|
import org.jetbrains.kotlin.name.Name;
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext;
|
import org.jetbrains.kotlin.resolve.BindingContext;
|
||||||
import org.jetbrains.kotlin.resolve.BindingTrace;
|
import org.jetbrains.kotlin.resolve.BindingTrace;
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
import org.jetbrains.kotlin.resolve.DescriptorUtils;
|
||||||
@@ -54,6 +56,7 @@ import org.jetbrains.kotlin.types.typeUtil.TypeUtilsKt;
|
|||||||
|
|
||||||
import java.util.*;
|
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.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.isLibraryObject;
|
||||||
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject;
|
import static org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.isNativeObject;
|
||||||
@@ -141,6 +144,8 @@ public final class StaticContext {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private final SourceFilePathResolver sourceFilePathResolver;
|
private final SourceFilePathResolver sourceFilePathResolver;
|
||||||
|
|
||||||
|
private final boolean isStdlib;
|
||||||
|
|
||||||
public StaticContext(
|
public StaticContext(
|
||||||
@NotNull BindingTrace bindingTrace,
|
@NotNull BindingTrace bindingTrace,
|
||||||
@NotNull JsConfig config,
|
@NotNull JsConfig config,
|
||||||
@@ -163,6 +168,10 @@ public final class StaticContext {
|
|||||||
|
|
||||||
classModelGenerator = new ClassModelGenerator(TranslationContext.rootContext(this));
|
classModelGenerator = new ClassModelGenerator(TranslationContext.rootContext(this));
|
||||||
this.sourceFilePathResolver = sourceFilePathResolver;
|
this.sourceFilePathResolver = sourceFilePathResolver;
|
||||||
|
|
||||||
|
ClassDescriptor exceptionClass = findClassAcrossModuleDependencies(
|
||||||
|
moduleDescriptor, ClassId.topLevel(new FqName("kotlin.Exception")));
|
||||||
|
isStdlib = exceptionClass != null && DescriptorUtils.getContainingModule(exceptionClass) == moduleDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -840,9 +849,30 @@ public final class StaticContext {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public JsExpression getReferenceToIntrinsic(@NotNull String name) {
|
public JsExpression getReferenceToIntrinsic(@NotNull String name) {
|
||||||
JsName resultName = intrinsicNames.computeIfAbsent(name, k ->
|
JsName resultName = intrinsicNames.computeIfAbsent(name, k -> {
|
||||||
importDeclaration(NameSuggestion.sanitizeName(name), "intrinsic:" + name, TranslationUtils.getIntrinsicFqn(name)));
|
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);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
// EXPECTED_REACHABLE_NODES: 1003
|
// EXPECTED_REACHABLE_NODES: 1118
|
||||||
// LANGUAGE_VERSION: 1.1
|
// LANGUAGE_VERSION: 1.1
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,7 @@ compileKotlin2Js {
|
|||||||
outputFile = "${buildDir}/classes/main/kotlin.js"
|
outputFile = "${buildDir}/classes/main/kotlin.js"
|
||||||
sourceMap = true
|
sourceMap = true
|
||||||
sourceMapPrefix = "./"
|
sourceMapPrefix = "./"
|
||||||
|
freeCompilerArgs += [ "-source-map-base-dirs", [builtinsSrcDir, jsSrcDir, commonSrcDir ].join(File.pathSeparator) ]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user