FIR IDE: cache module libraries
This commit is contained in:
+15
-4
@@ -54,6 +54,7 @@ internal object FirIdeSessionFactory {
|
||||
builtinTypes: BuiltinTypes,
|
||||
sessionsCache: MutableMap<ModuleSourceInfo, FirIdeSourcesSession>,
|
||||
isRootModule: Boolean,
|
||||
librariesCache: LibrariesCache,
|
||||
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
|
||||
): FirIdeSourcesSession {
|
||||
sessionsCache[moduleInfo]?.let { return it }
|
||||
@@ -99,7 +100,15 @@ internal object FirIdeSessionFactory {
|
||||
JavaSymbolProvider(this@apply, project, searchScope),
|
||||
),
|
||||
dependentProviders = buildList {
|
||||
add(createLibrarySession(moduleInfo, project, builtinsAndCloneableSession, builtinTypes).firSymbolProvider)
|
||||
add(
|
||||
createLibrarySession(
|
||||
moduleInfo,
|
||||
project,
|
||||
builtinsAndCloneableSession,
|
||||
builtinTypes,
|
||||
librariesCache
|
||||
).firSymbolProvider
|
||||
)
|
||||
dependentModules
|
||||
.mapTo(this) {
|
||||
createSourcesSession(
|
||||
@@ -110,7 +119,8 @@ internal object FirIdeSessionFactory {
|
||||
sessionInvalidator,
|
||||
builtinTypes,
|
||||
sessionsCache,
|
||||
isRootModule = false
|
||||
isRootModule = false,
|
||||
librariesCache,
|
||||
).firSymbolProvider
|
||||
}
|
||||
}
|
||||
@@ -133,8 +143,9 @@ internal object FirIdeSessionFactory {
|
||||
project: Project,
|
||||
builtinsAndCloneableSession: FirIdeBuiltinsAndCloneableSession,
|
||||
builtinTypes: BuiltinTypes,
|
||||
librariesCache: LibrariesCache,
|
||||
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
|
||||
): FirIdeLibrariesSession {
|
||||
): FirIdeLibrariesSession = librariesCache.cached(moduleInfo) {
|
||||
checkCanceled()
|
||||
val searchScope = ModuleLibrariesSearchScope(moduleInfo.module)
|
||||
val javaClassFinder = JavaClassFinderImpl().apply {
|
||||
@@ -144,7 +155,7 @@ internal object FirIdeSessionFactory {
|
||||
val packagePartProvider = IDEPackagePartProvider(searchScope)
|
||||
|
||||
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
|
||||
return FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply {
|
||||
FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply {
|
||||
registerCommonComponents(languageVersionSettings)
|
||||
registerJavaSpecificResolveComponents()
|
||||
registerIdeComponents()
|
||||
|
||||
+7
-1
@@ -9,18 +9,23 @@ import com.intellij.openapi.project.Project
|
||||
import kotlinx.collections.immutable.PersistentMap
|
||||
import kotlinx.collections.immutable.persistentMapOf
|
||||
import kotlinx.collections.immutable.toPersistentMap
|
||||
import org.jetbrains.kotlin.analyzer.LibraryModuleInfo
|
||||
import org.jetbrains.kotlin.fir.BuiltinTypes
|
||||
import org.jetbrains.kotlin.idea.caches.project.LibraryModificationTracker
|
||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor
|
||||
import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE
|
||||
import org.jetbrains.kotlin.idea.util.*
|
||||
import org.jetbrains.kotlin.trackers.createModuleWithoutDependenciesOutOfBlockModificationTracker
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
internal class FirIdeSessionProviderStorage(private val project: Project) {
|
||||
private val sessionsCache = ConcurrentHashMap<ModuleSourceInfo, FromModuleViewSessionCache>()
|
||||
|
||||
private val librariesCache by cachedValue(project, LibraryModificationTracker.getInstance(project)) { LibrariesCache() }
|
||||
|
||||
fun getSessionProvider(rootModule: ModuleSourceInfo): FirIdeSessionProvider {
|
||||
val firPhaseRunner = FirPhaseRunner()
|
||||
|
||||
@@ -38,7 +43,8 @@ internal class FirIdeSessionProviderStorage(private val project: Project) {
|
||||
cache.sessionInvalidator,
|
||||
builtinTypes,
|
||||
sessions,
|
||||
isRootModule = true
|
||||
isRootModule = true,
|
||||
librariesCache,
|
||||
)
|
||||
}
|
||||
sessions to session
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
|
||||
|
||||
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
internal inline class LibrariesCache(private val cache: ConcurrentHashMap<ModuleSourceInfo, FirIdeLibrariesSession> = ConcurrentHashMap()) {
|
||||
fun cached(moduleSourceInfo: ModuleSourceInfo, create: (ModuleSourceInfo) -> FirIdeLibrariesSession): FirIdeLibrariesSession =
|
||||
cache.computeIfAbsent(moduleSourceInfo, create)
|
||||
}
|
||||
Reference in New Issue
Block a user