diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt index 5b9c023a399..dbbb53861a7 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/IdeaModuleInfos.kt @@ -197,7 +197,7 @@ class LibraryInfo(val project: Project, val library: Library) : IdeaModuleInfo, val result = LinkedHashSet() result.add(this) - val (libraries, sdks) = LibraryDependenciesCache(project).getLibrariesAndSdksUsedWith(library) + val (libraries, sdks) = LibraryDependenciesCache.getInstance(project).getLibrariesAndSdksUsedWith(library) sdks.mapTo(result) { SdkInfo(project, it) } libraries.filter { it is LibraryEx && !it.isDisposed }.mapTo(result) { LibraryInfo(project, it) } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LibraryDependenciesCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LibraryDependenciesCache.kt index d333d9d6751..37da70e5736 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LibraryDependenciesCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/LibraryDependenciesCache.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.caches.resolve +import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager import com.intellij.openapi.project.Project @@ -25,16 +26,38 @@ import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.util.Condition import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.util.CachedValuesManager +import com.intellij.util.containers.ContainerUtil import com.intellij.util.containers.MultiMap +import org.jetbrains.kotlin.idea.core.util.CachedValue +import org.jetbrains.kotlin.idea.core.util.getValue import org.jetbrains.kotlin.idea.project.TargetPlatformDetector import org.jetbrains.kotlin.resolve.TargetPlatform import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* -class LibraryDependenciesCache(private val project: Project) { +internal typealias LibrariesAndSdks = Pair, List> + +interface LibraryDependenciesCache { + companion object { + fun getInstance(project: Project) = ServiceManager.getService(project, LibraryDependenciesCache::class.java)!! + } + + fun getLibrariesAndSdksUsedWith(library: Library): LibrariesAndSdks +} + +class LibraryDependenciesCacheImpl(private val project: Project) : LibraryDependenciesCache { + + val cache by CachedValue(project) { + CachedValueProvider.Result(ContainerUtil.createConcurrentWeakMap(), + ProjectRootManager.getInstance(project)) + } + + override fun getLibrariesAndSdksUsedWith(library: Library): LibrariesAndSdks = + cache.getOrPut(library) { computeLibrariesAndSdksUsedWith(library) } + //NOTE: used LibraryRuntimeClasspathScope as reference - fun getLibrariesAndSdksUsedWith(library: Library): Pair, List> { + private fun computeLibrariesAndSdksUsedWith(library: Library): LibrariesAndSdks { val processedModules = HashSet() val condition = Condition { orderEntry -> if (orderEntry is ModuleOrderEntry) { diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index ff27082c99a..80c88cb3adc 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -316,6 +316,9 @@ + +