From 0122b73baed0992ba8ab50f78e167844abd28396 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Mon, 31 Oct 2022 21:33:56 +0100 Subject: [PATCH] Align stdlib version also on kotlin-stdlib-jdk7:1.8+ in dependencies To avoid having transitive kotlin-stdlib-jdk8 with older version leading to classpath conflicts. ^KT-54703 In Progress --- .../kotlin/gradle/StdlibAlignmentIT.kt | 29 +++++++++++++++++++ .../internal/stdlibDependencyManagement.kt | 11 ++++--- 2 files changed, 36 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibAlignmentIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibAlignmentIT.kt index e833eab83fa..a2669133dee 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibAlignmentIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/StdlibAlignmentIT.kt @@ -84,6 +84,35 @@ class StdlibAlignmentIT : KGPBaseTest() { } } + @JvmGradlePluginTests + @DisplayName("substitution is working when stldib-jdk7:1.8+ is added as dependency") + @GradleTest + fun stdlibJdk7Substitution(gradleVersion: GradleVersion) { + project("sourceSetsKotlinDsl", gradleVersion) { + buildGradleKts.appendText( + """ + | + |dependencies { + | implementation(kotlin("stdlib-jdk7")) + | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2") + |} + """.trimMargin() + ) + + build("dependencies", "--configuration", "compileClasspath") { + assertOutputContains( + """ + |\--- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2 + | \--- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.5.2 + | +--- org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.30 -> org.jetbrains.kotlin:kotlin-stdlib:${buildOptions.kotlinVersion} (*) + | \--- org.jetbrains.kotlin:kotlin-stdlib-common:1.5.30 -> ${buildOptions.kotlinVersion} + | + """.trimMargin() + ) + } + } + } + @JvmGradlePluginTests @DisplayName("stdlib-jdk7, stdlib-jdk8 substitution with stdlib:1.8+ in Kotlin DSL") @GradleTest diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/stdlibDependencyManagement.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/stdlibDependencyManagement.kt index fd3b90f3f47..ff8ef7dceed 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/stdlibDependencyManagement.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/stdlibDependencyManagement.kt @@ -60,7 +60,7 @@ internal fun ConfigurationContainer.configureStdlibSubstitution() = all { config .withType() .configureEach { dependency -> if (dependency.group == KOTLIN_MODULE_GROUP && - dependency.name == "kotlin-stdlib" && + (dependency.name == "kotlin-stdlib" || dependency.name == "kotlin-stdlib-jdk7") && dependency.version != null && SemVer.from(dependency.version!!) >= kotlin180Version ) { @@ -82,9 +82,12 @@ private fun Configuration.substitudeStdlibJvmVariants( kotlinStdlibDependency: ExternalDependency ) { resolutionStrategy.dependencySubstitution { - it.substitute(it.module("org.jetbrains.kotlin:kotlin-stdlib-jdk7")) - .using(it.module("org.jetbrains.kotlin:kotlin-stdlib:${kotlinStdlibDependency.version}")) - .because("kotlin-stdlib-jdk7 is now part of kotlin-stdlib") + if (kotlinStdlibDependency.name != "kotlin-stdlib-jdk7") { + it.substitute(it.module("org.jetbrains.kotlin:kotlin-stdlib-jdk7")) + .using(it.module("org.jetbrains.kotlin:kotlin-stdlib:${kotlinStdlibDependency.version}")) + .because("kotlin-stdlib-jdk7 is now part of kotlin-stdlib") + } + it.substitute(it.module("org.jetbrains.kotlin:kotlin-stdlib-jdk8")) .using(it.module("org.jetbrains.kotlin:kotlin-stdlib:${kotlinStdlibDependency.version}")) .because("kotlin-stdlib-jdk8 is now part of kotlin-stdlib")