[Gradle] Migrate AndroidDependencyResolver to the new variants selection API

#KT-55222 Fixed

Co-authored-by: Vyacheslav Karpukhin <vyacheslav.karpukhin@jetbrains.com>
This commit is contained in:
Alexander Likhachev
2022-12-02 12:13:16 +01:00
committed by Space Team
parent 6bbc577942
commit cb53d0c388
@@ -32,6 +32,7 @@ import org.gradle.api.provider.Provider
import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters
import org.gradle.api.services.BuildServiceRegistry
import org.gradle.internal.component.local.model.DefaultLocalComponentGraphResolveState
import org.gradle.internal.component.model.AttributeConfigurationSelector
import org.gradle.internal.component.model.ConfigurationMetadata
import org.gradle.internal.component.model.IvyArtifactName
@@ -39,6 +40,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.internal
import org.jetbrains.kotlin.gradle.plugin.sources.android.findKotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.sources.internal
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import java.io.File
import java.nio.file.Path
@@ -54,6 +56,9 @@ data class AndroidDependency(
val collection: Set<File>? = null
)
/**
* Used in KMM
*/
@Suppress("unused")
object AndroidDependencyResolver {
private fun getAndroidSdkJar(project: Project, versions: List<String>): AndroidDependency? {
@@ -288,24 +293,50 @@ object AndroidDependencyResolver {
private fun selectConfigurations(
projectDependencies: List<ProjectDependencyInternal>,
attributes: AttributeContainer,
attributesSchema: AttributesSchema
): List<Configuration> {
return projectDependencies.mapNotNull { projectDependency ->
val rootComponentMetaData = (projectDependency.findProjectConfiguration() as? ConfigurationInternal)?.toRootComponentMetaData()
?: return@mapNotNull null
attributesSchema: AttributesSchema,
): List<Configuration> = if (isGradleVersionAtLeast(7, 6)) {
selectConfigurationsGradle76(projectDependencies, attributes, attributesSchema)
} else {
selectConfigurationsGradleLegacy(projectDependencies, attributes, attributesSchema)
}
@Suppress("UNCHECKED_CAST") val selectConfiguration =
AttributeConfigurationSelector::class.staticFunctions.find { it.name == "selectConfigurationUsingAttributeMatching" } as? KFunction<ConfigurationMetadata>
?: error("Static method AttributeConfigurationSelector.selectConfigurationUsingAttributeMatching does not exist")
val matching = selectConfiguration.call(
(attributes as? AttributeContainerInternal)?.asImmutable() ?: return@mapNotNull null,
emptyList<Capability>(),
rootComponentMetaData,
(attributesSchema as? AttributesSchemaInternal) ?: return@mapNotNull null,
emptyList<IvyArtifactName>()
)
projectDependency.dependencyProject.configurations.findByName(matching.name)
}
private fun selectConfigurationsGradle76(
projectDependencies: List<ProjectDependencyInternal>,
attributes: AttributeContainer,
attributesSchema: AttributesSchema,
) = projectDependencies.flatMap { projectDependency ->
val rootComponentMetaData = (projectDependency.findProjectConfiguration() as? ConfigurationInternal)?.toRootComponentMetaData()
?: return@flatMap emptyList()
val matching = AttributeConfigurationSelector.selectVariantsUsingAttributeMatching(
(attributes as? AttributeContainerInternal)?.asImmutable() ?: return@flatMap emptyList(),
emptyList<Capability>(),
DefaultLocalComponentGraphResolveState(rootComponentMetaData),
(attributesSchema as? AttributesSchemaInternal) ?: return@flatMap emptyList(),
emptyList()
)
matching.variants.mapNotNull { projectDependency.dependencyProject.configurations.findByName(it.name) }
}
private fun selectConfigurationsGradleLegacy(
projectDependencies: List<ProjectDependencyInternal>,
attributes: AttributeContainer,
attributesSchema: AttributesSchema,
) = projectDependencies.mapNotNull { projectDependency ->
val rootComponentMetaData = (projectDependency.findProjectConfiguration() as? ConfigurationInternal)?.toRootComponentMetaData()
?: return@mapNotNull null
@Suppress("UNCHECKED_CAST") val selectConfiguration =
AttributeConfigurationSelector::class.staticFunctions.find { it.name == "selectConfigurationUsingAttributeMatching" } as? KFunction<ConfigurationMetadata>
?: error("Static method AttributeConfigurationSelector.selectConfigurationUsingAttributeMatching does not exist")
val matching = selectConfiguration.call(
(attributes as? AttributeContainerInternal)?.asImmutable() ?: return@mapNotNull null,
emptyList<Capability>(),
rootComponentMetaData,
(attributesSchema as? AttributesSchemaInternal) ?: return@mapNotNull null,
emptyList<IvyArtifactName>()
)
projectDependency.dependencyProject.configurations.findByName(matching.name)
}
private inline fun <E, K> MutableSet<E>.addOrRetainAll(c: Collection<E>, crossinline selector: (E) -> K) {