From 784e501f7bbd2291fea32d8d1bb222f8117456c3 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 14 Mar 2013 15:42:11 +0400 Subject: [PATCH] Use KotlinCacheManager to analyze all headers only once --- ...alyzeExhaustAsKotlinDeclarationsCache.java | 5 ++ .../plugin/project/AnalyzeSingleFileUtil.java | 2 +- .../project/AnalyzerFacadeWithCache.java | 50 ++++--------------- .../project/WholeProjectAnalyzerFacade.java | 3 +- 4 files changed, 18 insertions(+), 42 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/caches/resolve/AnalyzeExhaustAsKotlinDeclarationsCache.java b/idea/src/org/jetbrains/jet/plugin/caches/resolve/AnalyzeExhaustAsKotlinDeclarationsCache.java index 17cf7dbeadd..7546d0e2fff 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/resolve/AnalyzeExhaustAsKotlinDeclarationsCache.java +++ b/idea/src/org/jetbrains/jet/plugin/caches/resolve/AnalyzeExhaustAsKotlinDeclarationsCache.java @@ -54,4 +54,9 @@ public class AnalyzeExhaustAsKotlinDeclarationsCache implements KotlinDeclaratio public ModuleConfiguration getModuleConfiguration() { return exhaust.getModuleConfiguration(); } + + @NotNull + public AnalyzeExhaust getAnalyzeExhaust() { + return exhaust; + } } diff --git a/idea/src/org/jetbrains/jet/plugin/project/AnalyzeSingleFileUtil.java b/idea/src/org/jetbrains/jet/plugin/project/AnalyzeSingleFileUtil.java index e8dd4c4fdbd..8a5e77c0855 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/AnalyzeSingleFileUtil.java +++ b/idea/src/org/jetbrains/jet/plugin/project/AnalyzeSingleFileUtil.java @@ -28,7 +28,7 @@ public final class AnalyzeSingleFileUtil { @NotNull public static AnalyzeExhaust analyzeSingleFileWithCache(@NotNull JetFile file) { - return AnalyzerFacadeWithCache.analyzeFileWithCache(file, AnalyzerFacadeWithCache.SINGLE_DECLARATION_PROVIDER); + return AnalyzerFacadeWithCache.analyzeFileWithCache(file); } @NotNull diff --git a/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java b/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java index f4a0c2c1cec..8b862bbab34 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java +++ b/idea/src/org/jetbrains/jet/plugin/project/AnalyzerFacadeWithCache.java @@ -16,13 +16,11 @@ package org.jetbrains.jet.plugin.project; -import com.google.common.base.Predicates; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; -import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.impl.PsiModificationTrackerImpl; import com.intellij.psi.search.GlobalSearchScope; @@ -40,6 +38,9 @@ import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.resolve.*; import org.jetbrains.jet.lang.resolve.java.JetFilesProvider; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; +import org.jetbrains.jet.plugin.caches.resolve.AnalyzeExhaustAsKotlinDeclarationsCache; +import org.jetbrains.jet.plugin.caches.resolve.KotlinCacheManager; +import org.jetbrains.jet.plugin.caches.resolve.KotlinDeclarationsCache; import org.jetbrains.jet.plugin.util.ApplicationUtils; import java.util.Collection; @@ -49,7 +50,6 @@ public final class AnalyzerFacadeWithCache { private static final Logger LOG = Logger.getInstance("org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache"); - private final static Key> ANALYZE_EXHAUST_HEADERS = Key.create("ANALYZE_EXHAUST_HEADERS"); private final static Key> ANALYZE_EXHAUST_FULL = Key.create("ANALYZE_EXHAUST_FULL"); private static final Object lock = new Object(); @@ -65,15 +65,10 @@ public final class AnalyzerFacadeWithCache { /** * Analyze project with string cache for given file. Given file will be fully analyzed. - * - * @param file - * @param declarationProvider - * @return */ // TODO: Also need to pass several files when user have multi-file environment @NotNull - public static AnalyzeExhaust analyzeFileWithCache(@NotNull final JetFile file, - @NotNull final Function> declarationProvider) { + public static AnalyzeExhaust analyzeFileWithCache(@NotNull final JetFile file) { // Need lock, because parallel threads can start evaluation of compute() simultaneously synchronized (lock) { return CachedValuesManager.getManager(file.getProject()).getCachedValue( @@ -91,7 +86,7 @@ public final class AnalyzerFacadeWithCache { ApplicationUtils.warnTimeConsuming(LOG); - AnalyzeExhaust analyzeExhaustHeaders = analyzeHeadersWithCacheOnFile(file, declarationProvider); + AnalyzeExhaust analyzeExhaustHeaders = analyzeHeadersWithCacheOnFile(file); AnalyzeExhaust exhaust = analyzeBodies(analyzeExhaustHeaders, file); @@ -115,29 +110,9 @@ public final class AnalyzerFacadeWithCache { return AnalyzeExhaust.success(BindingContext.EMPTY, ModuleConfiguration.EMPTY); } - private static AnalyzeExhaust analyzeHeadersWithCacheOnFile( - @NotNull final JetFile fileToCache, - @NotNull final Function> declarationProvider - ) { - CachedValue bindingContextCachedValue = fileToCache.getUserData(ANALYZE_EXHAUST_HEADERS); - if (bindingContextCachedValue == null) { - bindingContextCachedValue = - CachedValuesManager.getManager(fileToCache.getProject()).createCachedValue(new CachedValueProvider() { - @Override - public Result compute() { - AnalyzeExhaust exhaust = AnalyzerFacadeProvider.getAnalyzerFacadeForFile(fileToCache) - .analyzeFiles(fileToCache.getProject(), - declarationProvider.fun(fileToCache), - Collections.emptyList(), - Predicates.alwaysFalse()); - - return new Result(exhaust, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT); - } - }, false); - fileToCache.putUserData(ANALYZE_EXHAUST_HEADERS, bindingContextCachedValue); - } - - return bindingContextCachedValue.getValue(); + private static AnalyzeExhaust analyzeHeadersWithCacheOnFile(@NotNull JetFile fileToCache) { + KotlinDeclarationsCache cache = KotlinCacheManager.getInstance(fileToCache.getProject()).getDeclarationsFromProject(); + return ((AnalyzeExhaustAsKotlinDeclarationsCache) cache).getAnalyzeExhaust(); } private static AnalyzeExhaust analyzeBodies(AnalyzeExhaust analyzeExhaustHeaders, JetFile file) { @@ -162,12 +137,9 @@ public final class AnalyzerFacadeWithCache { bindingTraceContext.report(Errors.EXCEPTION_WHILE_ANALYZING.on(file, e)); AnalyzeExhaust analyzeExhaust = AnalyzeExhaust.error(bindingTraceContext.getBindingContext(), e); - CachedValue bindingContextCachedValue = file.getUserData(ANALYZE_EXHAUST_HEADERS); - if (bindingContextCachedValue != null && bindingContextCachedValue.hasUpToDateValue()) { - // Force invalidating of headers cache - temp decision for monitoring rewrite slice bug - PsiModificationTracker tracker = PsiManager.getInstance(file.getProject()).getModificationTracker(); - ((PsiModificationTrackerImpl) tracker).incOutOfCodeBlockModificationCounter(); - } + // Force invalidating of headers cache - temp decision for monitoring rewrite slice bug + PsiModificationTracker tracker = PsiManager.getInstance(file.getProject()).getModificationTracker(); + ((PsiModificationTrackerImpl) tracker).incOutOfCodeBlockModificationCounter(); return new CachedValueProvider.Result(analyzeExhaust, PsiModificationTracker.MODIFICATION_COUNT); } diff --git a/idea/src/org/jetbrains/jet/plugin/project/WholeProjectAnalyzerFacade.java b/idea/src/org/jetbrains/jet/plugin/project/WholeProjectAnalyzerFacade.java index 81a0333483d..8f63403dd45 100644 --- a/idea/src/org/jetbrains/jet/plugin/project/WholeProjectAnalyzerFacade.java +++ b/idea/src/org/jetbrains/jet/plugin/project/WholeProjectAnalyzerFacade.java @@ -19,7 +19,6 @@ package org.jetbrains.jet.plugin.project; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.lang.psi.JetFile; -import org.jetbrains.jet.lang.resolve.java.JetFilesProvider; import org.jetbrains.jet.lang.resolve.lazy.ResolveSession; public final class WholeProjectAnalyzerFacade { @@ -29,7 +28,7 @@ public final class WholeProjectAnalyzerFacade { @NotNull public static AnalyzeExhaust analyzeProjectWithCacheOnAFile(@NotNull JetFile file) { - return AnalyzerFacadeWithCache.analyzeFileWithCache(file, JetFilesProvider.getInstance(file.getProject()).sampleToAllFilesInModule()); + return AnalyzerFacadeWithCache.analyzeFileWithCache(file); } @NotNull