forceResolveAll() is not called when compiler initializes built-ins

This commit is contained in:
Andrey Breslav
2013-04-16 13:54:29 +04:00
parent be62290aff
commit af5ee3acba
5 changed files with 19 additions and 9 deletions
@@ -125,7 +125,7 @@ public class JetCoreEnvironment {
JetScriptDefinitionProvider.getInstance(project).addScriptDefinitions(configuration.getList(CommonConfigurationKeys.SCRIPT_DEFINITIONS_KEY));
KotlinBuiltIns.initialize(project);
KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.SINGLE_THREADED);
}
public CompilerConfiguration getConfiguration() {
@@ -88,9 +88,16 @@ public class KotlinBuiltIns {
private static volatile boolean initializing;
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
// before any type checking is run
public static synchronized void initialize(@NotNull Project project) {
public static synchronized void initialize(@NotNull Project project, @NotNull InitializationMode initializationMode) {
if (instance == null) {
if (initializationFailed != null) {
throw new RuntimeException(
@@ -102,7 +109,7 @@ public class KotlinBuiltIns {
initializing = true;
try {
instance = new KotlinBuiltIns(project);
instance.initialize();
instance.initialize(initializationMode == InitializationMode.MULTI_THREADED);
}
catch (Throwable e) {
initializationFailed = e;
@@ -191,7 +198,7 @@ public class KotlinBuiltIns {
}
}
private void initialize() {
private void initialize(boolean forceResolveAll) {
anyType = getBuiltInTypeByClassName("Any");
nullableAnyType = TypeUtils.makeNullable(anyType);
nothingType = getBuiltInTypeByClassName("Nothing");
@@ -206,7 +213,9 @@ public class KotlinBuiltIns {
nonPhysicalClasses = computeNonPhysicalClasses();
analyzer.forceResolveAll();
if (forceResolveAll) {
analyzer.forceResolveAll();
}
AnalyzingUtils.throwExceptionOnErrors(analyzer.getBindingContext());
}
@@ -30,7 +30,10 @@ public class BuiltInsInitializer {
ProgressManager.getInstance().executeNonCancelableSection(new Runnable() {
@Override
public void run() {
KotlinBuiltIns.initialize(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,
// they will be referencing invalid PSI upon a next request
KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.MULTI_THREADED);
}
});
}
+1 -1
View File
@@ -59,7 +59,7 @@ public class Converter {
private final Set<J2KConverterFlags> flags = Sets.newHashSet();
public Converter(@NotNull Project project) {
KotlinBuiltIns.initialize(project);
KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.MULTI_THREADED);
}
public boolean addFlag(@NotNull J2KConverterFlags flag) {
@@ -22,7 +22,6 @@ import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetFile;
import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.k2js.analyze.AnalyzerFacadeForJS;
import org.jetbrains.k2js.config.Config;
import org.jetbrains.k2js.facade.exceptions.TranslationException;
@@ -88,7 +87,6 @@ public final class K2JSTranslator {
public JsProgram generateProgram(@NotNull List<JetFile> filesToTranslate,
@NotNull MainCallParameters mainCallParameters)
throws TranslationException {
KotlinBuiltIns.initialize(config.getProject());
BindingContext bindingContext = AnalyzerFacadeForJS.analyzeFilesAndCheckErrors(filesToTranslate, config);
return Translation.generateAst(bindingContext, filesToTranslate, mainCallParameters, config);
}