diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 1aefb20aedd..fc5b78d8a81 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -263,8 +263,11 @@ class ResolverForProjectImpl( ) moduleInfoByDescriptor[moduleDescriptor] = module setupModuleDescriptor(module, moduleDescriptor) - val modificationTracker = (module as? TrackableModuleInfo)?.createModificationTracker() - ?: (PsiModificationTracker.SERVICE.getInstance(projectContext.project).outOfCodeBlockModificationTracker.takeIf { invalidateOnOOCB }) + val modificationTracker = (module as? TrackableModuleInfo)?.createModificationTracker() ?: if (invalidateOnOOCB) { + PsiModificationTracker.SERVICE.getInstance(projectContext.project).outOfCodeBlockModificationTracker + } else { + null + } return ModuleData(moduleDescriptor, modificationTracker) } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index f034496ea50..c0da7a5f78e 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -43,18 +43,19 @@ import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor import org.jetbrains.kotlin.idea.caches.project.* import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.util.contextWithNewLockAndCompositeExceptionTracker +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener +import org.jetbrains.kotlin.idea.caches.trackers.outOfBlockModificationCount import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker import org.jetbrains.kotlin.idea.core.script.dependencies.ScriptAdditionalIdeaDependenciesProvider import org.jetbrains.kotlin.idea.project.TargetPlatformDetector -import org.jetbrains.kotlin.idea.caches.trackers.outOfBlockModificationCount import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.platform.DefaultIdeTargetPlatformKindProvider +import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.contains import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.resolve.diagnostics.KotlinSuppressCache import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull @@ -226,7 +227,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { val dependenciesForSyntheticFileCache = listOf( - PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, + KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker, filesModificationTracker ) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyContractedCallableNamesImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyContractedCallableNamesImpl.kt index 26614d82740..814f18345cc 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyContractedCallableNamesImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyContractedCallableNamesImpl.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.project import com.intellij.openapi.project.Project import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.stubindex.KotlinProbablyContractedFunctionShortNameIndex import org.jetbrains.kotlin.resolve.lazy.ProbablyContractedCallableNames @@ -17,7 +17,7 @@ class ProbablyContractedCallableNamesImpl(project: Project) : ProbablyContracted { CachedValueProvider.Result.create( KotlinProbablyContractedFunctionShortNameIndex.getInstance().getAllKeys(project), - PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT + KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker ) }, false diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyNothingCallableNamesImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyNothingCallableNamesImpl.kt index 8290fac81c9..b28ba13b823 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyNothingCallableNamesImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ProbablyNothingCallableNamesImpl.kt @@ -8,13 +8,9 @@ package org.jetbrains.kotlin.idea.project import com.intellij.openapi.project.Project import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker -import com.intellij.util.containers.SLRUCache -import org.jetbrains.kotlin.idea.caches.project.getModuleInfo -import org.jetbrains.kotlin.idea.caches.resolve.PerFileAnalysisCache +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.stubindex.KotlinProbablyNothingFunctionShortNameIndex import org.jetbrains.kotlin.idea.stubindex.KotlinProbablyNothingPropertyShortNameIndex -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.lazy.ProbablyNothingCallableNames class ProbablyNothingCallableNamesImpl(project: Project) : ProbablyNothingCallableNames { @@ -28,6 +24,6 @@ class ProbablyNothingCallableNamesImpl(project: Project) : ProbablyNothingCallab private inline fun createCachedValue(project: Project, crossinline names: () -> Collection) = CachedValuesManager.getManager(project).createCachedValue( { - CachedValueProvider.Result.create(names(), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) + CachedValueProvider.Result.create(names(), KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker) }, false ) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index 88151a4afe9..f1b2069df6d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -78,7 +78,7 @@ class ResolveElementCache( CachedValueProvider> { CachedValueProvider.Result.create( ContainerUtil.createConcurrentWeakKeySoftValueMap(), - PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, + KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker, resolveSession.exceptionTracker ) }, diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt index 292e4e67f6e..fed894d6bd9 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/PsiBasedClassResolver.kt @@ -23,11 +23,11 @@ import com.intellij.psi.search.PsiShortNamesCache import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.asJava.ImpreciseResolveResult import org.jetbrains.kotlin.asJava.ImpreciseResolveResult.* import org.jetbrains.kotlin.idea.caches.project.getNullableModuleInfo +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.compiler.IDELanguageSettingsProvider import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.idea.project.findAnalyzerServices @@ -78,7 +78,7 @@ class PsiBasedClassResolver @TestOnly constructor(private val targetClassFqName: { CachedValueProvider.Result( PsiBasedClassResolver(target), - PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT + KotlinCodeBlockModificationListener.getInstance(target.project).kotlinOutOfCodeBlockTracker ) }, false ) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt index ffea5b4f7aa..dfb9eace5ee 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/SubpackagesIndexService.kt @@ -18,12 +18,11 @@ package org.jetbrains.kotlin.idea.stubindex import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project -import com.intellij.psi.PsiManager import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.MultiMap +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name import java.util.* @@ -34,7 +33,7 @@ class SubpackagesIndexService(private val project: Project) { { CachedValueProvider.Result( SubpackagesIndex(KotlinExactPackagesIndex.getInstance().getAllKeys(project)), - PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) + KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker) }, false ) @@ -43,7 +42,7 @@ class SubpackagesIndexService(private val project: Project) { // a map from any existing package (in kotlin) to a set of subpackages (not necessarily direct) containing files private val allPackageFqNames = hashSetOf() private val fqNameByPrefix = MultiMap.createSet() - private val oocbCount = PsiManager.getInstance(project).modificationTracker.outOfCodeBlockModificationCount + private val oocbCount = KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker.modificationCount init { for (fqNameAsString in allPackageFqNames) { diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt index 7cac488dd14..c9d201e03b8 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/stubindex/resolve/PluginDeclarationProviderFactory.kt @@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.stubindex.resolve import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project -import com.intellij.psi.PsiManager import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.stubs.StubIndex import org.jetbrains.kotlin.analyzer.ModuleInfo @@ -26,6 +25,7 @@ import org.jetbrains.kotlin.idea.caches.PerModulePackageCacheService import org.jetbrains.kotlin.idea.caches.project.IdeaModuleInfo import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.project.projectSourceModules +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.stubindex.KotlinExactPackagesIndex import org.jetbrains.kotlin.idea.stubindex.PackageIndexUtil import org.jetbrains.kotlin.idea.stubindex.SubpackagesIndexService @@ -109,7 +109,7 @@ class PluginDeclarationProviderFactory( packageExists = $packageExists, cachedPackageExists = $cachedPackageExists, oldPackageExists = $oldPackageExists, SPI.packageExists = $spiPackageExists, SPI = $subpackagesIndex, - OOCB count = ${PsiManager.getInstance(project).modificationTracker.outOfCodeBlockModificationCount} + OOCB count = ${KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker.modificationCount} moduleModificationCount = $moduleModificationCount """.trimIndent() diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionBindingContextProvider.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionBindingContextProvider.kt index 37b730ed3b3..446f82f2ecd 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionBindingContextProvider.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/CompletionBindingContextProvider.kt @@ -25,7 +25,6 @@ import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.util.CachedValue import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager -import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.idea.analysis.analyzeInContext @@ -85,8 +84,14 @@ class CompletionBindingContextProvider(project: Project) { } private var prevCompletionDataCache: CachedValue = CachedValuesManager.getManager(project).createCachedValue( - { CachedValueProvider.Result.create(DataHolder(), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) }, - false) + { + CachedValueProvider.Result.create( + DataHolder(), + KotlinCodeBlockModificationListener.getInstance(project).kotlinOutOfCodeBlockTracker + ) + }, + false + ) fun getBindingContext(position: PsiElement, resolutionFacade: ResolutionFacade): BindingContext { diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractAdditionalResolveDescriptorRendererTest.kt b/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractAdditionalResolveDescriptorRendererTest.kt index bb84efac4cd..a7f002dda42 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractAdditionalResolveDescriptorRendererTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/AbstractAdditionalResolveDescriptorRendererTest.kt @@ -5,9 +5,16 @@ package org.jetbrains.kotlin.idea.resolve +import com.intellij.mock.MockProject +import com.intellij.pom.PomManager +import com.intellij.pom.PomModel +import com.intellij.pom.core.impl.PomModelImpl +import com.intellij.pom.tree.TreeAspect +import com.intellij.psi.util.PsiModificationTracker import org.jetbrains.kotlin.container.ComponentProvider import org.jetbrains.kotlin.container.get import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener import org.jetbrains.kotlin.idea.project.IdeaEnvironment import org.jetbrains.kotlin.idea.project.ResolveElementCache import org.jetbrains.kotlin.psi.KtAnonymousInitializer @@ -18,13 +25,41 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.TargetEnvironment import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.lazy.ResolveSession +import org.picocontainer.MutablePicoContainer abstract class AbstractAdditionalResolveDescriptorRendererTest : AbstractDescriptorRendererTest() { + override fun setUp() { + super.setUp() + + val pomModelImpl = PomModelImpl(project) + val treeAspect = TreeAspect(pomModelImpl) + + (project as MockProject).registerService(PomModel::class.java, pomModelImpl) + (project.picoContainer as MutablePicoContainer).registerComponentInstance( + KotlinCodeBlockModificationListener( + PsiModificationTracker.SERVICE.getInstance(project), + project, + treeAspect + ) + ) + } + + override fun tearDown() { + (project.picoContainer as MutablePicoContainer).unregisterComponentByInstance( + KotlinCodeBlockModificationListener.getInstance(project) + ) + + val pomModel = PomManager.getModel(project) + (project.picoContainer as MutablePicoContainer).unregisterComponentByInstance(pomModel) + + super.tearDown() + } + override fun getDescriptor(declaration: KtDeclaration, container: ComponentProvider): DeclarationDescriptor { if (declaration is KtAnonymousInitializer || KtPsiUtil.isLocal(declaration)) { return container.get() - .resolveToElements(listOf(declaration), BodyResolveMode.FULL) - .get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration)!! + .resolveToElements(listOf(declaration), BodyResolveMode.FULL) + .get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration)!! } return container.get().resolveToDescriptor(declaration) }