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 f5721052869..dfb5a5014b1 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 @@ -6,9 +6,8 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Named -import org.gradle.api.attributes.Attribute -import org.gradle.api.attributes.AttributeCompatibilityRule -import org.gradle.api.attributes.CompatibilityCheckDetails +import org.gradle.api.attributes.* +import org.gradle.util.GradleVersion import java.io.Serializable enum class KotlinPlatformType: Named, Serializable { @@ -17,19 +16,45 @@ enum class KotlinPlatformType: Named, Serializable { override fun toString(): String = name override fun getName(): String = name + class CompatibilityRule : AttributeCompatibilityRule { + override fun execute(details: CompatibilityCheckDetails) = with(details) { + if (producerValue == jvm && consumerValue == androidJvm) + compatible() + + // Allow the input metadata configuration consume platform-specific artifacts if no metadata is available, KT-26834 + if (consumerValue == common) + compatible() + } + } + + class DisambiguationRule : AttributeDisambiguationRule { + override fun execute(details: MultipleCandidatesDetails) = with(details) { + if (candidateValues == setOf(androidJvm, jvm)) + closestMatch(androidJvm) + + if (common in candidateValues) + // then the consumer requests common or requests no platform-specific artifacts, + // so common is the best match, KT-26834 + closestMatch(common) + } + } + companion object { val attribute = Attribute.of( "org.jetbrains.kotlin.platform.type", KotlinPlatformType::class.java ) - } - class CompatibilityRule : AttributeCompatibilityRule { - override fun execute(details: CompatibilityCheckDetails) = with(details) { - when { - producerValue == jvm && consumerValue == androidJvm -> compatible() - producerValue == consumerValue -> compatible() + fun setupAttributesMatchingStrategy(attributesSchema: AttributesSchema) { + attributesSchema.attribute(KotlinPlatformType.attribute).run { + if (isGradleVersionAtLeast(4, 0)) { + compatibilityRules.add(CompatibilityRule::class.java) + disambiguationRules.add(DisambiguationRule::class.java) + } } } } -} \ No newline at end of file +} + +private fun isGradleVersionAtLeast(major: Int, minor: Int) = + GradleVersion.current() >= GradleVersion.version("$major.$minor") \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 99b41521b19..ad215daff08 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -78,11 +78,7 @@ abstract class KotlinBasePluginWrapper( } private fun setupAttributeMatchingStrategy(project: Project) = with(project.dependencies.attributesSchema) { - attribute(KotlinPlatformType.attribute).run { - if (isGradleVersionAtLeast(4, 0)) { - compatibilityRules.add(KotlinPlatformType.CompatibilityRule::class.java) - } - } + KotlinPlatformType.setupAttributesMatchingStrategy(this) } internal abstract fun getPlugin(