MI-187 Also allow foreign DerivedModuleInfos, if their original module is known to the ResolverForProject

This commit is contained in:
Florian Kistner
2021-06-10 18:38:24 +02:00
committed by teamcityserver
parent 5f6be619c0
commit 3fe388bd17
2 changed files with 16 additions and 3 deletions
@@ -89,7 +89,8 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
override val name: String
get() = "Resolver for '$debugName'"
private fun isCorrectModuleInfo(moduleInfo: M) = moduleInfo in allModules
private fun isCorrectModuleInfo(moduleInfo: M): Boolean =
((moduleInfo as? DerivedModuleInfo)?.originalModule ?: moduleInfo) in allModules
final override fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule {
val moduleResolver = resolverForModuleDescriptorImpl(descriptor)
@@ -164,8 +165,10 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
}
private fun doGetDescriptorForModule(module: M): ModuleDescriptorImpl {
val moduleFromThisResolver = moduleInfoToResolvableInfo[module]
?: return delegateResolver.descriptorForModule(module) as ModuleDescriptorImpl
val moduleFromThisResolver =
module.takeIf { it is DerivedModuleInfo && it.originalModule in moduleInfoToResolvableInfo }
?: moduleInfoToResolvableInfo[module]
?: return delegateResolver.descriptorForModule(module) as ModuleDescriptorImpl
return projectContext.storageManager.compute {
var moduleData = descriptorByModule.getOrPut(moduleFromThisResolver) {
@@ -96,6 +96,16 @@ interface CombinedModuleInfo : ModuleInfo {
val platformModule: ModuleInfo
}
/**
* Special-purpose module info that allows implementors to provide different behavior compared to the [originalModule]'s.
* E.g. may be used to resolve common code as if it were target-specific, or to change the dependencies visible to the code.
*
* Resolvers should accept a derived module info, iff the [originalModule] is accepted.
*/
interface DerivedModuleInfo : ModuleInfo {
val originalModule: ModuleInfo
}
fun ModuleInfo.flatten(): List<ModuleInfo> = when (this) {
is CombinedModuleInfo -> listOf(this) + containedModules
else -> listOf(this)