Allow to provide precomputed analyzers when creating ResolverForProject
This commit is contained in:
@@ -38,15 +38,23 @@ public trait ResolverForModule {
|
|||||||
public trait ResolverForProject<M : ModuleInfo, R : ResolverForModule> {
|
public trait ResolverForProject<M : ModuleInfo, R : ResolverForModule> {
|
||||||
public fun resolverForModule(moduleInfo: M): R
|
public fun resolverForModule(moduleInfo: M): R
|
||||||
public fun descriptorForModule(moduleInfo: M): ModuleDescriptor
|
public fun descriptorForModule(moduleInfo: M): ModuleDescriptor
|
||||||
|
val allModules: Collection<M>
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EmptyResolverForProject<M : ModuleInfo, R : ResolverForModule> : ResolverForProject<M, R> {
|
||||||
|
override fun resolverForModule(moduleInfo: M): R = throw IllegalStateException("Should not be called for $moduleInfo")
|
||||||
|
override fun descriptorForModule(moduleInfo: M) = throw IllegalStateException("Should not be called for $moduleInfo")
|
||||||
|
override val allModules: Collection<M> = listOf()
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ResolverForProjectImpl<M : ModuleInfo, R : ResolverForModule>(
|
public class ResolverForProjectImpl<M : ModuleInfo, R : ResolverForModule>(
|
||||||
val descriptorByModule: Map<M, ModuleDescriptorImpl>
|
val descriptorByModule: Map<M, ModuleDescriptorImpl>,
|
||||||
|
val delegateResolver: ResolverForProject<M, R> = EmptyResolverForProject()
|
||||||
) : ResolverForProject<M, R> {
|
) : ResolverForProject<M, R> {
|
||||||
val resolverByModuleDescriptor: MutableMap<ModuleDescriptor, R> = HashMap()
|
val resolverByModuleDescriptor: MutableMap<ModuleDescriptor, R> = HashMap()
|
||||||
|
|
||||||
private val allModules: Collection<M> by Delegates.lazy {
|
override val allModules: Collection<M> by Delegates.lazy {
|
||||||
descriptorByModule.keySet()
|
(descriptorByModule.keySet() + delegateResolver.allModules).toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun assertCorrectModuleInfo(moduleInfo: M) {
|
private fun assertCorrectModuleInfo(moduleInfo: M) {
|
||||||
@@ -57,13 +65,13 @@ public class ResolverForProjectImpl<M : ModuleInfo, R : ResolverForModule>(
|
|||||||
|
|
||||||
override fun resolverForModule(moduleInfo: M): R {
|
override fun resolverForModule(moduleInfo: M): R {
|
||||||
assertCorrectModuleInfo(moduleInfo)
|
assertCorrectModuleInfo(moduleInfo)
|
||||||
val descriptor = descriptorByModule[moduleInfo]!!
|
val descriptor = descriptorByModule[moduleInfo] ?: return delegateResolver.resolverForModule(moduleInfo)
|
||||||
return resolverByModuleDescriptor[descriptor]!!
|
return resolverByModuleDescriptor[descriptor]!!
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
|
override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl {
|
||||||
assertCorrectModuleInfo(moduleInfo)
|
assertCorrectModuleInfo(moduleInfo)
|
||||||
return descriptorByModule[moduleInfo]!!
|
return descriptorByModule[moduleInfo] ?: return delegateResolver.descriptorForModule(moduleInfo) as ModuleDescriptorImpl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +119,8 @@ public trait AnalyzerFacade<out A : ResolverForModule, in P : PlatformAnalysisPa
|
|||||||
project: Project,
|
project: Project,
|
||||||
modules: Collection<M>,
|
modules: Collection<M>,
|
||||||
modulesContent: (M) -> ModuleContent,
|
modulesContent: (M) -> ModuleContent,
|
||||||
platformParameters: P
|
platformParameters: P,
|
||||||
|
delegateResolver: ResolverForProject<M, A> = EmptyResolverForProject()
|
||||||
): ResolverForProject<M, A> {
|
): ResolverForProject<M, A> {
|
||||||
|
|
||||||
fun createResolverForProject(): ResolverForProjectImpl<M, A> {
|
fun createResolverForProject(): ResolverForProjectImpl<M, A> {
|
||||||
@@ -120,7 +129,7 @@ public trait AnalyzerFacade<out A : ResolverForModule, in P : PlatformAnalysisPa
|
|||||||
module ->
|
module ->
|
||||||
descriptorByModule[module] = ModuleDescriptorImpl(module.name, defaultImports, platformToKotlinClassMap)
|
descriptorByModule[module] = ModuleDescriptorImpl(module.name, defaultImports, platformToKotlinClassMap)
|
||||||
}
|
}
|
||||||
return ResolverForProjectImpl(descriptorByModule)
|
return ResolverForProjectImpl(descriptorByModule, delegateResolver)
|
||||||
}
|
}
|
||||||
|
|
||||||
val resolverForProject = createResolverForProject()
|
val resolverForProject = createResolverForProject()
|
||||||
|
|||||||
Reference in New Issue
Block a user