Minor cleanup in LibraryDependenciesCache
This commit is contained in:
+21
-35
@@ -16,32 +16,25 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.caches.resolve
|
package org.jetbrains.kotlin.idea.caches.resolve
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import com.intellij.openapi.module.Module
|
import com.intellij.openapi.module.Module
|
||||||
import com.intellij.openapi.roots.libraries.Library
|
|
||||||
import com.intellij.util.containers.MultiMap
|
|
||||||
import com.intellij.psi.util.CachedValuesManager
|
|
||||||
import com.intellij.psi.util.CachedValueProvider
|
|
||||||
import com.intellij.openapi.roots.ProjectRootModificationTracker
|
|
||||||
import com.intellij.openapi.module.ModuleManager
|
import com.intellij.openapi.module.ModuleManager
|
||||||
import com.intellij.openapi.roots.ModuleRootManager
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.roots.LibraryOrderEntry
|
|
||||||
import com.intellij.openapi.roots.OrderEntry
|
|
||||||
import com.intellij.openapi.roots.ModuleOrderEntry
|
|
||||||
import com.intellij.openapi.util.Condition
|
|
||||||
import java.util.LinkedHashSet
|
|
||||||
import com.intellij.openapi.roots.RootPolicy
|
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
|
||||||
import com.intellij.openapi.projectRoots.Sdk
|
import com.intellij.openapi.projectRoots.Sdk
|
||||||
import com.intellij.openapi.roots.JdkOrderEntry
|
import com.intellij.openapi.roots.*
|
||||||
import com.intellij.openapi.roots.ModuleSourceOrderEntry
|
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.MultiMap
|
||||||
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
class LibraryDependenciesCache(private val project: Project) {
|
class LibraryDependenciesCache(private val project: Project) {
|
||||||
|
|
||||||
//NOTE: used LibraryRuntimeClasspathScope as reference
|
//NOTE: used LibraryRuntimeClasspathScope as reference
|
||||||
fun getLibrariesAndSdksUsedWith(library: Library): Pair<List<Library>, List<Sdk>> {
|
fun getLibrariesAndSdksUsedWith(library: Library): Pair<List<Library>, List<Sdk>> {
|
||||||
val processedModules = LinkedHashSet<Module>()
|
val processedModules = HashSet<Module>()
|
||||||
val condition = Condition<OrderEntry>() { orderEntry ->
|
val condition = Condition<OrderEntry> { orderEntry ->
|
||||||
if (orderEntry is ModuleOrderEntry) {
|
if (orderEntry is ModuleOrderEntry) {
|
||||||
val module = orderEntry.module
|
val module = orderEntry.module
|
||||||
module != null && module !in processedModules
|
module != null && module !in processedModules
|
||||||
@@ -54,29 +47,24 @@ class LibraryDependenciesCache(private val project: Project) {
|
|||||||
val libraries = LinkedHashSet<Library>()
|
val libraries = LinkedHashSet<Library>()
|
||||||
val sdks = LinkedHashSet<Sdk>()
|
val sdks = LinkedHashSet<Sdk>()
|
||||||
|
|
||||||
fun collectLibrariesAndSdksAcrossDependencies(module: Module) {
|
for (module in getLibraryUsageIndex().modulesLibraryIsUsedIn[library]) {
|
||||||
if (!processedModules.add(module)) return
|
if (!processedModules.add(module)) continue
|
||||||
|
|
||||||
ModuleRootManager.getInstance(module).orderEntries().recursively().satisfying(condition).process(object : RootPolicy<Unit>() {
|
ModuleRootManager.getInstance(module).orderEntries().recursively().satisfying(condition).process(object : RootPolicy<Unit>() {
|
||||||
override fun visitModuleSourceOrderEntry(moduleSourceOrderEntry: ModuleSourceOrderEntry?, value: Unit?): Unit? {
|
override fun visitModuleSourceOrderEntry(moduleSourceOrderEntry: ModuleSourceOrderEntry, value: Unit) {
|
||||||
processedModules.addIfNotNull(moduleSourceOrderEntry?.ownerModule)
|
processedModules.add(moduleSourceOrderEntry.ownerModule)
|
||||||
return Unit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitLibraryOrderEntry(libraryOrderEntry: LibraryOrderEntry?, value: Unit?): Unit? {
|
override fun visitLibraryOrderEntry(libraryOrderEntry: LibraryOrderEntry, value: Unit) {
|
||||||
libraries.addIfNotNull(libraryOrderEntry?.library)
|
libraries.addIfNotNull(libraryOrderEntry.library)
|
||||||
return Unit
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitJdkOrderEntry(jdkOrderEntry: JdkOrderEntry?, value: Unit?): Unit? {
|
override fun visitJdkOrderEntry(jdkOrderEntry: JdkOrderEntry, value: Unit) {
|
||||||
sdks.addIfNotNull(jdkOrderEntry?.jdk)
|
sdks.addIfNotNull(jdkOrderEntry.jdk)
|
||||||
return Unit
|
|
||||||
}
|
}
|
||||||
}, Unit)
|
}, Unit)
|
||||||
}
|
}
|
||||||
|
|
||||||
getLibraryUsageIndex().modulesLibraryIsUsedIn[library].forEach(::collectLibrariesAndSdksAcrossDependencies)
|
|
||||||
|
|
||||||
return Pair(libraries.toList(), sdks.toList())
|
return Pair(libraries.toList(), sdks.toList())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,10 +78,8 @@ class LibraryDependenciesCache(private val project: Project) {
|
|||||||
val modulesLibraryIsUsedIn: MultiMap<Library, Module> = MultiMap.createSet()
|
val modulesLibraryIsUsedIn: MultiMap<Library, Module> = MultiMap.createSet()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
ModuleManager.getInstance(project).modules.forEach {
|
for (module in ModuleManager.getInstance(project).modules) {
|
||||||
module ->
|
for (entry in ModuleRootManager.getInstance(module).orderEntries) {
|
||||||
ModuleRootManager.getInstance(module).orderEntries.forEach {
|
|
||||||
entry ->
|
|
||||||
if (entry is LibraryOrderEntry) {
|
if (entry is LibraryOrderEntry) {
|
||||||
val library = entry.library
|
val library = entry.library
|
||||||
if (library != null) {
|
if (library != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user