diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt index 6fe56fb5a1b..37772769038 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AbstractResolverForProject.kt @@ -89,7 +89,8 @@ abstract class AbstractResolverForProject( override val name: String 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 { val moduleResolver = resolverForModuleDescriptorImpl(descriptor) @@ -164,8 +165,10 @@ abstract class AbstractResolverForProject( } private fun doGetDescriptorForModule(module: M): ModuleDescriptorImpl { - val moduleFromThisResolver = moduleInfoToResolvableInfo[module] - ?: return delegateResolver.descriptorForModule(module) as ModuleDescriptorImpl + val moduleFromThisResolver = + module.takeIf { it is DerivedModuleInfo && it.originalModule in moduleInfoToResolvableInfo } + ?: moduleInfoToResolvableInfo[module] + ?: return delegateResolver.descriptorForModule(module) as ModuleDescriptorImpl return projectContext.storageManager.compute { var moduleData = descriptorByModule.getOrPut(moduleFromThisResolver) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt index 19dd3cf6d63..64138e1fbd2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/AnalyzerFacade.kt @@ -96,6 +96,16 @@ interface CombinedModuleInfo : 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 = when (this) { is CombinedModuleInfo -> listOf(this) + containedModules else -> listOf(this)