diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 64138e1fbd2..9602653bc60 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -142,24 +142,29 @@ class LazyModuleDependencies( ) : ModuleDependencies { private val dependencies = storageManager.createLazyValue { - val moduleDescriptors = mutableSetOf() firstDependency?.let { + module.assertModuleDependencyIsCorrect(it) moduleDescriptors.add(resolverForProject.descriptorForModule(it)) } val moduleDescriptor = resolverForProject.descriptorForModule(module) val dependencyOnBuiltIns = module.dependencyOnBuiltIns() if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.AFTER_SDK) { - moduleDescriptors.add(moduleDescriptor.builtIns.builtInsModule) + val builtInsModule = moduleDescriptor.builtIns.builtInsModule + module.assertModuleDependencyIsCorrect(builtInsModule) + moduleDescriptors.add(builtInsModule) } for (dependency in module.dependencies()) { if (dependency == firstDependency) continue + module.assertModuleDependencyIsCorrect(dependency) @Suppress("UNCHECKED_CAST") moduleDescriptors.add(resolverForProject.descriptorForModule(dependency as M)) } if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.LAST) { - moduleDescriptors.add(moduleDescriptor.builtIns.builtInsModule) + val builtInsModule = moduleDescriptor.builtIns.builtInsModule + module.assertModuleDependencyIsCorrect(builtInsModule) + moduleDescriptors.add(builtInsModule) } moduleDescriptors.toList() } @@ -168,6 +173,7 @@ class LazyModuleDependencies( override val directExpectedByDependencies by storageManager.createLazyValue { module.expectedBy.map { + module.assertModuleDependencyIsCorrect(it) @Suppress("UNCHECKED_CAST") resolverForProject.descriptorForModule(it as M) } @@ -175,6 +181,7 @@ class LazyModuleDependencies( override val allExpectedByDependencies: Set by storageManager.createLazyValue { collectAllExpectedByModules(module).mapTo(HashSet()) { + module.assertModuleDependencyIsCorrect(it) @Suppress("UNCHECKED_CAST") resolverForProject.descriptorForModule(it as M) } @@ -183,10 +190,22 @@ class LazyModuleDependencies( override val modulesWhoseInternalsAreVisible: Set get() = module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) { + module.assertModuleDependencyIsCorrect(it) @Suppress("UNCHECKED_CAST") resolverForProject.descriptorForModule(it as M) } + companion object { + private fun ModuleInfo.assertModuleDependencyIsCorrect(dependency: ModuleDescriptor) { + assertModuleDependencyIsCorrect(dependency.getCapability(ModuleInfo.Capability) ?: return) + } + + private fun ModuleInfo.assertModuleDependencyIsCorrect(dependency: ModuleInfo) { + assert(dependency !is DerivedModuleInfo || this is DerivedModuleInfo) { + "Derived module infos may not be referenced from regular ones" + } + } + } } interface PackageOracle {