KotlinCacheServiceImpl: cache all script dependencies as whole to provide faster completion in scripts
A lot of stuff to be fixed after
This commit is contained in:
+32
-5
@@ -67,6 +67,26 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
|
|
||||||
private val globalContext = GlobalContext(logProcessCanceled = true)
|
private val globalContext = GlobalContext(logProcessCanceled = true)
|
||||||
|
|
||||||
|
// TODO: soft reference?
|
||||||
|
// TODO: cache by script definition?
|
||||||
|
private val facadeForScriptDependencies by lazy {
|
||||||
|
ProjectResolutionFacade(project, globalContext.storageManager) {
|
||||||
|
globalResolveSessionProvider(
|
||||||
|
"dependencies of scripts",
|
||||||
|
project,
|
||||||
|
JvmPlatform, // TODO: Js scripts?
|
||||||
|
null, // TODO: provide sdk via dependencies
|
||||||
|
commonGlobalContext = globalContext,
|
||||||
|
allModules = listOf(ScriptDependenciesModuleInfo(project)),
|
||||||
|
dependencies = listOf(
|
||||||
|
LibraryModificationTracker.getInstance(project), //TODO: provide correct trackers
|
||||||
|
ProjectRootModificationTracker.getInstance(project)
|
||||||
|
),
|
||||||
|
moduleFilter = { true }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private inner class GlobalFacade(platform: TargetPlatform, sdk: Sdk?) {
|
private inner class GlobalFacade(platform: TargetPlatform, sdk: Sdk?) {
|
||||||
val facadeForLibraries = ProjectResolutionFacade(project, globalContext.storageManager) {
|
val facadeForLibraries = ProjectResolutionFacade(project, globalContext.storageManager) {
|
||||||
globalResolveSessionProvider(
|
globalResolveSessionProvider(
|
||||||
@@ -123,7 +143,8 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
val debugName = "completion/highlighting in $syntheticFileModule for files ${files.joinToString { it.name }} for platform $targetPlatform"
|
val debugName = "completion/highlighting in $syntheticFileModule for files ${files.joinToString { it.name }} for platform $targetPlatform"
|
||||||
|
|
||||||
fun makeGlobalResolveSessionProvider(reuseDataFrom: ProjectResolutionFacade? = null,
|
fun makeGlobalResolveSessionProvider(reuseDataFrom: ProjectResolutionFacade? = null,
|
||||||
moduleFilter: (IdeaModuleInfo) -> Boolean = { true }
|
moduleFilter: (IdeaModuleInfo) -> Boolean = { true },
|
||||||
|
allModules: Collection<IdeaModuleInfo>? = null
|
||||||
): CachedValueProvider.Result<ModuleResolverProvider> {
|
): CachedValueProvider.Result<ModuleResolverProvider> {
|
||||||
return globalResolveSessionProvider(
|
return globalResolveSessionProvider(
|
||||||
debugName,
|
debugName,
|
||||||
@@ -134,7 +155,8 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
syntheticFiles = files,
|
syntheticFiles = files,
|
||||||
reuseDataFrom = reuseDataFrom,
|
reuseDataFrom = reuseDataFrom,
|
||||||
moduleFilter = moduleFilter,
|
moduleFilter = moduleFilter,
|
||||||
dependencies = dependenciesForSyntheticFileCache
|
dependencies = dependenciesForSyntheticFileCache,
|
||||||
|
allModules = allModules
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -150,7 +172,11 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService {
|
|||||||
|
|
||||||
syntheticFileModule is ScriptModuleInfo || syntheticFileModule is ScriptDependenciesModuleInfo -> {
|
syntheticFileModule is ScriptModuleInfo || syntheticFileModule is ScriptDependenciesModuleInfo -> {
|
||||||
ProjectResolutionFacade(project, globalContext.storageManager) {
|
ProjectResolutionFacade(project, globalContext.storageManager) {
|
||||||
makeGlobalResolveSessionProvider()
|
makeGlobalResolveSessionProvider(
|
||||||
|
reuseDataFrom = facadeForScriptDependencies,
|
||||||
|
allModules = listOf(syntheticFileModule) + syntheticFileModule.dependencies(),
|
||||||
|
moduleFilter = { it == syntheticFileModule }
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +284,8 @@ private fun globalResolveSessionProvider(
|
|||||||
moduleFilter: (IdeaModuleInfo) -> Boolean,
|
moduleFilter: (IdeaModuleInfo) -> Boolean,
|
||||||
commonGlobalContext: GlobalContextImpl,
|
commonGlobalContext: GlobalContextImpl,
|
||||||
reuseDataFrom: ProjectResolutionFacade? = null,
|
reuseDataFrom: ProjectResolutionFacade? = null,
|
||||||
syntheticFiles: Collection<KtFile> = listOf()
|
syntheticFiles: Collection<KtFile> = listOf(),
|
||||||
|
allModules: Collection<IdeaModuleInfo>? = null // null means create resolvers for modules from idea model
|
||||||
): CachedValueProvider.Result<ModuleResolverProvider> {
|
): CachedValueProvider.Result<ModuleResolverProvider> {
|
||||||
val delegateResolverProvider = reuseDataFrom?.moduleResolverProvider
|
val delegateResolverProvider = reuseDataFrom?.moduleResolverProvider
|
||||||
val delegateResolverForProject = delegateResolverProvider?.resolverForProject ?: EmptyResolverForProject()
|
val delegateResolverForProject = delegateResolverProvider?.resolverForProject ?: EmptyResolverForProject()
|
||||||
@@ -274,7 +301,7 @@ private fun globalResolveSessionProvider(
|
|||||||
debugName, project, globalContext, sdk,
|
debugName, project, globalContext, sdk,
|
||||||
AnalyzerFacadeProvider.getAnalyzerFacade(platform),
|
AnalyzerFacadeProvider.getAnalyzerFacade(platform),
|
||||||
syntheticFiles, delegateResolverForProject, moduleFilter,
|
syntheticFiles, delegateResolverForProject, moduleFilter,
|
||||||
builtIns
|
allModules, builtIns
|
||||||
)
|
)
|
||||||
|
|
||||||
if (builtIns is JvmBuiltIns) {
|
if (builtIns is JvmBuiltIns) {
|
||||||
|
|||||||
+3
-2
@@ -44,14 +44,15 @@ fun createModuleResolverProvider(
|
|||||||
syntheticFiles: Collection<KtFile>,
|
syntheticFiles: Collection<KtFile>,
|
||||||
delegateResolver: ResolverForProject<IdeaModuleInfo>,
|
delegateResolver: ResolverForProject<IdeaModuleInfo>,
|
||||||
moduleFilter: (IdeaModuleInfo) -> Boolean,
|
moduleFilter: (IdeaModuleInfo) -> Boolean,
|
||||||
|
allModules: Collection<IdeaModuleInfo>?,
|
||||||
builtIns: KotlinBuiltIns
|
builtIns: KotlinBuiltIns
|
||||||
): ModuleResolverProvider {
|
): ModuleResolverProvider {
|
||||||
|
|
||||||
val allModuleInfos = collectAllModuleInfosFromIdeaModel(project).toHashSet()
|
val allModuleInfos = (allModules ?: collectAllModuleInfosFromIdeaModel(project)).toHashSet()
|
||||||
|
|
||||||
val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() }
|
val syntheticFilesByModule = syntheticFiles.groupBy { it.getModuleInfo() }
|
||||||
val syntheticFilesModules = syntheticFilesByModule.keys
|
val syntheticFilesModules = syntheticFilesByModule.keys
|
||||||
allModuleInfos.addAll(syntheticFilesModules + syntheticFilesModules.flatMap { it.dependencies() })
|
allModuleInfos.addAll(syntheticFilesModules)
|
||||||
|
|
||||||
val modulesToCreateResolversFor = allModuleInfos.filter(moduleFilter)
|
val modulesToCreateResolversFor = allModuleInfos.filter(moduleFilter)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user