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:
@@ -123,9 +123,9 @@ private class KlibMetadataDependencyContainer(
|
|||||||
private class KlibModuleInfo(
|
private class KlibModuleInfo(
|
||||||
override val name: Name,
|
override val name: Name,
|
||||||
val kotlinLibrary: KotlinLibrary,
|
val kotlinLibrary: KotlinLibrary,
|
||||||
private val dependOnKlibModules: List<ModuleInfo>
|
private val dependOnModules: List<ModuleInfo>
|
||||||
) : ModuleInfo {
|
) : ModuleInfo {
|
||||||
override fun dependencies(): List<ModuleInfo> = dependOnKlibModules
|
override fun dependencies(): List<ModuleInfo> = dependOnModules
|
||||||
|
|
||||||
override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns = ModuleInfo.DependencyOnBuiltIns.LAST
|
override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns = ModuleInfo.DependencyOnBuiltIns.LAST
|
||||||
|
|
||||||
@@ -136,6 +136,12 @@ private class KlibMetadataDependencyContainer(
|
|||||||
get() = CommonPlatformAnalyzerServices
|
get() = CommonPlatformAnalyzerServices
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val mutableDependenciesForAllModuleDescriptors = mutableListOf<ModuleDescriptorImpl>().apply {
|
||||||
|
add(builtIns.builtInsModule)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val mutableDependenciesForAllModules = mutableListOf<ModuleInfo>()
|
||||||
|
|
||||||
private val moduleDescriptorsForKotlinLibraries: Map<KotlinLibrary, ModuleDescriptorImpl> =
|
private val moduleDescriptorsForKotlinLibraries: Map<KotlinLibrary, ModuleDescriptorImpl> =
|
||||||
kotlinLibraries.keysToMap { library ->
|
kotlinLibraries.keysToMap { library ->
|
||||||
val moduleHeader = parseModuleHeader(library.moduleHeaderData)
|
val moduleHeader = parseModuleHeader(library.moduleHeaderData)
|
||||||
@@ -145,19 +151,20 @@ private class KlibMetadataDependencyContainer(
|
|||||||
moduleName, storageManager, builtIns, moduleOrigin
|
moduleName, storageManager, builtIns, moduleOrigin
|
||||||
)
|
)
|
||||||
}.also { result ->
|
}.also { result ->
|
||||||
val resultValues = result.values.toList()
|
val resultValues = result.values
|
||||||
val dependenciesForModuleDescriptors = resultValues + builtIns.builtInsModule
|
|
||||||
resultValues.forEach { module ->
|
resultValues.forEach { module ->
|
||||||
module.setDependencies(dependenciesForModuleDescriptors)
|
module.setDependencies(mutableDependenciesForAllModuleDescriptors)
|
||||||
}
|
}
|
||||||
|
mutableDependenciesForAllModuleDescriptors.addAll(resultValues)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val moduleInfosImpl: List<KlibModuleInfo> = mutableListOf<KlibModuleInfo>().apply {
|
private val moduleInfosImpl: List<KlibModuleInfo> = mutableListOf<KlibModuleInfo>().apply {
|
||||||
addAll(
|
addAll(
|
||||||
moduleDescriptorsForKotlinLibraries.map { (kotlinLibrary, moduleDescriptor) ->
|
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
|
override val moduleInfos: List<ModuleInfo> get() = moduleInfosImpl
|
||||||
@@ -182,6 +189,14 @@ private class KlibMetadataDependencyContainer(
|
|||||||
return moduleDescriptorsForKotlinLibraries.getValue(moduleInfo.kotlinLibrary)
|
return moduleDescriptorsForKotlinLibraries.getValue(moduleInfo.kotlinLibrary)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun registerDependencyForAllModules(
|
||||||
|
moduleInfo: ModuleInfo,
|
||||||
|
descriptorForModule: ModuleDescriptorImpl
|
||||||
|
) {
|
||||||
|
mutableDependenciesForAllModules.add(moduleInfo)
|
||||||
|
mutableDependenciesForAllModuleDescriptors.add(descriptorForModule)
|
||||||
|
}
|
||||||
|
|
||||||
override fun packageFragmentProviderForModuleInfo(
|
override fun packageFragmentProviderForModuleInfo(
|
||||||
moduleInfo: ModuleInfo
|
moduleInfo: ModuleInfo
|
||||||
): PackageFragmentProvider? {
|
): PackageFragmentProvider? {
|
||||||
|
|||||||
+7
@@ -160,6 +160,8 @@ class CommonResolverForModuleFactory(
|
|||||||
|
|
||||||
val moduleDescriptor = resolver.descriptorForModule(moduleInfo)
|
val moduleDescriptor = resolver.descriptorForModule(moduleInfo)
|
||||||
|
|
||||||
|
dependenciesContainer?.registerDependencyForAllModules(moduleInfo, moduleDescriptor)
|
||||||
|
|
||||||
val container = resolver.resolverForModule(moduleInfo).componentProvider
|
val container = resolver.resolverForModule(moduleInfo).componentProvider
|
||||||
|
|
||||||
container.get<LazyTopDownAnalyzer>().analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files)
|
container.get<LazyTopDownAnalyzer>().analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files)
|
||||||
@@ -174,6 +176,11 @@ interface CommonDependenciesContainer {
|
|||||||
|
|
||||||
fun moduleDescriptorForModuleInfo(moduleInfo: ModuleInfo): ModuleDescriptor
|
fun moduleDescriptorForModuleInfo(moduleInfo: ModuleInfo): ModuleDescriptor
|
||||||
|
|
||||||
|
fun registerDependencyForAllModules(
|
||||||
|
moduleInfo: ModuleInfo,
|
||||||
|
descriptorForModule: ModuleDescriptorImpl
|
||||||
|
)
|
||||||
|
|
||||||
fun packageFragmentProviderForModuleInfo(moduleInfo: ModuleInfo): PackageFragmentProvider?
|
fun packageFragmentProviderForModuleInfo(moduleInfo: ModuleInfo): PackageFragmentProvider?
|
||||||
val friendModuleInfos: List<ModuleInfo>
|
val friendModuleInfos: List<ModuleInfo>
|
||||||
val refinesModuleInfos: List<ModuleInfo>
|
val refinesModuleInfos: List<ModuleInfo>
|
||||||
|
|||||||
+5
@@ -69,6 +69,11 @@ class KlibBasedMppIT : BaseGradleIT() {
|
|||||||
|
|
||||||
private fun testBuildWithDependency(configureDependency: Project.() -> Unit) = with(Project("common-klib-lib-and-app")) {
|
private fun testBuildWithDependency(configureDependency: Project.() -> Unit) = with(Project("common-klib-lib-and-app")) {
|
||||||
embedProject(Project("common-klib-lib-and-app"), renameTo = dependencyModuleName)
|
embedProject(Project("common-klib-lib-and-app"), renameTo = dependencyModuleName)
|
||||||
|
|
||||||
|
projectDir.resolve("$dependencyModuleName/src/commonMain/kotlin/TestKt37832.kt").writeText(
|
||||||
|
"package com.example.test.kt37832" + "\n" + "class MyException : RuntimeException()"
|
||||||
|
)
|
||||||
|
|
||||||
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
|
||||||
|
|
||||||
projectDir.resolve(dependencyModuleName + "/src").walkTopDown().filter { it.extension == "kt" }.forEach { file ->
|
projectDir.resolve(dependencyModuleName + "/src").walkTopDown().filter { it.extension == "kt" }.forEach { file ->
|
||||||
|
|||||||
+4
-1
@@ -15,4 +15,7 @@ fun libCommonMainInternalFun() = Unit
|
|||||||
|
|
||||||
fun main() {
|
fun main() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Test KT-37832 */
|
||||||
|
class MyCustomException : RuntimeException()
|
||||||
+3
@@ -5,6 +5,9 @@ actual class LibCommonMainExpect : LibCommonMainIface {
|
|||||||
println("actualized in jvmAndJsMain")
|
println("actualized in jvmAndJsMain")
|
||||||
libCommonMainTopLevelFun()
|
libCommonMainTopLevelFun()
|
||||||
libCommonMainInternalFun()
|
libCommonMainInternalFun()
|
||||||
|
|
||||||
|
/** Test KT-37832 */
|
||||||
|
throw MyCustomException()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun additionalFunInJvmAndJsActual() {
|
fun additionalFunInJvmAndJsActual() {
|
||||||
|
|||||||
+3
@@ -13,6 +13,9 @@ actual class LibCommonMainExpect : LibCommonMainIface {
|
|||||||
libCommonMainTopLevelFun()
|
libCommonMainTopLevelFun()
|
||||||
println(CArrayPointer::class)
|
println(CArrayPointer::class)
|
||||||
libCommonMainInternalFun()
|
libCommonMainInternalFun()
|
||||||
|
|
||||||
|
/** Test KT-37832 */
|
||||||
|
throw MyCustomException()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun additionalFunInLinuxActual() {
|
fun additionalFunInLinuxActual() {
|
||||||
|
|||||||
Reference in New Issue
Block a user