From abd20e3a90bb82cec5a517e46f3fbc3851523ba8 Mon Sep 17 00:00:00 2001 From: Dmitry Savvinov Date: Tue, 24 Mar 2020 15:37:38 +0300 Subject: [PATCH] Cache Library -> LibraryInfo mapping With Klibs, creation of LibraryInfo isn't that cheap now -- it usually involves inspecting files in roots, reading manifest and such (see for example NativePlatformKindResolution.createLibraryInfo) --- .../kotlin/idea/caches/project/IdeaModuleInfos.kt | 14 +++++++++++--- .../idea/caches/resolve/KotlinCacheServiceImpl.kt | 6 +++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt index e3801d125e9..c8cc4350307 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/project/IdeaModuleInfos.kt @@ -19,6 +19,7 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.search.GlobalSearchScope import com.intellij.util.PathUtil import com.intellij.util.SmartList +import com.intellij.util.containers.ContainerUtil import org.jetbrains.jps.model.java.JavaSourceRootType import org.jetbrains.jps.model.module.JpsModuleSourceRootType import org.jetbrains.kotlin.analyzer.CombinedModuleInfo @@ -26,6 +27,7 @@ import org.jetbrains.kotlin.analyzer.LibraryModuleInfo import org.jetbrains.kotlin.analyzer.ModuleInfo import org.jetbrains.kotlin.analyzer.TrackableModuleInfo import org.jetbrains.kotlin.caches.project.cacheByClassInvalidatingOnRootModifications +import org.jetbrains.kotlin.caches.project.cacheInvalidatingOnRootModifications import org.jetbrains.kotlin.caches.resolve.resolution import org.jetbrains.kotlin.config.SourceKotlinRootType import org.jetbrains.kotlin.config.TestSourceKotlinRootType @@ -104,10 +106,16 @@ private fun orderEntryToModuleInfo(project: Project, orderEntry: OrderEntry, for } } -fun createLibraryInfo(project: Project, library: Library): List { - return getLibraryPlatform(project, library).idePlatformKind.resolution.createLibraryInfo(project, library) -} +val Project.libraryInfoCache: MutableMap> + get() = cacheInvalidatingOnRootModifications { ContainerUtil.createConcurrentWeakMap() } +fun createLibraryInfo(project: Project, library: Library): List { + val cache = project.libraryInfoCache + + return cache.getOrPut(library) { + getLibraryPlatform(project, library).idePlatformKind.resolution.createLibraryInfo(project, library) + } +} private fun OrderEntry.acceptAsDependency(forProduction: Boolean): Boolean { return this !is ExportableOrderEntry diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt index 03c8612fc92..bb6de03c253 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/KotlinCacheServiceImpl.kt @@ -226,14 +226,14 @@ class KotlinCacheServiceImpl(val project: Project) : KotlinCacheService { } private fun IdeaModuleInfo.platformSettings(targetPlatform: TargetPlatform) = PlatformAnalysisSettings.create( - project, targetPlatform, sdk, - supportsAdditionalBuiltInsMembers(project), + this@KotlinCacheServiceImpl.project, targetPlatform, sdk, + supportsAdditionalBuiltInsMembers(this@KotlinCacheServiceImpl.project), isReleaseCoroutines() ) private fun IdeaModuleInfo.isReleaseCoroutines(): Boolean { return IDELanguageSettingsProvider - .getLanguageVersionSettings(this, project) + .getLanguageVersionSettings(this, this@KotlinCacheServiceImpl.project) .supportsFeature(LanguageFeature.ReleaseCoroutines) }