MI-187 Add asserts for module dependencies

This commit is contained in:
Florian Kistner
2021-07-07 00:20:31 +02:00
committed by teamcityserver
parent 3fe388bd17
commit 31420a934c
@@ -142,24 +142,29 @@ class LazyModuleDependencies<M : ModuleInfo>(
) : ModuleDependencies { ) : ModuleDependencies {
private val dependencies = storageManager.createLazyValue { private val dependencies = storageManager.createLazyValue {
val moduleDescriptors = mutableSetOf<ModuleDescriptorImpl>() val moduleDescriptors = mutableSetOf<ModuleDescriptorImpl>()
firstDependency?.let { firstDependency?.let {
module.assertModuleDependencyIsCorrect(it)
moduleDescriptors.add(resolverForProject.descriptorForModule(it)) moduleDescriptors.add(resolverForProject.descriptorForModule(it))
} }
val moduleDescriptor = resolverForProject.descriptorForModule(module) val moduleDescriptor = resolverForProject.descriptorForModule(module)
val dependencyOnBuiltIns = module.dependencyOnBuiltIns() val dependencyOnBuiltIns = module.dependencyOnBuiltIns()
if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.AFTER_SDK) { 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()) { for (dependency in module.dependencies()) {
if (dependency == firstDependency) continue if (dependency == firstDependency) continue
module.assertModuleDependencyIsCorrect(dependency)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
moduleDescriptors.add(resolverForProject.descriptorForModule(dependency as M)) moduleDescriptors.add(resolverForProject.descriptorForModule(dependency as M))
} }
if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.LAST) { if (dependencyOnBuiltIns == ModuleInfo.DependencyOnBuiltIns.LAST) {
moduleDescriptors.add(moduleDescriptor.builtIns.builtInsModule) val builtInsModule = moduleDescriptor.builtIns.builtInsModule
module.assertModuleDependencyIsCorrect(builtInsModule)
moduleDescriptors.add(builtInsModule)
} }
moduleDescriptors.toList() moduleDescriptors.toList()
} }
@@ -168,6 +173,7 @@ class LazyModuleDependencies<M : ModuleInfo>(
override val directExpectedByDependencies by storageManager.createLazyValue { override val directExpectedByDependencies by storageManager.createLazyValue {
module.expectedBy.map { module.expectedBy.map {
module.assertModuleDependencyIsCorrect(it)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
resolverForProject.descriptorForModule(it as M) resolverForProject.descriptorForModule(it as M)
} }
@@ -175,6 +181,7 @@ class LazyModuleDependencies<M : ModuleInfo>(
override val allExpectedByDependencies: Set<ModuleDescriptorImpl> by storageManager.createLazyValue { override val allExpectedByDependencies: Set<ModuleDescriptorImpl> by storageManager.createLazyValue {
collectAllExpectedByModules(module).mapTo(HashSet<ModuleDescriptorImpl>()) { collectAllExpectedByModules(module).mapTo(HashSet<ModuleDescriptorImpl>()) {
module.assertModuleDependencyIsCorrect(it)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
resolverForProject.descriptorForModule(it as M) resolverForProject.descriptorForModule(it as M)
} }
@@ -183,10 +190,22 @@ class LazyModuleDependencies<M : ModuleInfo>(
override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl> override val modulesWhoseInternalsAreVisible: Set<ModuleDescriptorImpl>
get() = get() =
module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) { module.modulesWhoseInternalsAreVisible().mapTo(LinkedHashSet()) {
module.assertModuleDependencyIsCorrect(it)
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
resolverForProject.descriptorForModule(it as M) 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 { interface PackageOracle {