Evaluate allImplementingModules lazily #KT-17136 Fixed
This commit is contained in:
@@ -196,6 +196,12 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
|
|||||||
return module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) { resolverForProject.descriptorForModule(it as M) }
|
return module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) { resolverForProject.descriptorForModule(it as M) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun computeImplementingModules(module: M): Set<ModuleDescriptorImpl> =
|
||||||
|
if (modulePlatforms(module) != MultiTargetPlatform.Common) emptySet()
|
||||||
|
else modules
|
||||||
|
.filter { modulePlatforms(it) != MultiTargetPlatform.Common && module in it.dependencies() }
|
||||||
|
.mapTo(mutableSetOf(), resolverForProject::descriptorForModule)
|
||||||
|
|
||||||
fun setupModuleDependencies() {
|
fun setupModuleDependencies() {
|
||||||
modules.forEach {
|
modules.forEach {
|
||||||
module ->
|
module ->
|
||||||
@@ -203,7 +209,8 @@ abstract class AnalyzerFacade<in P : PlatformAnalysisParameters> {
|
|||||||
LazyModuleDependencies(
|
LazyModuleDependencies(
|
||||||
storageManager,
|
storageManager,
|
||||||
{ computeDependencyDescriptors(module) },
|
{ computeDependencyDescriptors(module) },
|
||||||
{ computeModulesWhoseInternalsAreVisible(module) }
|
{ computeModulesWhoseInternalsAreVisible(module) },
|
||||||
|
{ computeImplementingModules(module) }
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,7 +57,8 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
|||||||
override val allDependencyModules: List<ModuleDescriptor>
|
override val allDependencyModules: List<ModuleDescriptor>
|
||||||
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allDependencies.filter { it != this }
|
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allDependencies.filter { it != this }
|
||||||
|
|
||||||
override val allImplementingModules: MutableSet<ModuleDescriptor> = mutableSetOf()
|
override val allImplementingModules: Set<ModuleDescriptor>
|
||||||
|
get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allImplementingModules
|
||||||
|
|
||||||
override fun getPackage(fqName: FqName): PackageViewDescriptor = packages(fqName)
|
override fun getPackage(fqName: FqName): PackageViewDescriptor = packages(fqName)
|
||||||
|
|
||||||
@@ -86,12 +87,6 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
|||||||
fun setDependencies(dependencies: ModuleDependencies) {
|
fun setDependencies(dependencies: ModuleDependencies) {
|
||||||
assert(this.dependencies == null) { "Dependencies of $id were already set" }
|
assert(this.dependencies == null) { "Dependencies of $id were already set" }
|
||||||
this.dependencies = dependencies
|
this.dependencies = dependencies
|
||||||
if (getMultiTargetPlatform() == MultiTargetPlatform.Common) return
|
|
||||||
for (dependencyModule in allDependencyModules) {
|
|
||||||
if (dependencyModule.getMultiTargetPlatform() != MultiTargetPlatform.Common) continue
|
|
||||||
if (dependencyModule.sourceKind != sourceKind) continue
|
|
||||||
(dependencyModule as? ModuleDescriptorImpl)?.allImplementingModules?.add(this)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setDependencies(vararg descriptors: ModuleDescriptorImpl) {
|
fun setDependencies(vararg descriptors: ModuleDescriptorImpl) {
|
||||||
@@ -127,21 +122,27 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
|
|||||||
interface ModuleDependencies {
|
interface ModuleDependencies {
|
||||||
val allDependencies: List<ModuleDescriptorImpl>
|
val allDependencies: List<ModuleDescriptorImpl>
|
||||||
val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>
|
val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>
|
||||||
|
val allImplementingModules: Set<ModuleDescriptorImpl>
|
||||||
}
|
}
|
||||||
|
|
||||||
class ModuleDependenciesImpl(
|
class ModuleDependenciesImpl(
|
||||||
override val allDependencies: List<ModuleDescriptorImpl>,
|
override val allDependencies: List<ModuleDescriptorImpl>,
|
||||||
override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>
|
override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>
|
||||||
) : ModuleDependencies
|
) : ModuleDependencies {
|
||||||
|
override val allImplementingModules: Set<ModuleDescriptorImpl> = emptySet()
|
||||||
|
}
|
||||||
|
|
||||||
class LazyModuleDependencies(
|
class LazyModuleDependencies(
|
||||||
storageManager: StorageManager,
|
storageManager: StorageManager,
|
||||||
computeDependencies: () -> List<ModuleDescriptorImpl>,
|
computeDependencies: () -> List<ModuleDescriptorImpl>,
|
||||||
computeModulesWhoseInternalsAreVisible: () -> Set<ModuleDescriptorImpl>
|
computeModulesWhoseInternalsAreVisible: () -> Set<ModuleDescriptorImpl>,
|
||||||
|
computeImplementingModules: () -> Set<ModuleDescriptorImpl>
|
||||||
) : ModuleDependencies {
|
) : ModuleDependencies {
|
||||||
private val dependencies = storageManager.createLazyValue(computeDependencies)
|
private val dependencies = storageManager.createLazyValue(computeDependencies)
|
||||||
private val visibleInternals = storageManager.createLazyValue(computeModulesWhoseInternalsAreVisible)
|
private val visibleInternals = storageManager.createLazyValue(computeModulesWhoseInternalsAreVisible)
|
||||||
|
private val implementingModules = storageManager.createLazyValue(computeImplementingModules)
|
||||||
|
|
||||||
override val allDependencies: List<ModuleDescriptorImpl> get() = dependencies()
|
override val allDependencies: List<ModuleDescriptorImpl> get() = dependencies()
|
||||||
override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl> get() = visibleInternals()
|
override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl> get() = visibleInternals()
|
||||||
|
override val allImplementingModules: Set<ModuleDescriptorImpl> get() = implementingModules()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user