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, builtinTypes: BuiltinTypes,
sessionsCache: MutableMap<ModuleSourceInfo, FirIdeSourcesSession>, sessionsCache: MutableMap<ModuleSourceInfo, FirIdeSourcesSession>,
isRootModule: Boolean, isRootModule: Boolean,
librariesCache: LibrariesCache,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirIdeSourcesSession { ): FirIdeSourcesSession {
sessionsCache[moduleInfo]?.let { return it } sessionsCache[moduleInfo]?.let { return it }
@@ -99,7 +100,15 @@ internal object FirIdeSessionFactory {
JavaSymbolProvider(this@apply, project, searchScope), JavaSymbolProvider(this@apply, project, searchScope),
), ),
dependentProviders = buildList { dependentProviders = buildList {
add(createLibrarySession(moduleInfo, project, builtinsAndCloneableSession, builtinTypes).firSymbolProvider) add(
createLibrarySession(
moduleInfo,
project,
builtinsAndCloneableSession,
builtinTypes,
librariesCache
).firSymbolProvider
)
dependentModules dependentModules
.mapTo(this) { .mapTo(this) {
createSourcesSession( createSourcesSession(
@@ -110,7 +119,8 @@ internal object FirIdeSessionFactory {
sessionInvalidator, sessionInvalidator,
builtinTypes, builtinTypes,
sessionsCache, sessionsCache,
isRootModule = false isRootModule = false,
librariesCache,
).firSymbolProvider ).firSymbolProvider
} }
} }
@@ -133,8 +143,9 @@ internal object FirIdeSessionFactory {
project: Project, project: Project,
builtinsAndCloneableSession: FirIdeBuiltinsAndCloneableSession, builtinsAndCloneableSession: FirIdeBuiltinsAndCloneableSession,
builtinTypes: BuiltinTypes, builtinTypes: BuiltinTypes,
librariesCache: LibrariesCache,
languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT, languageVersionSettings: LanguageVersionSettings = LanguageVersionSettingsImpl.DEFAULT,
): FirIdeLibrariesSession { ): FirIdeLibrariesSession = librariesCache.cached(moduleInfo) {
checkCanceled() checkCanceled()
val searchScope = ModuleLibrariesSearchScope(moduleInfo.module) val searchScope = ModuleLibrariesSearchScope(moduleInfo.module)
val javaClassFinder = JavaClassFinderImpl().apply { val javaClassFinder = JavaClassFinderImpl().apply {
@@ -144,7 +155,7 @@ internal object FirIdeSessionFactory {
val packagePartProvider = IDEPackagePartProvider(searchScope) val packagePartProvider = IDEPackagePartProvider(searchScope)
val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope) val kotlinClassFinder = VirtualFileFinderFactory.getInstance(project).create(searchScope)
return FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply { FirIdeLibrariesSession(moduleInfo, project, searchScope, builtinTypes).apply {
registerCommonComponents(languageVersionSettings) registerCommonComponents(languageVersionSettings)
registerJavaSpecificResolveComponents() registerJavaSpecificResolveComponents()
registerIdeComponents() registerIdeComponents()
@@ -9,18 +9,23 @@ import com.intellij.openapi.project.Project
import kotlinx.collections.immutable.PersistentMap import kotlinx.collections.immutable.PersistentMap
import kotlinx.collections.immutable.persistentMapOf import kotlinx.collections.immutable.persistentMapOf
import kotlinx.collections.immutable.toPersistentMap import kotlinx.collections.immutable.toPersistentMap
import org.jetbrains.kotlin.analyzer.LibraryModuleInfo
import org.jetbrains.kotlin.fir.BuiltinTypes 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.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.FirPhaseRunner 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.trackers.KotlinFirOutOfBlockModificationTrackerFactory
import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor 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.fir.low.level.api.util.executeWithoutPCE
import org.jetbrains.kotlin.idea.util.*
import org.jetbrains.kotlin.trackers.createModuleWithoutDependenciesOutOfBlockModificationTracker import org.jetbrains.kotlin.trackers.createModuleWithoutDependenciesOutOfBlockModificationTracker
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
internal class FirIdeSessionProviderStorage(private val project: Project) { internal class FirIdeSessionProviderStorage(private val project: Project) {
private val sessionsCache = ConcurrentHashMap<ModuleSourceInfo, FromModuleViewSessionCache>() private val sessionsCache = ConcurrentHashMap<ModuleSourceInfo, FromModuleViewSessionCache>()
private val librariesCache by cachedValue(project, LibraryModificationTracker.getInstance(project)) { LibrariesCache() }
fun getSessionProvider(rootModule: ModuleSourceInfo): FirIdeSessionProvider { fun getSessionProvider(rootModule: ModuleSourceInfo): FirIdeSessionProvider {
val firPhaseRunner = FirPhaseRunner() val firPhaseRunner = FirPhaseRunner()
@@ -38,7 +43,8 @@ internal class FirIdeSessionProviderStorage(private val project: Project) {
cache.sessionInvalidator, cache.sessionInvalidator,
builtinTypes, builtinTypes,
sessions, sessions,
isRootModule = true isRootModule = true,
librariesCache,
) )
} }
sessions to session 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)
}