[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:
committed by
Space Team
parent
6bbc577942
commit
cb53d0c388
+48
-17
@@ -32,6 +32,7 @@ import org.gradle.api.provider.Provider
|
|||||||
import org.gradle.api.services.BuildService
|
import org.gradle.api.services.BuildService
|
||||||
import org.gradle.api.services.BuildServiceParameters
|
import org.gradle.api.services.BuildServiceParameters
|
||||||
import org.gradle.api.services.BuildServiceRegistry
|
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.AttributeConfigurationSelector
|
||||||
import org.gradle.internal.component.model.ConfigurationMetadata
|
import org.gradle.internal.component.model.ConfigurationMetadata
|
||||||
import org.gradle.internal.component.model.IvyArtifactName
|
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.android.findKotlinSourceSet
|
||||||
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
import org.jetbrains.kotlin.gradle.plugin.sources.internal
|
||||||
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
|
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.isGradleVersionAtLeast
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.nio.file.Path
|
import java.nio.file.Path
|
||||||
@@ -54,6 +56,9 @@ data class AndroidDependency(
|
|||||||
val collection: Set<File>? = null
|
val collection: Set<File>? = null
|
||||||
)
|
)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used in KMM
|
||||||
|
*/
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object AndroidDependencyResolver {
|
object AndroidDependencyResolver {
|
||||||
private fun getAndroidSdkJar(project: Project, versions: List<String>): AndroidDependency? {
|
private fun getAndroidSdkJar(project: Project, versions: List<String>): AndroidDependency? {
|
||||||
@@ -288,24 +293,50 @@ object AndroidDependencyResolver {
|
|||||||
private fun selectConfigurations(
|
private fun selectConfigurations(
|
||||||
projectDependencies: List<ProjectDependencyInternal>,
|
projectDependencies: List<ProjectDependencyInternal>,
|
||||||
attributes: AttributeContainer,
|
attributes: AttributeContainer,
|
||||||
attributesSchema: AttributesSchema
|
attributesSchema: AttributesSchema,
|
||||||
): List<Configuration> {
|
): List<Configuration> = if (isGradleVersionAtLeast(7, 6)) {
|
||||||
return projectDependencies.mapNotNull { projectDependency ->
|
selectConfigurationsGradle76(projectDependencies, attributes, attributesSchema)
|
||||||
val rootComponentMetaData = (projectDependency.findProjectConfiguration() as? ConfigurationInternal)?.toRootComponentMetaData()
|
} else {
|
||||||
?: return@mapNotNull null
|
selectConfigurationsGradleLegacy(projectDependencies, attributes, attributesSchema)
|
||||||
|
}
|
||||||
|
|
||||||
@Suppress("UNCHECKED_CAST") val selectConfiguration =
|
private fun selectConfigurationsGradle76(
|
||||||
AttributeConfigurationSelector::class.staticFunctions.find { it.name == "selectConfigurationUsingAttributeMatching" } as? KFunction<ConfigurationMetadata>
|
projectDependencies: List<ProjectDependencyInternal>,
|
||||||
?: error("Static method AttributeConfigurationSelector.selectConfigurationUsingAttributeMatching does not exist")
|
attributes: AttributeContainer,
|
||||||
val matching = selectConfiguration.call(
|
attributesSchema: AttributesSchema,
|
||||||
(attributes as? AttributeContainerInternal)?.asImmutable() ?: return@mapNotNull null,
|
) = projectDependencies.flatMap { projectDependency ->
|
||||||
emptyList<Capability>(),
|
val rootComponentMetaData = (projectDependency.findProjectConfiguration() as? ConfigurationInternal)?.toRootComponentMetaData()
|
||||||
rootComponentMetaData,
|
?: return@flatMap emptyList()
|
||||||
(attributesSchema as? AttributesSchemaInternal) ?: return@mapNotNull null,
|
|
||||||
emptyList<IvyArtifactName>()
|
val matching = AttributeConfigurationSelector.selectVariantsUsingAttributeMatching(
|
||||||
)
|
(attributes as? AttributeContainerInternal)?.asImmutable() ?: return@flatMap emptyList(),
|
||||||
projectDependency.dependencyProject.configurations.findByName(matching.name)
|
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) {
|
private inline fun <E, K> MutableSet<E>.addOrRetainAll(c: Collection<E>, crossinline selector: (E) -> K) {
|
||||||
|
|||||||
Reference in New Issue
Block a user