[Gradle] Compare resolved components ignoring versions for source sets

Source Set Visibility algorithm relies on the match between metadata
dependencies resolution and platform dependencies resolution. However
there is a chance that they don't match in versions.
i.e. commonMain resolved into 1.0 but jvmMain got 2.0 of the same
library. However this discrepancy is not correct after all. And
both metadata compilations and platform compilations should see the same
set of libraries. This behavior will be fixed in KT-66047

^KT-65954 Verification Pending
This commit is contained in:
Anton Lakotka
2024-02-23 08:42:25 +01:00
committed by Space Team
parent 32be35051d
commit 46abf63796
@@ -6,6 +6,9 @@
package org.jetbrains.kotlin.gradle.plugin.mpp
import org.gradle.api.Project
import org.gradle.api.artifacts.component.ComponentIdentifier
import org.gradle.api.artifacts.component.ModuleComponentIdentifier
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
@@ -93,7 +96,7 @@ internal class SourceSetVisibilityProvider(
val resolvedPlatformDependencies = platformCompilationData
.resolvedDependenciesConfiguration
.allResolvedDependencies
.filter { it.selected.id == resolvedRootMppDependencyId }
.filter { it.selected.id isEqualsIgnoringVersion resolvedRootMppDependencyId }
/*
Returning null if we can't find the given dependency in a certain platform compilations dependencies.
This is not expected, since this means the dependency does not support the given targets which will
@@ -198,3 +201,13 @@ internal class SourceSetVisibilityProvider(
internal fun kotlinVariantNameFromPublishedVariantName(resolvedToVariantName: String): String =
originalVariantNameFromPublished(resolvedToVariantName) ?: resolvedToVariantName
/**
* Returns true when two components identifiers are from the same maven module (group + name)
* Gradle projects can't be resolved into multiple versions since there is only one version of a project in gradle build
*/
private infix fun ComponentIdentifier.isEqualsIgnoringVersion(that: ComponentIdentifier): Boolean {
if (this is ProjectComponentIdentifier && that is ProjectComponentIdentifier) return this == that
if (this is ModuleComponentIdentifier && that is ModuleComponentIdentifier) return this.moduleIdentifier == that.moduleIdentifier
return false
}