From d53af8170b4638d80db5c3c002860d02db8cd2bf Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 30 Dec 2020 19:41:39 +0100 Subject: [PATCH] FIR IDE: cache module libraries --- .../api/sessions/FirIdeSessionFactory.kt | 19 +++++++++++++++---- .../sessions/FirIdeSessionProviderStorage.kt | 8 +++++++- .../low/level/api/sessions/LibrariesCache.kt | 14 ++++++++++++++ 3 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/LibrariesCache.kt diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 0ecb941a0ae..99ede8b4444 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -54,6 +54,7 @@ internal object FirIdeSessionFactory { builtinTypes: BuiltinTypes, sessionsCache: MutableMap, 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() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt index 3d6bf7b2ad5..0c0d62c6e9e 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt @@ -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() + 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 diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/LibrariesCache.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/LibrariesCache.kt new file mode 100644 index 00000000000..776094db9da --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/LibrariesCache.kt @@ -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 = ConcurrentHashMap()) { + fun cached(moduleSourceInfo: ModuleSourceInfo, create: (ModuleSourceInfo) -> FirIdeLibrariesSession): FirIdeLibrariesSession = + cache.computeIfAbsent(moduleSourceInfo, create) +} \ No newline at end of file