Deserialize built-ins
This commit is contained in:
committed by
Alexander Udalov
parent
defbf705fc
commit
b7966179f5
@@ -125,7 +125,7 @@ public class JetCoreEnvironment {
|
|||||||
|
|
||||||
JetScriptDefinitionProvider.getInstance(project).addScriptDefinitions(configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY));
|
JetScriptDefinitionProvider.getInstance(project).addScriptDefinitions(configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY));
|
||||||
|
|
||||||
KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.SINGLE_THREADED);
|
KotlinBuiltIns.initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
public CompilerConfiguration getConfiguration() {
|
public CompilerConfiguration getConfiguration() {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/generator" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/generator" isTestSource="false" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/builtins" isTestSource="false" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="inheritedJdk" />
|
<orderEntry type="inheritedJdk" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
|||||||
+89
@@ -0,0 +1,89 @@
|
|||||||
|
package org.jetbrains.jet.descriptors.serialization.descriptors;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.ClassId;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.ClassResolver;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.DescriptorDeserializer;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.ProtoBuf;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public abstract class DeserializedPackageMemberScope extends DeserializedMemberScope {
|
||||||
|
|
||||||
|
private final ClassResolver classResolver;
|
||||||
|
private final FqName packageFqName;
|
||||||
|
|
||||||
|
public DeserializedPackageMemberScope(
|
||||||
|
@NotNull NamespaceDescriptor packageDescriptor,
|
||||||
|
@NotNull DescriptorDeserializer deserializer,
|
||||||
|
@NotNull List<ProtoBuf.Callable> membersList,
|
||||||
|
ClassResolver classResolver
|
||||||
|
) {
|
||||||
|
super(packageDescriptor, deserializer, membersList);
|
||||||
|
this.classResolver = classResolver;
|
||||||
|
this.packageFqName = DescriptorUtils.getFQName(packageDescriptor).toSafe();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
protected ClassifierDescriptor getClassDescriptor(@NotNull Name name) {
|
||||||
|
return findClassDescriptor(name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public ClassDescriptor getObjectDescriptor(@NotNull Name name) {
|
||||||
|
return findClassDescriptor(name, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private ClassDescriptor findClassDescriptor(Name name, boolean object) {
|
||||||
|
ClassDescriptor classDescriptor = classResolver.findClass(new ClassId(packageFqName, FqNameUnsafe.topLevel(name)));
|
||||||
|
if (classDescriptor == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return classDescriptor.getKind().isObject() == object ? classDescriptor : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addAllClassDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
|
||||||
|
findClassifiers(result, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected Collection<ClassDescriptor> computeAllObjectDescriptors() {
|
||||||
|
return findClassifiers(new ArrayList<ClassDescriptor>(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private <T extends Collection<? super ClassDescriptor>> T findClassifiers(T result, boolean object) {
|
||||||
|
for (Name className : getClassNames()) {
|
||||||
|
ClassDescriptor classDescriptor = (ClassDescriptor) getClassDescriptor(className);
|
||||||
|
assert classDescriptor != null : "Class not found: " + className;
|
||||||
|
|
||||||
|
if (classDescriptor.getKind().isObject() == object) {
|
||||||
|
result.add(classDescriptor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
protected abstract Collection<Name> getClassNames();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addNonDeclaredDescriptors(@NotNull Collection<DeclarationDescriptor> result) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
+183
@@ -0,0 +1,183 @@
|
|||||||
|
package org.jetbrains.jet.lang.types.lang;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.*;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.descriptors.AnnotationDeserializer;
|
||||||
|
import org.jetbrains.jet.descriptors.serialization.descriptors.DeserializedPackageMemberScope;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.impl.AbstractNamespaceDescriptorImpl;
|
||||||
|
import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValue;
|
||||||
|
import org.jetbrains.jet.lang.resolve.lazy.storage.NotNullLazyValueImpl;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
|
|
||||||
|
import java.io.DataInputStream;
|
||||||
|
import java.io.EOFException;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
class BuiltinsNamespaceDescriptorImpl extends AbstractNamespaceDescriptorImpl {
|
||||||
|
|
||||||
|
private final DeserializedPackageMemberScope members;
|
||||||
|
private final NameResolver nameResolver;
|
||||||
|
|
||||||
|
public BuiltinsNamespaceDescriptorImpl(@NotNull NamespaceDescriptor containingDeclaration) {
|
||||||
|
super(containingDeclaration, Collections.<AnnotationDescriptor>emptyList(), KotlinBuiltIns.BUILT_INS_PACKAGE_NAME);
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
nameResolver =
|
||||||
|
NameSerializationUtil.deserializeNameResolver(getStream(BuiltInsSerializationUtil.getNameTableFilePath(this)));
|
||||||
|
|
||||||
|
ClassResolver classResolver = new AbstractClassResolver(AnnotationDeserializer.UNSUPPORTED) {
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
protected ClassData getClassData(@NotNull ClassId classId) {
|
||||||
|
InputStream stream = getStreamNullable(BuiltInsSerializationUtil.getClassMetadataPath(classId));
|
||||||
|
if (stream == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
ProtoBuf.Class classProto = ProtoBuf.Class.parseFrom(stream);
|
||||||
|
|
||||||
|
Name expectedShortName = classId.getRelativeClassName().shortName();
|
||||||
|
Name actualShortName = nameResolver.getName(classProto.getName());
|
||||||
|
if (!actualShortName.isSpecial() && !actualShortName.equals(expectedShortName)) {
|
||||||
|
// Workaround for case-insensitive file systems,
|
||||||
|
// otherwise we'd find "Collection" for "collection" etc
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ClassData(nameResolver, classProto);
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected DeclarationDescriptor getPackage(@NotNull FqName fqName) {
|
||||||
|
assert fqName.equals(KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME) : "Wrong package: " + fqName;
|
||||||
|
return BuiltinsNamespaceDescriptorImpl.this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected ClassId getClassId(@NotNull ClassDescriptor classDescriptor) {
|
||||||
|
return BuiltInsSerializationUtil.getClassId(classDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected Name getClassObjectName(@NotNull ClassDescriptor outerClass) {
|
||||||
|
return BuiltInsSerializationUtil.CLASS_OBJECT_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void classDescriptorCreated(@NotNull ClassDescriptor classDescriptor) {
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
};
|
||||||
|
members = new DeserializedPackageMemberScope(
|
||||||
|
this,
|
||||||
|
DescriptorDeserializer.create(this, nameResolver, classResolver, AnnotationDeserializer.UNSUPPORTED),
|
||||||
|
loadCallables(), classResolver
|
||||||
|
) {
|
||||||
|
private final NotNullLazyValue<Collection<Name>> classNames = new NotNullLazyValueImpl<Collection<Name>>() {
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected Collection<Name> doCompute() {
|
||||||
|
InputStream namesStream =
|
||||||
|
getStream(BuiltInsSerializationUtil.getClassNamesFilePath(BuiltinsNamespaceDescriptorImpl.this));
|
||||||
|
List<Name> result = new ArrayList<Name>();
|
||||||
|
try {
|
||||||
|
DataInputStream data = new DataInputStream(namesStream);
|
||||||
|
while (true) {
|
||||||
|
result.add(nameResolver.getName(data.readInt()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (EOFException e) {
|
||||||
|
// OK: finishing the loop
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
protected Collection<Name> getClassNames() {
|
||||||
|
return classNames.compute();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
protected ReceiverParameterDescriptor getImplicitReceiver() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (IOException e) {
|
||||||
|
throw new IllegalStateException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<ProtoBuf.Callable> loadCallables() throws IOException {
|
||||||
|
String packageFilePath = BuiltInsSerializationUtil.getPackageFilePath(this);
|
||||||
|
InputStream stream = getStream(packageFilePath);
|
||||||
|
|
||||||
|
List<ProtoBuf.Callable> callables = new ArrayList<ProtoBuf.Callable>();
|
||||||
|
while (true) {
|
||||||
|
ProtoBuf.Callable callable = ProtoBuf.Callable.parseDelimitedFrom(stream);
|
||||||
|
if (callable == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
callables.add(callable);
|
||||||
|
}
|
||||||
|
return callables;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public JetScope getMemberScope() {
|
||||||
|
return members;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public FqName getFqName() {
|
||||||
|
return KotlinBuiltIns.BUILT_INS_PACKAGE_FQ_NAME;
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private static InputStream getStream(@NotNull String path) {
|
||||||
|
InputStream stream = getStreamNullable(path);
|
||||||
|
if (stream == null) {
|
||||||
|
throw new IllegalStateException("Resource not found in classpath: " + path);
|
||||||
|
}
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static InputStream getStreamNullable(@NotNull String path) {
|
||||||
|
return KotlinBuiltIns.class.getClassLoader().getResourceAsStream(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2013 JetBrains s.r.o.
|
* Copyright 2010-2012 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -16,18 +16,12 @@
|
|||||||
|
|
||||||
package org.jetbrains.jet.lang.types.lang;
|
package org.jetbrains.jet.lang.types.lang;
|
||||||
|
|
||||||
import com.google.common.base.Predicates;
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import com.intellij.openapi.application.ApplicationManager;
|
import com.intellij.openapi.application.ApplicationManager;
|
||||||
import com.intellij.openapi.progress.ProcessCanceledException;
|
|
||||||
import com.intellij.openapi.project.Project;
|
import com.intellij.openapi.project.Project;
|
||||||
import com.intellij.openapi.util.io.FileUtil;
|
import com.intellij.openapi.util.io.FileUtil;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
|
||||||
import com.intellij.openapi.vfs.StandardFileSystems;
|
import com.intellij.openapi.vfs.StandardFileSystems;
|
||||||
import com.intellij.psi.PsiFileFactory;
|
|
||||||
import com.intellij.util.LocalTimeCounter;
|
|
||||||
import com.intellij.util.PathUtil;
|
import com.intellij.util.PathUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -37,21 +31,18 @@ import org.jetbrains.jet.lang.ModuleConfiguration;
|
|||||||
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
|
import org.jetbrains.jet.lang.PlatformToKotlinClassMap;
|
||||||
import org.jetbrains.jet.lang.descriptors.*;
|
import org.jetbrains.jet.lang.descriptors.*;
|
||||||
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.impl.NamespaceDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.impl.ValueParameterDescriptorImpl;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetPsiUtil;
|
||||||
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
|
|
||||||
import org.jetbrains.jet.lang.resolve.BindingTraceContext;
|
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
|
import org.jetbrains.jet.lang.resolve.lazy.KotlinCodeAnalyzer;
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.ResolveSession;
|
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.declarations.FileBasedDeclarationProviderFactory;
|
|
||||||
import org.jetbrains.jet.lang.resolve.lazy.storage.LockBasedStorageManager;
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqName;
|
import org.jetbrains.jet.lang.resolve.name.FqName;
|
||||||
import org.jetbrains.jet.lang.resolve.name.FqNameUnsafe;
|
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.RedeclarationHandler;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScope;
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
import org.jetbrains.jet.plugin.JetFileType;
|
|
||||||
import org.jetbrains.jet.utils.ExceptionUtils;
|
import org.jetbrains.jet.utils.ExceptionUtils;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
@@ -69,28 +60,9 @@ public class KotlinBuiltIns {
|
|||||||
|
|
||||||
public static final String BUILT_INS_DIR = "jet";
|
public static final String BUILT_INS_DIR = "jet";
|
||||||
public static final String BUILT_INS_PACKAGE_NAME_STRING = "jet";
|
public static final String BUILT_INS_PACKAGE_NAME_STRING = "jet";
|
||||||
private static final Name BUILT_INS_PACKAGE_NAME = Name.identifier(BUILT_INS_PACKAGE_NAME_STRING);
|
/* package */ static final Name BUILT_INS_PACKAGE_NAME = Name.identifier(BUILT_INS_PACKAGE_NAME_STRING);
|
||||||
public static final FqName BUILT_INS_PACKAGE_FQ_NAME = FqName.topLevel(BUILT_INS_PACKAGE_NAME);
|
public static final FqName BUILT_INS_PACKAGE_FQ_NAME = FqName.topLevel(BUILT_INS_PACKAGE_NAME);
|
||||||
|
|
||||||
private static final List<String> LIBRARY_FILES = Arrays.asList(
|
|
||||||
BUILT_INS_DIR + "/Library.jet",
|
|
||||||
BUILT_INS_DIR + "/Numbers.jet",
|
|
||||||
BUILT_INS_DIR + "/Ranges.jet",
|
|
||||||
BUILT_INS_DIR + "/Progressions.jet",
|
|
||||||
BUILT_INS_DIR + "/Iterators.jet",
|
|
||||||
BUILT_INS_DIR + "/Arrays.jet",
|
|
||||||
BUILT_INS_DIR + "/Enum.jet",
|
|
||||||
BUILT_INS_DIR + "/Collections.jet",
|
|
||||||
BUILT_INS_DIR + "/Any.jet",
|
|
||||||
BUILT_INS_DIR + "/ExtensionFunctions.jet",
|
|
||||||
BUILT_INS_DIR + "/Functions.jet",
|
|
||||||
BUILT_INS_DIR + "/KFunctions.jet",
|
|
||||||
BUILT_INS_DIR + "/KMemberFunctions.jet",
|
|
||||||
BUILT_INS_DIR + "/KExtensionFunctions.jet",
|
|
||||||
BUILT_INS_DIR + "/Nothing.jet",
|
|
||||||
BUILT_INS_DIR + "/Unit.jet"
|
|
||||||
);
|
|
||||||
|
|
||||||
public static final int FUNCTION_TRAIT_COUNT = 23;
|
public static final int FUNCTION_TRAIT_COUNT = 23;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -100,16 +72,9 @@ public class KotlinBuiltIns {
|
|||||||
private static volatile boolean initializing;
|
private static volatile boolean initializing;
|
||||||
private static Throwable initializationFailed;
|
private static Throwable initializationFailed;
|
||||||
|
|
||||||
public enum InitializationMode {
|
|
||||||
// Multi-threaded mode is used in the IDE
|
|
||||||
MULTI_THREADED,
|
|
||||||
// Single-threaded mode is used in the compiler and IDE-independent tests
|
|
||||||
SINGLE_THREADED
|
|
||||||
}
|
|
||||||
|
|
||||||
// This method must be called at least once per application run, on any project
|
// This method must be called at least once per application run, on any project
|
||||||
// before any type checking is run
|
// before any type checking is run
|
||||||
public static synchronized void initialize(@NotNull Project project, @NotNull InitializationMode initializationMode) {
|
public static synchronized void initialize() {
|
||||||
if (instance == null) {
|
if (instance == null) {
|
||||||
if (initializationFailed != null) {
|
if (initializationFailed != null) {
|
||||||
throw new RuntimeException(
|
throw new RuntimeException(
|
||||||
@@ -120,8 +85,8 @@ public class KotlinBuiltIns {
|
|||||||
}
|
}
|
||||||
initializing = true;
|
initializing = true;
|
||||||
try {
|
try {
|
||||||
instance = new KotlinBuiltIns(project);
|
instance = new KotlinBuiltIns();
|
||||||
instance.initialize(initializationMode == InitializationMode.MULTI_THREADED);
|
instance.doInitialize();
|
||||||
}
|
}
|
||||||
catch (Throwable e) {
|
catch (Throwable e) {
|
||||||
initializationFailed = e;
|
initializationFailed = e;
|
||||||
@@ -149,7 +114,6 @@ public class KotlinBuiltIns {
|
|||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
private final KotlinCodeAnalyzer analyzer;
|
|
||||||
private final ModuleDescriptorImpl builtInsModule;
|
private final ModuleDescriptorImpl builtInsModule;
|
||||||
|
|
||||||
private volatile ImmutableSet<ClassDescriptor> nonPhysicalClasses;
|
private volatile ImmutableSet<ClassDescriptor> nonPhysicalClasses;
|
||||||
@@ -180,13 +144,13 @@ public class KotlinBuiltIns {
|
|||||||
private volatile JetType stringType;
|
private volatile JetType stringType;
|
||||||
private volatile JetType annotationType;
|
private volatile JetType annotationType;
|
||||||
|
|
||||||
private KotlinBuiltIns(@NotNull Project project) {
|
private KotlinBuiltIns() {
|
||||||
try {
|
try {
|
||||||
this.builtInsModule = new ModuleDescriptorImpl(Name.special("<built-ins lazy module>"),
|
this.builtInsModule = new ModuleDescriptorImpl(Name.special("<built-ins lazy module>"),
|
||||||
DefaultModuleConfiguration.DEFAULT_JET_IMPORTS,
|
DefaultModuleConfiguration.DEFAULT_JET_IMPORTS,
|
||||||
PlatformToKotlinClassMap.EMPTY);
|
PlatformToKotlinClassMap.EMPTY);
|
||||||
builtInsModule.setModuleConfiguration(ModuleConfiguration.EMPTY);
|
builtInsModule.setModuleConfiguration(ModuleConfiguration.EMPTY);
|
||||||
this.analyzer = createLazyResolveSession(project);
|
loadBuiltIns(builtInsModule);
|
||||||
|
|
||||||
this.functionClassesSet = computeIndexedClasses("Function", FUNCTION_TRAIT_COUNT);
|
this.functionClassesSet = computeIndexedClasses("Function", FUNCTION_TRAIT_COUNT);
|
||||||
this.extensionFunctionClassesSet = computeIndexedClasses("ExtensionFunction", FUNCTION_TRAIT_COUNT);
|
this.extensionFunctionClassesSet = computeIndexedClasses("ExtensionFunction", FUNCTION_TRAIT_COUNT);
|
||||||
@@ -213,7 +177,19 @@ public class KotlinBuiltIns {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initialize(boolean forceResolveAll) {
|
private static void loadBuiltIns(@NotNull ModuleDescriptorImpl module) throws IOException {
|
||||||
|
NamespaceDescriptorImpl rootNamespace =
|
||||||
|
new NamespaceDescriptorImpl(module, Collections.<AnnotationDescriptor>emptyList(), JetPsiUtil.ROOT_NAMESPACE_NAME);
|
||||||
|
rootNamespace.initialize(
|
||||||
|
new WritableScopeImpl(JetScope.EMPTY, rootNamespace, RedeclarationHandler.DO_NOTHING, "members of root namespace"));
|
||||||
|
|
||||||
|
module.setRootNamespace(rootNamespace);
|
||||||
|
|
||||||
|
rootNamespace.getMemberScope().addNamespace(new BuiltinsNamespaceDescriptorImpl(rootNamespace));
|
||||||
|
rootNamespace.getMemberScope().changeLockLevel(WritableScope.LockLevel.READING);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void doInitialize() {
|
||||||
anyType = getBuiltInTypeByClassName("Any");
|
anyType = getBuiltInTypeByClassName("Any");
|
||||||
nullableAnyType = TypeUtils.makeNullable(anyType);
|
nullableAnyType = TypeUtils.makeNullable(anyType);
|
||||||
nothingType = getBuiltInTypeByClassName("Nothing");
|
nothingType = getBuiltInTypeByClassName("Nothing");
|
||||||
@@ -227,42 +203,6 @@ public class KotlinBuiltIns {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nonPhysicalClasses = computeNonPhysicalClasses();
|
nonPhysicalClasses = computeNonPhysicalClasses();
|
||||||
|
|
||||||
if (forceResolveAll) {
|
|
||||||
analyzer.forceResolveAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
AnalyzingUtils.throwExceptionOnErrors(analyzer.getBindingContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private KotlinCodeAnalyzer createLazyResolveSession(@NotNull Project project) throws IOException {
|
|
||||||
List<JetFile> files = loadResourcesAsJetFiles(project, LIBRARY_FILES);
|
|
||||||
LockBasedStorageManager storageManager = new LockBasedStorageManager();
|
|
||||||
return new ResolveSession(
|
|
||||||
project,
|
|
||||||
storageManager,
|
|
||||||
builtInsModule,
|
|
||||||
new FileBasedDeclarationProviderFactory(storageManager, files),
|
|
||||||
ResolveSession.NO_ALIASES,
|
|
||||||
Predicates.in(Sets.newHashSet(new FqNameUnsafe("jet.Any"), new FqNameUnsafe("jet.Nothing"))),
|
|
||||||
new BindingTraceContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private static List<JetFile> loadResourcesAsJetFiles(@NotNull Project project, @NotNull List<String> libraryFiles)
|
|
||||||
throws IOException, ProcessCanceledException
|
|
||||||
{
|
|
||||||
List<JetFile> files = new LinkedList<JetFile>();
|
|
||||||
for(String path : libraryFiles) {
|
|
||||||
String text = loadBuiltInFileText(path);
|
|
||||||
|
|
||||||
JetFile file = (JetFile) PsiFileFactory.getInstance(project).createFileFromText(
|
|
||||||
path, JetFileType.INSTANCE, StringUtil.convertLineSeparators(text), LocalTimeCounter.currentTime(), true, false);
|
|
||||||
|
|
||||||
files.add(file);
|
|
||||||
}
|
|
||||||
return files;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void makePrimitive(PrimitiveType primitiveType) {
|
private void makePrimitive(PrimitiveType primitiveType) {
|
||||||
@@ -280,21 +220,6 @@ public class KotlinBuiltIns {
|
|||||||
jetArrayTypeToPrimitiveJetType.put(arrayType, type);
|
jetArrayTypeToPrimitiveJetType.put(arrayType, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String loadBuiltInFileText(String path) throws IOException {
|
|
||||||
InputStream stream = KotlinBuiltIns.class.getClassLoader().getResourceAsStream(path);
|
|
||||||
if (stream == null) {
|
|
||||||
if (ApplicationManager.getApplication().isUnitTestMode()) {
|
|
||||||
//noinspection TestOnlyProblems
|
|
||||||
return FileUtil.loadFile(getInTestBuiltInPath(path));
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IllegalStateException("Resource not found in classpath: " + path);
|
|
||||||
}
|
|
||||||
|
|
||||||
//noinspection IOResourceOpenedButNotSafelyClosed
|
|
||||||
return FileUtil.loadTextAndClose(new InputStreamReader(stream));
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
private static File getInTestBuiltInPath(String path) {
|
private static File getInTestBuiltInPath(String path) {
|
||||||
return new File("compiler/frontend/builtins", path);
|
return new File("compiler/frontend/builtins", path);
|
||||||
@@ -303,7 +228,7 @@ public class KotlinBuiltIns {
|
|||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@NotNull
|
@NotNull
|
||||||
public static URL getBuiltInsDirUrl() {
|
public static URL getBuiltInsDirUrl() {
|
||||||
String builtInFilePath = "/" + LIBRARY_FILES.get(0);
|
String builtInFilePath = "/" + BUILT_INS_DIR + "/Library.jet";
|
||||||
|
|
||||||
URL url = KotlinBuiltIns.class.getResource(builtInFilePath);
|
URL url = KotlinBuiltIns.class.getResource(builtInFilePath);
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public class BuiltInsInitializer {
|
|||||||
// MULTI_THREADED is important not only because of threading as such: since built-ins rely on a project,
|
// MULTI_THREADED is important not only because of threading as such: since built-ins rely on a project,
|
||||||
// if they are not fully initialized when a project is closed,
|
// if they are not fully initialized when a project is closed,
|
||||||
// they will be referencing invalid PSI upon a next request
|
// they will be referencing invalid PSI upon a next request
|
||||||
KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.MULTI_THREADED);
|
KotlinBuiltIns.initialize();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ public class Converter {
|
|||||||
|
|
||||||
public Converter(@NotNull Project project) {
|
public Converter(@NotNull Project project) {
|
||||||
this.project = project;
|
this.project = project;
|
||||||
KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.MULTI_THREADED);
|
KotlinBuiltIns.initialize();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
Reference in New Issue
Block a user