MI-187 Also allow foreign DerivedModuleInfos, if their original module is known to the ResolverForProject
This commit is contained in:
committed by
teamcityserver
parent
5f6be619c0
commit
3fe388bd17
@@ -89,7 +89,8 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
override val name: String
|
override val name: String
|
||||||
get() = "Resolver for '$debugName'"
|
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 {
|
final override fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule {
|
||||||
val moduleResolver = resolverForModuleDescriptorImpl(descriptor)
|
val moduleResolver = resolverForModuleDescriptorImpl(descriptor)
|
||||||
@@ -164,8 +165,10 @@ abstract class AbstractResolverForProject<M : ModuleInfo>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun doGetDescriptorForModule(module: M): ModuleDescriptorImpl {
|
private fun doGetDescriptorForModule(module: M): ModuleDescriptorImpl {
|
||||||
val moduleFromThisResolver = moduleInfoToResolvableInfo[module]
|
val moduleFromThisResolver =
|
||||||
?: return delegateResolver.descriptorForModule(module) as ModuleDescriptorImpl
|
module.takeIf { it is DerivedModuleInfo && it.originalModule in moduleInfoToResolvableInfo }
|
||||||
|
?: moduleInfoToResolvableInfo[module]
|
||||||
|
?: return delegateResolver.descriptorForModule(module) as ModuleDescriptorImpl
|
||||||
|
|
||||||
return projectContext.storageManager.compute {
|
return projectContext.storageManager.compute {
|
||||||
var moduleData = descriptorByModule.getOrPut(moduleFromThisResolver) {
|
var moduleData = descriptorByModule.getOrPut(moduleFromThisResolver) {
|
||||||
|
|||||||
@@ -96,6 +96,16 @@ interface CombinedModuleInfo : ModuleInfo {
|
|||||||
val platformModule: 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) {
|
fun ModuleInfo.flatten(): List<ModuleInfo> = when (this) {
|
||||||
is CombinedModuleInfo -> listOf(this) + containedModules
|
is CombinedModuleInfo -> listOf(this) + containedModules
|
||||||
else -> listOf(this)
|
else -> listOf(this)
|
||||||
|
|||||||
Reference in New Issue
Block a user