From bdc3192acb34a9d7d501f3b9c68edd1a8cf48088 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 25 Jul 2016 14:32:30 +0300 Subject: [PATCH] Don't store analyze result longer than ModuleResolverProvider valid time For synthetic files there might be file modifications without PsiModificationTracker.MODIFICATION_COUNT increment. --- .../idea/caches/resolve/KotlinCacheServiceImpl.kt | 10 +++++----- .../idea/caches/resolve/ModuleDependencyMapper.kt | 13 +++++-------- .../idea/caches/resolve/ProjectResolutionFacade.kt | 11 ++++++++--- 3 files changed, 18 insertions(+), 16 deletions(-) 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 4bc3c2dc06c..205664151c6 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 @@ -165,7 +165,7 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { fun makeGlobalResolveSessionProvider(reuseDataFrom: ProjectResolutionFacade? = null, moduleFilter: (IdeaModuleInfo) -> Boolean = { true }, allModules: Collection? = null - ): (GlobalContextImpl, Project) -> CachedValueProvider.Result { + ): (GlobalContextImpl, Project) -> ModuleResolverProvider { return globalResolveSessionProvider( debugName, targetPlatform, @@ -316,7 +316,7 @@ private fun globalResolveSessionProvider( reuseDataFrom: ProjectResolutionFacade? = null, syntheticFiles: Collection = listOf(), allModules: Collection? = null // null means create resolvers for modules from idea model -): (GlobalContextImpl, Project) -> CachedValueProvider.Result = { globalContext, project -> +): (GlobalContextImpl, Project) -> ModuleResolverProvider = { globalContext, project -> val delegateResolverProvider = reuseDataFrom?.moduleResolverProvider val delegateResolverForProject = delegateResolverProvider?.resolverForProject ?: EmptyResolverForProject() @@ -334,7 +334,8 @@ private fun globalResolveSessionProvider( AnalyzerFacadeProvider.getAnalyzerFacade(platform), syntheticFiles, delegateResolverForProject, moduleFilter, allModules, - builtIns + builtIns, + dependencies ) if (newBuiltIns is JvmBuiltIns) { @@ -342,7 +343,6 @@ private fun globalResolveSessionProvider( newBuiltIns.setOwnerModuleDescriptor(moduleResolverProvider.resolverForProject.descriptorForModule(sdkInfo)) } - val allDependencies = dependencies + listOf(moduleResolverProvider.exceptionTracker) - CachedValueProvider.Result.create(moduleResolverProvider, allDependencies) + moduleResolverProvider } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt index d56a354a85f..9af3e5932ea 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ModuleDependencyMapper.kt @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.load.java.structure.JavaClass import org.jetbrains.kotlin.load.java.structure.impl.JavaClassImpl import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.jvm.JvmPlatformParameters -import org.jetbrains.kotlin.storage.ExceptionTracker fun createModuleResolverProvider( debugName: String, @@ -45,7 +44,8 @@ fun createModuleResolverProvider( delegateResolver: ResolverForProject, moduleFilter: (IdeaModuleInfo) -> Boolean, allModules: Collection?, - builtIns: KotlinBuiltIns + builtIns: KotlinBuiltIns, + dependencies: Collection ): ModuleResolverProvider { val allModuleInfos = (allModules ?: collectAllModuleInfosFromIdeaModel(project)).toHashSet() @@ -81,7 +81,7 @@ fun createModuleResolverProvider( return ModuleResolverProviderImpl( resolverForProject, builtIns, - globalContext + dependencies + listOf(globalContext.exceptionTracker) ) } @@ -111,15 +111,12 @@ private fun collectAllModuleInfosFromIdeaModel(project: Project): List val builtIns: KotlinBuiltIns + val cacheDependencies: Collection } class ModuleResolverProviderImpl( override val resolverForProject: ResolverForProject, override val builtIns: KotlinBuiltIns, - globalContext: GlobalContextImpl -) : ModuleResolverProvider { - override val exceptionTracker: ExceptionTracker = globalContext.exceptionTracker -} + override val cacheDependencies: Collection) : ModuleResolverProvider diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt index 428a8183eba..d1dabaab1db 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/ProjectResolutionFacade.kt @@ -32,10 +32,13 @@ internal class ProjectResolutionFacade( val debugString: String, val project: Project, val globalContext: GlobalContextImpl, - computeModuleResolverProvider: (GlobalContextImpl, Project) -> CachedValueProvider.Result + computeModuleResolverProvider: (GlobalContextImpl, Project) -> ModuleResolverProvider ) { private val cachedValue = CachedValuesManager.getManager(project).createCachedValue( - { computeModuleResolverProvider(globalContext, project) }, + { + val resolverProvider = computeModuleResolverProvider(globalContext, project) + CachedValueProvider.Result.create(resolverProvider, resolverProvider.cacheDependencies) + }, /* trackValue = */ false ) @@ -57,7 +60,9 @@ internal class ProjectResolutionFacade( return PerFileAnalysisCache(file!!, resolverProvider.resolverForProject.resolverForModule(file.getModuleInfo()).componentProvider) } } - CachedValueProvider.Result(results, PsiModificationTracker.MODIFICATION_COUNT, resolverProvider.exceptionTracker) + + val allDependencies = resolverProvider.cacheDependencies + listOf(PsiModificationTracker.MODIFICATION_COUNT) + CachedValueProvider.Result.create(results, allDependencies) }, false) fun getAnalysisResultsForElements(elements: Collection): AnalysisResult {