diff --git a/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.kt index 337c900d28b..b42e7fc657a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/jet/analyzer/AnalyzerFacade.kt @@ -38,15 +38,23 @@ public trait ResolverForModule { public trait ResolverForProject { public fun resolverForModule(moduleInfo: M): R public fun descriptorForModule(moduleInfo: M): ModuleDescriptor + val allModules: Collection +} + +public class EmptyResolverForProject : ResolverForProject { + 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 = listOf() } public class ResolverForProjectImpl( - val descriptorByModule: Map + val descriptorByModule: Map, + val delegateResolver: ResolverForProject = EmptyResolverForProject() ) : ResolverForProject { val resolverByModuleDescriptor: MutableMap = HashMap() - private val allModules: Collection by Delegates.lazy { - descriptorByModule.keySet() + override val allModules: Collection by Delegates.lazy { + (descriptorByModule.keySet() + delegateResolver.allModules).toSet() } private fun assertCorrectModuleInfo(moduleInfo: M) { @@ -57,13 +65,13 @@ public class ResolverForProjectImpl( override fun resolverForModule(moduleInfo: M): R { assertCorrectModuleInfo(moduleInfo) - val descriptor = descriptorByModule[moduleInfo]!! + val descriptor = descriptorByModule[moduleInfo] ?: return delegateResolver.resolverForModule(moduleInfo) return resolverByModuleDescriptor[descriptor]!! } override fun descriptorForModule(moduleInfo: M): ModuleDescriptorImpl { assertCorrectModuleInfo(moduleInfo) - return descriptorByModule[moduleInfo]!! + return descriptorByModule[moduleInfo] ?: return delegateResolver.descriptorForModule(moduleInfo) as ModuleDescriptorImpl } } @@ -111,7 +119,8 @@ public trait AnalyzerFacade, modulesContent: (M) -> ModuleContent, - platformParameters: P + platformParameters: P, + delegateResolver: ResolverForProject = EmptyResolverForProject() ): ResolverForProject { fun createResolverForProject(): ResolverForProjectImpl { @@ -120,7 +129,7 @@ public trait AnalyzerFacade descriptorByModule[module] = ModuleDescriptorImpl(module.name, defaultImports, platformToKotlinClassMap) } - return ResolverForProjectImpl(descriptorByModule) + return ResolverForProjectImpl(descriptorByModule, delegateResolver) } val resolverForProject = createResolverForProject()