From cb53d0c38888eb5f813a2302564ca23b37e58ba8 Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Fri, 2 Dec 2022 12:13:16 +0100 Subject: [PATCH] [Gradle] Migrate AndroidDependencyResolver to the new variants selection API #KT-55222 Fixed Co-authored-by: Vyacheslav Karpukhin --- .../internal/AndroidDependencyResolver.kt | 65 ++++++++++++++----- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt index c5a81bfed81..10c6c01fa09 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/AndroidDependencyResolver.kt @@ -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? = null ) +/** + * Used in KMM + */ @Suppress("unused") object AndroidDependencyResolver { private fun getAndroidSdkJar(project: Project, versions: List): AndroidDependency? { @@ -288,24 +293,50 @@ object AndroidDependencyResolver { private fun selectConfigurations( projectDependencies: List, attributes: AttributeContainer, - attributesSchema: AttributesSchema - ): List { - return projectDependencies.mapNotNull { projectDependency -> - val rootComponentMetaData = (projectDependency.findProjectConfiguration() as? ConfigurationInternal)?.toRootComponentMetaData() - ?: return@mapNotNull null + attributesSchema: AttributesSchema, + ): List = 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 - ?: error("Static method AttributeConfigurationSelector.selectConfigurationUsingAttributeMatching does not exist") - val matching = selectConfiguration.call( - (attributes as? AttributeContainerInternal)?.asImmutable() ?: return@mapNotNull null, - emptyList(), - rootComponentMetaData, - (attributesSchema as? AttributesSchemaInternal) ?: return@mapNotNull null, - emptyList() - ) - projectDependency.dependencyProject.configurations.findByName(matching.name) - } + private fun selectConfigurationsGradle76( + projectDependencies: List, + 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(), + DefaultLocalComponentGraphResolveState(rootComponentMetaData), + (attributesSchema as? AttributesSchemaInternal) ?: return@flatMap emptyList(), + emptyList() + ) + matching.variants.mapNotNull { projectDependency.dependencyProject.configurations.findByName(it.name) } + } + + private fun selectConfigurationsGradleLegacy( + projectDependencies: List, + 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 + ?: error("Static method AttributeConfigurationSelector.selectConfigurationUsingAttributeMatching does not exist") + val matching = selectConfiguration.call( + (attributes as? AttributeContainerInternal)?.asImmutable() ?: return@mapNotNull null, + emptyList(), + rootComponentMetaData, + (attributesSchema as? AttributesSchemaInternal) ?: return@mapNotNull null, + emptyList() + ) + projectDependency.dependencyProject.configurations.findByName(matching.name) } private inline fun MutableSet.addOrRetainAll(c: Collection, crossinline selector: (E) -> K) {