diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 4641ed3d575..21bae63d18a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -42,6 +42,7 @@ public class ResolverForModule( abstract class ResolverForProject { 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 : ResolverForProject() { 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 = listOf() @@ -65,20 +67,23 @@ public class ResolverForProjectImpl( val descriptorByModule: Map, val delegateResolver: ResolverForProject = EmptyResolverForProject() ) : ResolverForProject() { - val resolverByModuleDescriptor: MutableMap ResolverForModule> = HashMap() + override fun tryGetResolverForModule(moduleInfo: M): ResolverForModule? { + if (!isCorrectModuleInfo(moduleInfo)) { + return null + } + return resolverForModuleDescriptor(doGetDescriptorForModule(moduleInfo)) + } + + internal val resolverByModuleDescriptor: MutableMap ResolverForModule> = HashMap() override val allModules: Collection 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( } 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 } }