From 194deccd09045da2db5296bdfc6f404d88d69662 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 26 Jul 2017 13:42:32 +0200 Subject: [PATCH] Remove one level of indirection from ModuleResolverProvider creation --- .../caches/resolve/KotlinCacheServiceImpl.kt | 153 ++++++++---------- .../caches/resolve/ModuleDependencyMapper.kt | 3 +- .../caches/resolve/ProjectResolutionFacade.kt | 24 ++- 3 files changed, 92 insertions(+), 88 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 d90f69dcef3..9dad25f868c 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 @@ -98,22 +98,18 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { val sdkFacade = GlobalFacade(facadeKey).facadeForSdk val globalContext = sdkFacade.globalContext.contextWithNewLockAndCompositeExceptionTracker() return ProjectResolutionFacade( - "facadeForScriptDependencies", - project, globalContext, - globalResolveSessionProvider( - "dependencies of scripts", - facadeKey, - reuseDataFrom = sdkFacade, - allModules = dependenciesModuleInfo.dependencies(), - //TODO: provide correct trackers - dependencies = listOf( - LibraryModificationTracker.getInstance(project), - ProjectRootModificationTracker.getInstance(project), - ScriptDependenciesModificationTracker.getInstance(project) - ), - moduleFilter = { it == dependenciesModuleInfo }, - syntheticFiles = syntheticFiles - ) + "facadeForScriptDependencies", "dependencies of scripts", + project, globalContext, facadeKey, + reuseDataFrom = sdkFacade, + allModules = dependenciesModuleInfo.dependencies(), + //TODO: provide correct trackers + dependencies = listOf( + LibraryModificationTracker.getInstance(project), + ProjectRootModificationTracker.getInstance(project), + ScriptDependenciesModificationTracker.getInstance(project) + ), + moduleFilter = { it == dependenciesModuleInfo }, + syntheticFiles = syntheticFiles ) } @@ -121,45 +117,35 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { private inner class GlobalFacade(settings: PlatformAnalysisSettings) { private val sdkContext = GlobalContext() val facadeForSdk = ProjectResolutionFacade( - "facadeForSdk", - project, sdkContext, - globalResolveSessionProvider( - "sdk ${settings.sdk}", - settings, - moduleFilter = { it is SdkInfo }, - dependencies = listOf( - LibraryModificationTracker.getInstance(project), - ProjectRootModificationTracker.getInstance(project) - ) - )) + "facadeForSdk", "sdk ${settings.sdk}", + project, sdkContext, settings, + moduleFilter = { it is SdkInfo }, + dependencies = listOf( + LibraryModificationTracker.getInstance(project), + ProjectRootModificationTracker.getInstance(project) + ), + reuseDataFrom = null + ) private val librariesContext = sdkContext.contextWithNewLockAndCompositeExceptionTracker() val facadeForLibraries = ProjectResolutionFacade( - "facadeForLibraries", - project, librariesContext, - globalResolveSessionProvider( - "project libraries for platform ${settings.sdk}", - settings, - reuseDataFrom = facadeForSdk, - moduleFilter = { it is LibraryInfo }, - dependencies = listOf( - LibraryModificationTracker.getInstance(project), - ProjectRootModificationTracker.getInstance(project) - ) + "facadeForLibraries", "project libraries for platform ${settings.sdk}", + project, librariesContext, settings, + reuseDataFrom = facadeForSdk, + moduleFilter = { it is LibraryInfo }, + dependencies = listOf( + LibraryModificationTracker.getInstance(project), + ProjectRootModificationTracker.getInstance(project) ) ) - private val modulesContext = librariesContext.contextWithNewLockAndCompositeExceptionTracker() val facadeForModules = ProjectResolutionFacade( - "facadeForModules", - project, modulesContext, - globalResolveSessionProvider( - "project source roots and libraries for platform ${settings.platform}", - settings, - reuseDataFrom = facadeForLibraries, - moduleFilter = { !it.isLibraryClasses() }, - dependencies = listOf(PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)) + "facadeForModules", "project source roots and libraries for platform ${settings.platform}", + project, modulesContext, settings, + reuseDataFrom = facadeForLibraries, + moduleFilter = { !it.isLibraryClasses() }, + dependencies = listOf(PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) ) } @@ -209,14 +195,19 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { } } val dependenciesForSyntheticFileCache = listOf(PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT, filesModificationTracker) - val debugName = "completion/highlighting in $syntheticFileModule for files ${files.joinToString { it.name }} for platform $targetPlatform" + val resolverDebugName = "completion/highlighting in $syntheticFileModule for files ${files.joinToString { it.name }} for platform $targetPlatform" - fun makeGlobalResolveSessionProvider(reuseDataFrom: ProjectResolutionFacade? = null, - moduleFilter: (IdeaModuleInfo) -> Boolean = { true }, - allModules: Collection? = null - ): (GlobalContextImpl, Project) -> ModuleResolverProvider { - return globalResolveSessionProvider( + fun makeProjectResolutionFacade(debugName: String, + globalContext: GlobalContextImpl, + reuseDataFrom: ProjectResolutionFacade? = null, + moduleFilter: (IdeaModuleInfo) -> Boolean = { true }, + allModules: Collection? = null + ): ProjectResolutionFacade { + return ProjectResolutionFacade( debugName, + resolverDebugName, + project, + globalContext, settings, syntheticFiles = files, reuseDataFrom = reuseDataFrom, @@ -231,26 +222,23 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { val dependentModules = syntheticFileModule.getDependentModules() val modulesFacade = globalFacade(settings) val globalContext = modulesFacade.globalContext.contextWithNewLockAndCompositeExceptionTracker() - ProjectResolutionFacade( + makeProjectResolutionFacade( "facadeForSynthetic in ModuleSourceInfo", - project, globalContext, - makeGlobalResolveSessionProvider( - reuseDataFrom = modulesFacade, - moduleFilter = { it in dependentModules }) + globalContext, + reuseDataFrom = modulesFacade, + moduleFilter = { it in dependentModules } ) } syntheticFileModule is ScriptModuleInfo -> { val facadeForScriptDependencies = getFacadeForScriptDependencies(syntheticFileModule) val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker() - ProjectResolutionFacade( + makeProjectResolutionFacade( "facadeForSynthetic in ScriptModuleInfo", - project, globalContext, - makeGlobalResolveSessionProvider( - reuseDataFrom = facadeForScriptDependencies, - allModules = syntheticFileModule.dependencies(), - moduleFilter = { it == syntheticFileModule } - ) + globalContext, + reuseDataFrom = facadeForScriptDependencies, + allModules = syntheticFileModule.dependencies(), + moduleFilter = { it == syntheticFileModule } ) } syntheticFileModule is ScriptDependenciesModuleInfo -> { @@ -260,27 +248,23 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { // TODO: can be optimized by caching facadeForScriptDependencies val facadeForScriptDependencies = createFacadeForScriptDependencies(syntheticFileModule.binariesModuleInfo, files) val globalContext = facadeForScriptDependencies.globalContext.contextWithNewLockAndCompositeExceptionTracker() - ProjectResolutionFacade( + makeProjectResolutionFacade( "facadeForSynthetic in ScriptDependenciesSourceModuleInfo", - project, globalContext, - makeGlobalResolveSessionProvider( - reuseDataFrom = facadeForScriptDependencies, - allModules = syntheticFileModule.dependencies(), - moduleFilter = { it == syntheticFileModule } - ) + globalContext, + reuseDataFrom = facadeForScriptDependencies, + allModules = syntheticFileModule.dependencies(), + moduleFilter = { it == syntheticFileModule } ) } syntheticFileModule is LibrarySourceInfo || syntheticFileModule is NotUnderContentRootModuleInfo -> { val librariesFacade = librariesFacade(settings) val globalContext = librariesFacade.globalContext.contextWithNewLockAndCompositeExceptionTracker() - ProjectResolutionFacade( + makeProjectResolutionFacade( "facadeForSynthetic in LibrarySourceInfo or NotUnderContentRootModuleInfo", - project, globalContext, - makeGlobalResolveSessionProvider( - reuseDataFrom = librariesFacade, - moduleFilter = { it == syntheticFileModule } - ) + globalContext, + reuseDataFrom = librariesFacade, + moduleFilter = { it == syntheticFileModule } ) } @@ -290,10 +274,9 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { // (file under both classes and sources root) LOG.warn("Creating cache with synthetic files ($files) in classes of library $syntheticFileModule") val globalContext = GlobalContext() - ProjectResolutionFacade( + makeProjectResolutionFacade( "facadeForSynthetic for file under both classes and root", - project, globalContext, - makeGlobalResolveSessionProvider() + globalContext ) } @@ -392,19 +375,21 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { } } -private fun globalResolveSessionProvider( +internal fun globalResolveSessionProvider( debugName: String, + project: Project, + globalContext: GlobalContextImpl, settings: PlatformAnalysisSettings, dependencies: Collection, moduleFilter: (IdeaModuleInfo) -> Boolean, reuseDataFrom: ProjectResolutionFacade? = null, syntheticFiles: Collection = listOf(), allModules: Collection? = null // null means create resolvers for modules from idea model -): (GlobalContextImpl, Project) -> ModuleResolverProvider = { globalContext, project -> +): ModuleResolverProvider { val delegateResolverProvider = reuseDataFrom?.moduleResolverProvider val delegateResolverForProject = delegateResolverProvider?.resolverForProject ?: EmptyResolverForProject() - createModuleResolverProvider( + return createModuleResolverProvider( debugName, project, globalContext, settings, syntheticFiles, delegateResolverForProject, moduleFilter, allModules, 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 5cba34c7179..f5de91151fe 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 @@ -69,8 +69,7 @@ fun createModuleResolverProvider( ModuleContent(syntheticFilesByModule[module] ?: listOf(), module.contentScope()) } - val jvmPlatformParameters = JvmPlatformParameters { - javaClass: JavaClass -> + val jvmPlatformParameters = JvmPlatformParameters { javaClass: JavaClass -> val psiClass = (javaClass as JavaClassImpl).psi psiClass.getNullableModuleInfo() } 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 5e2fbe97a2b..38c2013b03b 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 @@ -30,18 +30,38 @@ import org.jetbrains.kotlin.resolve.CompositeBindingContext internal class ProjectResolutionFacade( val debugString: String, + val resolverDebugName: String, val project: Project, val globalContext: GlobalContextImpl, - computeModuleResolverProvider: (GlobalContextImpl, Project) -> ModuleResolverProvider + val settings: PlatformAnalysisSettings, + val reuseDataFrom: ProjectResolutionFacade?, + val moduleFilter: (IdeaModuleInfo) -> Boolean, + val dependencies: List, + val syntheticFiles: Collection = listOf(), + val allModules: Collection? = null // null means create resolvers for modules from idea model ) { private val cachedValue = CachedValuesManager.getManager(project).createCachedValue( { - val resolverProvider = computeModuleResolverProvider(globalContext, project) + val resolverProvider = computeModuleResolverProvider() CachedValueProvider.Result.create(resolverProvider, resolverProvider.cacheDependencies) }, /* trackValue = */ false ) + private fun computeModuleResolverProvider(): ModuleResolverProvider { + return globalResolveSessionProvider( + resolverDebugName, + project, + globalContext, + settings, + moduleFilter = moduleFilter, + dependencies = dependencies, + reuseDataFrom = reuseDataFrom, + allModules = allModules, + syntheticFiles = syntheticFiles + ) + } + val moduleResolverProvider: ModuleResolverProvider get() = globalContext.storageManager.compute { cachedValue.value }