From fdc42c6c1de8a78f6f7fcf38ca4496c4d0ead99c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Wed, 9 Apr 2014 15:20:09 +0400 Subject: [PATCH] Debugger behavior fixed: backend relies on all relevant files being analyzed, not only one --- .../caches/resolve/KotlinResolveCache.kt | 32 +++++++++++-------- .../jet/plugin/util/DebuggerUtils.java | 4 ++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt b/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt index e9587500dd1..08f6f482b31 100644 --- a/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt +++ b/idea/src/org/jetbrains/jet/plugin/caches/resolve/KotlinResolveCache.kt @@ -44,11 +44,14 @@ class KotlinResolveCache( val project: Project, val resolveSession: ResolveSession ) { - private val analysisResults = CachedValuesManager.getManager(project).createCachedValue ({ - val results = object : SLRUCache(2, 3) { - override fun createValue(element: JetElement?): AnalyzeExhaust { - element!! + private data class Task( + val elements: Set + ) + + private val analysisResults = CachedValuesManager.getManager(project).createCachedValue ({ + val results = object : SLRUCache(2, 3) { + override fun createValue(task: Task?): AnalyzeExhaust { if (DumbService.isDumb(project)) { return AnalyzeExhaust.EMPTY } @@ -56,12 +59,8 @@ class KotlinResolveCache( ApplicationUtils.warnTimeConsuming(LOG) try { - if (element !is JetFile) { - error("Only files are supported") - } - // todo: look for pre-existing results for this element or its parents - val trace = DelegatingBindingTrace(resolveSession.getBindingContext(), "Trace for resolution of " + element) + val trace = DelegatingBindingTrace(resolveSession.getBindingContext(), "Trace for resolution of " + task!!.elements.makeString(", ")) val injector = InjectorForTopDownAnalyzerForJvm( project, SimpleGlobalContext(resolveSession.getStorageManager(), resolveSession.getExceptionTracker()), @@ -78,7 +77,7 @@ class KotlinResolveCache( analyzingBootstrapLibrary = false, declaredLocally = false ), - listOf(getContainingNonlocalDeclaration(element)) + task.elements.map { getContainingNonlocalDeclaration(it) } ) return AnalyzeExhaust.success( trace.getBindingContext(), @@ -104,12 +103,20 @@ class KotlinResolveCache( CachedValueProvider.Result(results, PsiModificationTracker.MODIFICATION_COUNT, resolveSession.getExceptionTracker()) }, false) - fun getAnalysisResultsForElement(element: JetElement): AnalyzeExhaust { + private fun getAnalysisResults(task: Task): AnalyzeExhaust { return synchronized(analysisResults) { - analysisResults.getValue()!![element] + analysisResults.getValue()!![task] } } + fun getAnalysisResultsForElement(element: JetElement): AnalyzeExhaust { + return getAnalysisResults(Task(setOf(element))) + } + + fun getAnalysisResultsForElements(elements: Collection): AnalyzeExhaust { + return getAnalysisResults(Task(elements.toSet())) + } + private fun getContainingNonlocalDeclaration(element: JetElement): JetElement? { return PsiTreeUtil.getParentOfType(element, javaClass(), false); } @@ -119,4 +126,3 @@ class KotlinResolveCache( LOG.error(e) } } - diff --git a/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java b/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java index e324d33f7fc..2c653207a12 100644 --- a/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java +++ b/idea/src/org/jetbrains/jet/plugin/util/DebuggerUtils.java @@ -71,7 +71,9 @@ public class DebuggerUtils { // In the rare case that there's more than one file with this name in this package, // we may actually need to analyze the project in order to find a file which produces this class - AnalyzeExhaust analyzeExhaust = AnalyzerFacadeWithCache.analyzeFileWithCache(anyFile); + // TODO: this code is not entirely correct, because it takes a session for only one file + AnalyzeExhaust analyzeExhaust = AnalyzerFacadeWithCache.getLazyResolveSessionForFile(anyFile).getResolveCache() + .getAnalysisResultsForElements(files); return PsiCodegenPredictor.getFileForCodegenNamedClass(analyzeExhaust.getBindingContext(), allPackageFiles, className.getInternalName()); }