From aebca19fd75a693ce870dc23500f88d8ca3a3c54 Mon Sep 17 00:00:00 2001 From: Sergey Igushkin Date: Sat, 11 Jul 2020 18:18:39 +0400 Subject: [PATCH] Fix resolving an MPP dependency in custom configurations (KT-32239) In the `KotlinPlatformType` disambiguation rule, don't prefer `common` when there's a `jvm` or an `androidJvm` variant, as this would conflict with disambiguation rules created by the other plugins, such as Gradle's `java` which will choose `org.gradle.usage=java-api` and lead to ambiguity. Issue #KT-32239 Fixed --- .../gradle/plugin/KotlinPlatformType.kt | 6 +++-- .../gradle/VariantAwareDependenciesIT.kt | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt index ab6bae3d678..0bfb56dd2bd 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlatformType.kt @@ -32,10 +32,12 @@ enum class KotlinPlatformType: Named, Serializable { if (candidateValues == setOf(androidJvm, jvm)) closestMatch(androidJvm) - if (common in candidateValues) + if (common in candidateValues && jvm !in candidateValues && androidJvm !in candidateValues) { // then the consumer requests common or requests no platform-specific artifacts, - // so common is the best match, KT-26834 + // so common is the best match, KT-26834; apply this rule only when no JVM variant is available, + // as doing otherwise would conflict with Gradle java's disambiguation rules and lead to KT-32239 closestMatch(common) + } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt index 889629f2c33..0066f2d5cde 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/VariantAwareDependenciesIT.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType import org.jetbrains.kotlin.gradle.util.* import org.junit.Test +import kotlin.test.assertTrue class VariantAwareDependenciesIT : BaseGradleIT() { private val gradleVersion = GradleVersionRequired.FOR_MPP_SUPPORT @@ -315,6 +316,27 @@ class VariantAwareDependenciesIT : BaseGradleIT() { } } + @Test + fun testResolveDependencyOnMppInCustomConfiguration() = with(Project("simpleProject", GradleVersionRequired.FOR_MPP_SUPPORT)) { + setupWorkingDir() + + gradleBuildScript().appendText( + "\n" + """ + configurations.create("custom") + repositories.maven { setUrl("https://dl.bintray.com/kotlin/kotlin-dev") } + dependencies { custom("org.jetbrains.kotlinx:kotlinx-cli:0.2.0-dev-7") } + tasks.register("resolveCustom") { doLast { println("###" + configurations.custom.toList()) } } + """.trimIndent() + ) + + build("resolveCustom") { + assertSuccessful() + val printedLine = output.lines().single { "###" in it }.substringAfter("###") + val items = printedLine.removeSurrounding("[", "]").split(", ") + assertTrue(items.toString()) { items.any { "kotlinx-cli-jvm" in it } } + } + } + } internal fun BaseGradleIT.Project.embedProject(other: BaseGradleIT.Project, renameTo: String? = null) {