FIR IDE: cache module libraries

This commit is contained in:
Ilya Kirillov
2020-12-30 19:41:39 +01:00
parent 8c113f02d5
commit d53af8170b
3 changed files with 36 additions and 5 deletions
@@ -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()
@@ -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
@@ -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)
}