From c4201101ac64679394ec420c419a935f56d7c85d Mon Sep 17 00:00:00 2001 From: Vladimir Sukharev Date: Wed, 13 Sep 2023 13:56:21 +0000 Subject: [PATCH] [K/N] K2/MPP: Move stdlib to the head of dependency list. ^KT-61645 Fixed Merge-request: KT-MR-12079 Merged-by: Vladimir Sukharev --- .../fir/session/FirNativeSessionFactory.kt | 8 ++++++-- .../jetbrains/kotlin/library/KotlinLibrary.kt | 3 +++ .../jetbrains/kotlin/gradle/HierarchicalMppIT.kt | 9 +++++++++ .../testProject/kt61430/build.gradle.kts | 16 ++++++++++++++++ .../linuxX64Main/kotlin/returnType.linuxX64.kt | 6 ++++++ .../src/nativeMain/kotlin/returnType.native.kt | 6 ++++++ native/executors/build.gradle.kts | 9 ++++++++- 7 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/linuxX64Main/kotlin/returnType.linuxX64.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/nativeMain/kotlin/returnType.native.kt diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt index 3495a03434f..7fbb35dec01 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/session/FirNativeSessionFactory.kt @@ -15,9 +15,9 @@ import org.jetbrains.kotlin.fir.extensions.FirExtensionRegistrar import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSyntheticFunctionInterfaceProvider -import org.jetbrains.kotlin.fir.resolve.providers.impl.FirExtensionSyntheticFunctionInterfaceProvider import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider import org.jetbrains.kotlin.fir.scopes.FirPlatformClassMapper +import org.jetbrains.kotlin.library.isNativeStdlib import org.jetbrains.kotlin.library.metadata.impl.KlibResolvedModuleDescriptorsFactoryImpl.Companion.FORWARD_DECLARATIONS_MODULE_NAME import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary import org.jetbrains.kotlin.name.Name @@ -52,7 +52,11 @@ object FirNativeSessionFactory : FirAbstractSessionFactory() { ).apply { bindSession(session) } - val kotlinLibraries = resolvedLibraries.map { it.library } + val resolvedKotlinLibraries = resolvedLibraries.map { it.library } + // KT-61645: stdlib-native must appear before stdlib-common metadata in the dependency list + // TODO: Consider not reordering libraries after KT-61430 is fixed, and Gradle plugin determines full order of dependencies. + val (stdlib, otherDeps) = resolvedKotlinLibraries.partition { it.isNativeStdlib } + val kotlinLibraries = stdlib + otherDeps listOfNotNull( KlibBasedSymbolProvider(session, moduleDataProvider, kotlinScopeProvider, kotlinLibraries), NativeForwardDeclarationsSymbolProvider(session, forwardDeclarationsModuleData, kotlinScopeProvider, kotlinLibraries), diff --git a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt index a6d5e99b0b5..7c3339f0b4f 100644 --- a/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt +++ b/compiler/util-klib/src/org/jetbrains/kotlin/library/KotlinLibrary.kt @@ -98,6 +98,9 @@ val BaseKotlinLibrary.uniqueName: String val BaseKotlinLibrary.shortName: String? get() = manifestProperties.getProperty(KLIB_PROPERTY_SHORT_NAME) +val BaseKotlinLibrary.isNativeStdlib: Boolean + get() = uniqueName == KOTLIN_STDLIB_NAME + val BaseKotlinLibrary.unresolvedDependencies: List get() = unresolvedDependencies(lenient = false).map { it as RequiredUnresolvedLibrary } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt index f73879d5733..7fc5a49a715 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/HierarchicalMppIT.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSet import org.jetbrains.kotlin.gradle.testbase.* import org.jetbrains.kotlin.gradle.util.checkedReplace import org.jetbrains.kotlin.gradle.util.modify +import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.condition.OS import org.junit.jupiter.api.io.TempDir @@ -1238,6 +1239,14 @@ open class HierarchicalMppIT : KGPBaseTest() { } } + @Disabled("Disabled until kotlin-native fix from MR https://jetbrains.team/p/kt/reviews/12079/timeline is deployed and can be tested") + @GradleTest + @DisplayName("K2: Check native stdlib is not shadowed by commonMain metadata") + fun testK2NativeStdlibConflict(gradleVersion: GradleVersion) { + nativeProject("kt61430", gradleVersion, buildOptions = defaultBuildOptions.copyEnsuringK2()) { + build("assemble") + } + } private fun TestProject.testDependencyTransformations( subproject: String? = null, diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/build.gradle.kts new file mode 100644 index 00000000000..a92b5678bbb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + kotlin("multiplatform") +} + +group = "org.jetbrains.qa" +version = "1.0-SNAPSHOT" + +repositories { + mavenCentral() + mavenLocal() +} + +kotlin { + linuxX64() + mingwX64() // can be any dummy target here, just for sake of nativeMain auto-insertion +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/linuxX64Main/kotlin/returnType.linuxX64.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/linuxX64Main/kotlin/returnType.linuxX64.kt new file mode 100644 index 00000000000..dde981816bb --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/linuxX64Main/kotlin/returnType.linuxX64.kt @@ -0,0 +1,6 @@ +import kotlin.reflect.KMutableProperty1 +import kotlin.reflect.KType + +public fun returnTypeLinux(field: KMutableProperty1): KType { + return field.returnType +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/nativeMain/kotlin/returnType.native.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/nativeMain/kotlin/returnType.native.kt new file mode 100644 index 00000000000..03fb83401f9 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kt61430/src/nativeMain/kotlin/returnType.native.kt @@ -0,0 +1,6 @@ +import kotlin.reflect.KMutableProperty1 +import kotlin.reflect.KType + +fun returnTypeShared(field: KMutableProperty1): KType { + return field.returnType +} diff --git a/native/executors/build.gradle.kts b/native/executors/build.gradle.kts index 3f992c2bd06..18ba0a73f56 100644 --- a/native/executors/build.gradle.kts +++ b/native/executors/build.gradle.kts @@ -26,7 +26,14 @@ dependencies { } implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.0") - implementation("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}") + + // KT-61897: Workaround for https://github.com/gradle/gradle/issues/26358 + // (wrong conflict resolution, causing selection of not the latest version of `:kotlin-util-klib` module) + if (rootProject.name == "native-build-tools") { + implementation("org.jetbrains.kotlin:kotlin-native-utils:${project.bootstrapKotlinVersion}") + } else { + implementation(project(":native:kotlin-native-utils")) + } } group = "org.jetbrains.kotlin"