Remove one level of indirection from ModuleResolverProvider creation

This commit is contained in:
Dmitry Jemerov
2017-07-26 13:42:32 +02:00
parent 3debca09ea
commit 194deccd09
3 changed files with 92 additions and 88 deletions
@@ -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<IdeaModuleInfo>? = null
): (GlobalContextImpl, Project) -> ModuleResolverProvider {
return globalResolveSessionProvider(
fun makeProjectResolutionFacade(debugName: String,
globalContext: GlobalContextImpl,
reuseDataFrom: ProjectResolutionFacade? = null,
moduleFilter: (IdeaModuleInfo) -> Boolean = { true },
allModules: Collection<IdeaModuleInfo>? = 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<Any>,
moduleFilter: (IdeaModuleInfo) -> Boolean,
reuseDataFrom: ProjectResolutionFacade? = null,
syntheticFiles: Collection<KtFile> = listOf(),
allModules: Collection<IdeaModuleInfo>? = 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,
@@ -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()
}
@@ -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<Any>,
val syntheticFiles: Collection<KtFile> = listOf(),
val allModules: Collection<IdeaModuleInfo>? = 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 }