From af5ee3acba2dda261adf4ace9ecde83b808ac540 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 16 Apr 2013 13:54:29 +0400 Subject: [PATCH] forceResolveAll() is not called when compiler initializes built-ins --- .../cli/jvm/compiler/JetCoreEnvironment.java | 2 +- .../jet/lang/types/lang/KotlinBuiltIns.java | 17 +++++++++++++---- .../jet/plugin/BuiltInsInitializer.java | 5 ++++- j2k/src/org/jetbrains/jet/j2k/Converter.java | 2 +- .../jetbrains/k2js/facade/K2JSTranslator.java | 2 -- 5 files changed, 19 insertions(+), 9 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java index 1cea16372d7..5320a9e6591 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/jvm/compiler/JetCoreEnvironment.java @@ -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() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java index 7a6df450e14..935af5e9e10 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/lang/KotlinBuiltIns.java @@ -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()); } diff --git a/idea/src/org/jetbrains/jet/plugin/BuiltInsInitializer.java b/idea/src/org/jetbrains/jet/plugin/BuiltInsInitializer.java index 662d73a8dc2..c1c03bd1945 100644 --- a/idea/src/org/jetbrains/jet/plugin/BuiltInsInitializer.java +++ b/idea/src/org/jetbrains/jet/plugin/BuiltInsInitializer.java @@ -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); } }); } diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.java b/j2k/src/org/jetbrains/jet/j2k/Converter.java index 4b104d8a229..9cefa372f01 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.java +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.java @@ -59,7 +59,7 @@ public class Converter { private final Set flags = Sets.newHashSet(); public Converter(@NotNull Project project) { - KotlinBuiltIns.initialize(project); + KotlinBuiltIns.initialize(project, KotlinBuiltIns.InitializationMode.MULTI_THREADED); } public boolean addFlag(@NotNull J2KConverterFlags flag) { diff --git a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java index c1f86e37561..ad7ccad456c 100644 --- a/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/facade/K2JSTranslator.java @@ -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 filesToTranslate, @NotNull MainCallParameters mainCallParameters) throws TranslationException { - KotlinBuiltIns.initialize(config.getProject()); BindingContext bindingContext = AnalyzerFacadeForJS.analyzeFilesAndCheckErrors(filesToTranslate, config); return Translation.generateAst(bindingContext, filesToTranslate, mainCallParameters, config); }