Add a dependency from all klib-originated modules to the main module

This is required, for instance, to properly resolve supertypes across
the modules.

Issue #KT-37832 Fixed
This commit is contained in:
Sergey Igushkin
2020-03-27 16:44:40 +03:00
parent 8979b98fc0
commit 67f4b7e2b0
6 changed files with 43 additions and 7 deletions
@@ -123,9 +123,9 @@ private class KlibMetadataDependencyContainer(
private class KlibModuleInfo(
override val name: Name,
val kotlinLibrary: KotlinLibrary,
private val dependOnKlibModules: List<ModuleInfo>
private val dependOnModules: List<ModuleInfo>
) : ModuleInfo {
override fun dependencies(): List<ModuleInfo> = dependOnKlibModules
override fun dependencies(): List<ModuleInfo> = dependOnModules
override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns = ModuleInfo.DependencyOnBuiltIns.LAST
@@ -136,6 +136,12 @@ private class KlibMetadataDependencyContainer(
get() = CommonPlatformAnalyzerServices
}
private val mutableDependenciesForAllModuleDescriptors = mutableListOf<ModuleDescriptorImpl>().apply {
add(builtIns.builtInsModule)
}
private val mutableDependenciesForAllModules = mutableListOf<ModuleInfo>()
private val moduleDescriptorsForKotlinLibraries: Map<KotlinLibrary, ModuleDescriptorImpl> =
kotlinLibraries.keysToMap { library ->
val moduleHeader = parseModuleHeader(library.moduleHeaderData)
@@ -145,19 +151,20 @@ private class KlibMetadataDependencyContainer(
moduleName, storageManager, builtIns, moduleOrigin
)
}.also { result ->
val resultValues = result.values.toList()
val dependenciesForModuleDescriptors = resultValues + builtIns.builtInsModule
val resultValues = result.values
resultValues.forEach { module ->
module.setDependencies(dependenciesForModuleDescriptors)
module.setDependencies(mutableDependenciesForAllModuleDescriptors)
}
mutableDependenciesForAllModuleDescriptors.addAll(resultValues)
}
private val moduleInfosImpl: List<KlibModuleInfo> = mutableListOf<KlibModuleInfo>().apply {
addAll(
moduleDescriptorsForKotlinLibraries.map { (kotlinLibrary, moduleDescriptor) ->
KlibModuleInfo(moduleDescriptor.name, kotlinLibrary, this@apply)
KlibModuleInfo(moduleDescriptor.name, kotlinLibrary, mutableDependenciesForAllModules)
}
)
mutableDependenciesForAllModules.addAll(this@apply)
}
override val moduleInfos: List<ModuleInfo> get() = moduleInfosImpl
@@ -182,6 +189,14 @@ private class KlibMetadataDependencyContainer(
return moduleDescriptorsForKotlinLibraries.getValue(moduleInfo.kotlinLibrary)
}
override fun registerDependencyForAllModules(
moduleInfo: ModuleInfo,
descriptorForModule: ModuleDescriptorImpl
) {
mutableDependenciesForAllModules.add(moduleInfo)
mutableDependenciesForAllModuleDescriptors.add(descriptorForModule)
}
override fun packageFragmentProviderForModuleInfo(
moduleInfo: ModuleInfo
): PackageFragmentProvider? {