From 67f4b7e2b03b71d49c973fa7d7bd7dc7e43f857b Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Fri, 27 Mar 2020 16:44:40 +0300 Subject: [PATCH] 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 --- .../cli/metadata/K2MetadataKlibSerializer.kt | 27 ++++++++++++++----- .../common/CommonResolverForModuleFactory.kt | 7 +++++ .../jetbrains/kotlin/gradle/KlibBasedMppIT.kt | 5 ++++ .../src/commonMain/kotlin/LibCommonMain.kt | 5 +++- .../jvmAndJsMain/kotlin/LibJvmAndJsMain.kt | 3 +++ .../src/linuxMain/kotlin/LibLinuxMain.kt | 3 +++ 6 files changed, 43 insertions(+), 7 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt index bfbfd2ee881..ce12279c0c8 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/metadata/K2MetadataKlibSerializer.kt @@ -123,9 +123,9 @@ private class KlibMetadataDependencyContainer( private class KlibModuleInfo( override val name: Name, val kotlinLibrary: KotlinLibrary, - private val dependOnKlibModules: List + private val dependOnModules: List ) : ModuleInfo { - override fun dependencies(): List = dependOnKlibModules + override fun dependencies(): List = dependOnModules override fun dependencyOnBuiltIns(): ModuleInfo.DependencyOnBuiltIns = ModuleInfo.DependencyOnBuiltIns.LAST @@ -136,6 +136,12 @@ private class KlibMetadataDependencyContainer( get() = CommonPlatformAnalyzerServices } + private val mutableDependenciesForAllModuleDescriptors = mutableListOf().apply { + add(builtIns.builtInsModule) + } + + private val mutableDependenciesForAllModules = mutableListOf() + private val moduleDescriptorsForKotlinLibraries: Map = 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 = mutableListOf().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 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? { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonResolverForModuleFactory.kt b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonResolverForModuleFactory.kt index b24185a55fc..3bd78d3e91b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonResolverForModuleFactory.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/analyzer/common/CommonResolverForModuleFactory.kt @@ -160,6 +160,8 @@ class CommonResolverForModuleFactory( val moduleDescriptor = resolver.descriptorForModule(moduleInfo) + dependenciesContainer?.registerDependencyForAllModules(moduleInfo, moduleDescriptor) + val container = resolver.resolverForModule(moduleInfo).componentProvider container.get().analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files) @@ -174,6 +176,11 @@ interface CommonDependenciesContainer { fun moduleDescriptorForModuleInfo(moduleInfo: ModuleInfo): ModuleDescriptor + fun registerDependencyForAllModules( + moduleInfo: ModuleInfo, + descriptorForModule: ModuleDescriptorImpl + ) + fun packageFragmentProviderForModuleInfo(moduleInfo: ModuleInfo): PackageFragmentProvider? val friendModuleInfos: List val refinesModuleInfos: List diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt index e041aea3f0d..ffd1118e374 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/KlibBasedMppIT.kt @@ -69,6 +69,11 @@ class KlibBasedMppIT : BaseGradleIT() { private fun testBuildWithDependency(configureDependency: Project.() -> Unit) = with(Project("common-klib-lib-and-app")) { 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) projectDir.resolve(dependencyModuleName + "/src").walkTopDown().filter { it.extension == "kt" }.forEach { file -> diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt index 71e560d0e85..7992d1f6795 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/commonMain/kotlin/LibCommonMain.kt @@ -15,4 +15,7 @@ fun libCommonMainInternalFun() = Unit fun main() { -} \ No newline at end of file +} + +/** Test KT-37832 */ +class MyCustomException : RuntimeException() \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt index 8be19c239db..f5f843f68e2 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/jvmAndJsMain/kotlin/LibJvmAndJsMain.kt @@ -5,6 +5,9 @@ actual class LibCommonMainExpect : LibCommonMainIface { println("actualized in jvmAndJsMain") libCommonMainTopLevelFun() libCommonMainInternalFun() + + /** Test KT-37832 */ + throw MyCustomException() } fun additionalFunInJvmAndJsActual() { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt index d079d996710..c0c527db097 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/common-klib-lib-and-app/src/linuxMain/kotlin/LibLinuxMain.kt @@ -13,6 +13,9 @@ actual class LibCommonMainExpect : LibCommonMainIface { libCommonMainTopLevelFun() println(CArrayPointer::class) libCommonMainInternalFun() + + /** Test KT-37832 */ + throw MyCustomException() } fun additionalFunInLinuxActual() {