Make LibraryDependenciesCache cache again!

#KT-17495 fixed
This commit is contained in:
Simon Ogorodnik
2017-04-19 20:32:05 +03:00
parent 99653b9afc
commit 4978a204f0
3 changed files with 29 additions and 3 deletions
@@ -197,7 +197,7 @@ class LibraryInfo(val project: Project, val library: Library) : IdeaModuleInfo,
val result = LinkedHashSet<IdeaModuleInfo>()
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) }
@@ -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<Library>, List<Sdk>>
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<Library, LibrariesAndSdks>(),
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<Library>, List<Sdk>> {
private fun computeLibrariesAndSdksUsedWith(library: Library): LibrariesAndSdks {
val processedModules = HashSet<Module>()
val condition = Condition<OrderEntry> { orderEntry ->
if (orderEntry is ModuleOrderEntry) {
+3
View File
@@ -316,6 +316,9 @@
<projectService serviceImplementation="org.jetbrains.kotlin.idea.caches.PerModulePackageCacheService"/>
<projectService serviceInterface="org.jetbrains.kotlin.idea.caches.resolve.LibraryDependenciesCache"
serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.LibraryDependenciesCacheImpl"/>
<errorHandler implementation="org.jetbrains.kotlin.idea.reporter.KotlinReportSubmitter"/>
<internalFileTemplate name="Kotlin File"/>