diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index f6f7438660b..46daef06483 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -196,6 +196,12 @@ abstract class AnalyzerFacade { return module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) { resolverForProject.descriptorForModule(it as M) } } + fun computeImplementingModules(module: M): Set = + if (modulePlatforms(module) != MultiTargetPlatform.Common) emptySet() + else modules + .filter { modulePlatforms(it) != MultiTargetPlatform.Common && module in it.dependencies() } + .mapTo(mutableSetOf(), resolverForProject::descriptorForModule) + fun setupModuleDependencies() { modules.forEach { module -> @@ -203,7 +209,8 @@ abstract class AnalyzerFacade { LazyModuleDependencies( storageManager, { computeDependencyDescriptors(module) }, - { computeModulesWhoseInternalsAreVisible(module) } + { computeModulesWhoseInternalsAreVisible(module) }, + { computeImplementingModules(module) } ) ) } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt index ee887649e2b..f4ddc21585e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/impl/ModuleDescriptorImpl.kt @@ -57,7 +57,8 @@ class ModuleDescriptorImpl @JvmOverloads constructor( override val allDependencyModules: List get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allDependencies.filter { it != this } - override val allImplementingModules: MutableSet = mutableSetOf() + override val allImplementingModules: Set + get() = this.dependencies.sure { "Dependencies of module $id were not set" }.allImplementingModules override fun getPackage(fqName: FqName): PackageViewDescriptor = packages(fqName) @@ -86,12 +87,6 @@ class ModuleDescriptorImpl @JvmOverloads constructor( fun setDependencies(dependencies: ModuleDependencies) { assert(this.dependencies == null) { "Dependencies of $id were already set" } 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) { @@ -127,21 +122,27 @@ class ModuleDescriptorImpl @JvmOverloads constructor( interface ModuleDependencies { val allDependencies: List val modulesWhoseInternalsAreVisible: Set + val allImplementingModules: Set } class ModuleDependenciesImpl( override val allDependencies: List, override val modulesWhoseInternalsAreVisible: Set -) : ModuleDependencies +) : ModuleDependencies { + override val allImplementingModules: Set = emptySet() +} class LazyModuleDependencies( storageManager: StorageManager, computeDependencies: () -> List, - computeModulesWhoseInternalsAreVisible: () -> Set + computeModulesWhoseInternalsAreVisible: () -> Set, + computeImplementingModules: () -> Set ) : ModuleDependencies { private val dependencies = storageManager.createLazyValue(computeDependencies) private val visibleInternals = storageManager.createLazyValue(computeModulesWhoseInternalsAreVisible) + private val implementingModules = storageManager.createLazyValue(computeImplementingModules) override val allDependencies: List get() = dependencies() override val modulesWhoseInternalsAreVisible: Set get() = visibleInternals() + override val allImplementingModules: Set get() = implementingModules() }