From a0ad05983af8c73b58df5616ea39d0e35e31433e Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Mon, 20 Oct 2014 17:17:57 +0400 Subject: [PATCH] KotlinCacheService: Correctly deal with code fragments in getAnalysisResults() Fix evaluate expression for breakpoints in library source --- .../caches/resolve/KotlinCacheService.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt index 0a01d0f8cec..523d7a4d61f 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/KotlinCacheService.kt @@ -182,17 +182,28 @@ public class KotlinCacheService(val project: Project) { val files = elements.map { it.getContainingJetFile() }.toSet() assertAreInSameModule(files) - if (files.all { !ProjectRootsUtil.isInProjectSource(it) } -// TODO: decide what to do with this -// && files.all { it !is JetCodeFragment } - ) { - return getCacheForSyntheticFile(files).getAnalysisResultsForElements(elements) + val syntheticFiles = findSyntheticFiles(files) + if (syntheticFiles.isNotEmpty()) { + return getCacheForSyntheticFile(syntheticFiles).getAnalysisResultsForElements(elements) } val firstFile = elements.first().getContainingJetFile() return getGlobalCache(TargetPlatformDetector.getPlatform(firstFile)).getAnalysisResultsForElements(elements) } + private fun findSyntheticFiles(files: Collection) = files.map { + if (it is JetCodeFragment) it.getContextFile() else it + }.filter { + !ProjectRootsUtil.isInProjectSource(it) + }.toSet() + + private fun JetCodeFragment.getContextFile(): JetFile { + val contextElement = getContext() ?: throw AssertionError("Analyzing code fragment of type $javaClass with no context") + val contextFile = (contextElement as? JetElement)?.getContainingJetFile() + ?: throw AssertionError("Analyzing kotlin code fragment of type $javaClass with java context of type ${contextElement.javaClass}") + return if (contextFile is JetCodeFragment) contextFile.getContextFile() else contextFile + } + private fun assertAreInSameModule(elements: Collection) { if (elements.size <= 1) { return