Force perform FULL analysis to avoid redundant analysis for the current open file

#KT-38687 Fixed
This commit is contained in:
Vladimir Dolzhenko
2020-07-01 08:22:58 +00:00
parent 1a82c94979
commit 853503d75f
4 changed files with 76 additions and 29 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.project
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootModificationTracker
import com.intellij.psi.util.CachedValue
@@ -12,6 +13,7 @@ import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.containers.SLRUCache
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.cfg.ControlFlowInformationProvider
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.SimpleGlobalContext
@@ -25,6 +27,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.analyzeControlFlow
import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener
import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListenerCompat
import org.jetbrains.kotlin.idea.caches.trackers.inBlockModificationCount
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.psi.*
@@ -151,6 +154,22 @@ class ResolveElementCache(
assert(bodyResolveMode == BodyResolveMode.FULL)
}
// KT-38687: There are lots of editor specific items like inlays, line markers, injected items etc
// those require analysis: it is called with BodyResolveMode.PARTIAL or BodyResolveMode.PARTIAL_WITH_CFA almost simultaneously.
// In the same time Kotlin Annotator (e.g. KotlinPsiChecker) requires BodyResolveMode.FULL analysis.
//
// While results of FULL could be reused by any of PARTIAL or PARTIAL_WITH_CFA analysis,
// neither result of PARTIAL nor result of PARTIAL_WITH_CFA analyses could be reused by FULL analysis.
//
// Force perform FULL analysis to avoid redundant analysis for the current selected files.
if (bodyResolveMode != BodyResolveMode.FULL && (!isUnitTestMode() || forceFullAnalysisModeInTests)) {
val virtualFile = resolveElement.containingFile.virtualFile
// applicable for real (physical) files only
if (virtualFile != null && FileEditorManager.getInstance(resolveElement.project).selectedFiles.any { it == virtualFile }) {
return getElementsAdditionalResolve(resolveElement, contextElements, BodyResolveMode.FULL)
}
}
// check if full additional resolve already performed and is up-to-date
val fullResolveMap = fullResolveCache.value
val cachedFullResolve = fullResolveMap[resolveElement]
@@ -807,5 +826,10 @@ class ResolveElementCache(
override fun getTopDownAnalysisMode() = topDownAnalysisMode
}
companion object {
@set:TestOnly
var forceFullAnalysisModeInTests: Boolean = false
}
}