Introduce api to get nullable ResolverForModule by ModuleInfo
This commit is contained in:
@@ -42,6 +42,7 @@ public class ResolverForModule(
|
||||
|
||||
abstract class ResolverForProject<M : ModuleInfo> {
|
||||
fun resolverForModule(moduleInfo: M): ResolverForModule = resolverForModuleDescriptor(descriptorForModule(moduleInfo))
|
||||
abstract fun tryGetResolverForModule(moduleInfo: M): ResolverForModule?
|
||||
abstract fun descriptorForModule(moduleInfo: M): ModuleDescriptor
|
||||
abstract fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule
|
||||
|
||||
@@ -55,6 +56,7 @@ public class EmptyResolverForProject<M : ModuleInfo> : ResolverForProject<M>() {
|
||||
override val name: String
|
||||
get() = "Empty resolver"
|
||||
|
||||
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? = null
|
||||
override fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule = throw IllegalStateException("$descriptor is not contained in this resolver")
|
||||
override fun descriptorForModule(moduleInfo: M) = throw IllegalStateException("Should not be called for $moduleInfo")
|
||||
override val allModules: Collection<M> = listOf()
|
||||
@@ -65,20 +67,23 @@ public class ResolverForProjectImpl<M : ModuleInfo>(
|
||||
val descriptorByModule: Map<M, ModuleDescriptorImpl>,
|
||||
val delegateResolver: ResolverForProject<M> = EmptyResolverForProject()
|
||||
) : ResolverForProject<M>() {
|
||||
val resolverByModuleDescriptor: MutableMap<ModuleDescriptor, () -> ResolverForModule> = HashMap()
|
||||
override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? {
|
||||
if (!isCorrectModuleInfo(moduleInfo)) {
|
||||
return null
|
||||
}
|
||||
return resolverForModuleDescriptor(doGetDescriptorForModule(moduleInfo))
|
||||
}
|
||||
|
||||
internal val resolverByModuleDescriptor: MutableMap<ModuleDescriptor, () -> ResolverForModule> = HashMap()
|
||||
|
||||
override val allModules: Collection<M> by lazy {
|
||||
(descriptorByModule.keySet() + delegateResolver.allModules).toSet()
|
||||
(descriptorByModule.keys + delegateResolver.allModules).toSet()
|
||||
}
|
||||
|
||||
override val name: String
|
||||
get() = "Resolver for '$debugName'"
|
||||
|
||||
private fun assertCorrectModuleInfo(moduleInfo: M) {
|
||||
if (moduleInfo !in allModules) {
|
||||
throw AssertionError("$name does not know how to resolve $moduleInfo")
|
||||
}
|
||||
}
|
||||
private fun isCorrectModuleInfo(moduleInfo: M) = moduleInfo in allModules
|
||||
|
||||
override fun resolverForModuleDescriptor(descriptor: ModuleDescriptor): ResolverForModule {
|
||||
val computation = resolverByModuleDescriptor[descriptor] ?: return delegateResolver.resolverForModuleDescriptor(descriptor)
|
||||
@@ -86,7 +91,13 @@ public class ResolverForProjectImpl<M : ModuleInfo>(
|
||||
}
|
||||
|
||||
override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
|
||||
assertCorrectModuleInfo(moduleInfo)
|
||||
if (!isCorrectModuleInfo(moduleInfo)) {
|
||||
throw AssertionError("$name does not know how to resolve $moduleInfo")
|
||||
}
|
||||
return doGetDescriptorForModule(moduleInfo)
|
||||
}
|
||||
|
||||
private fun doGetDescriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
|
||||
return descriptorByModule[moduleInfo] ?: return delegateResolver.descriptorForModule(moduleInfo) as ModuleDescriptorImpl
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user