[Gradle][Minor] Move, deduplicate and rename Project.forEachVariant

KT-54312
This commit is contained in:
Sebastian Sellmair
2022-09-27 13:55:56 +02:00
committed by Space Team
parent 4d8fbc1feb
commit 1d397b1c3b
8 changed files with 45 additions and 54 deletions
@@ -803,22 +803,3 @@ internal fun ifKaptEnabled(project: Project, block: () -> Unit) {
private fun SourceSet.clearJavaSrcDirs() { private fun SourceSet.clearJavaSrcDirs() {
java.setSrcDirs(emptyList<File>()) java.setSrcDirs(emptyList<File>())
} }
internal fun Project.forEachVariant(action: (BaseVariant) -> Unit) {
val androidExtension = this.extensions.getByName("android")
when (androidExtension) {
is AppExtension -> androidExtension.applicationVariants.all(action)
is LibraryExtension -> {
androidExtension.libraryVariants.all(action)
if (androidExtension is FeatureExtension) {
androidExtension.featureVariants.all(action)
}
}
is TestExtension -> androidExtension.applicationVariants.all(action)
}
if (androidExtension is TestedExtension) {
androidExtension.testVariants.all(action)
androidExtension.unitTestVariants.all(action)
}
}
@@ -7,10 +7,10 @@ package org.jetbrains.kotlin.gradle.plugin.sources.android
import org.gradle.api.logging.Logging import org.gradle.api.logging.Logging
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.plugin.forEachVariant
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget
import org.jetbrains.kotlin.gradle.plugin.sources.android.checker.KotlinAndroidSourceSetLayoutChecker import org.jetbrains.kotlin.gradle.plugin.sources.android.checker.KotlinAndroidSourceSetLayoutChecker
import org.jetbrains.kotlin.gradle.utils.androidExtension import org.jetbrains.kotlin.gradle.utils.androidExtension
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheck import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheck
internal object KotlinAndroidSourceSets { internal object KotlinAndroidSourceSets {
@@ -46,7 +46,7 @@ internal object KotlinAndroidSourceSets {
} }
/* Hook into Android's variant creation: This is invoked in 'afterEvaluate' */ /* Hook into Android's variant creation: This is invoked in 'afterEvaluate' */
forEachVariant(target.project) { variant -> target.project.forAllAndroidVariants { variant ->
variant.sourceSets.forEach { sourceProvider -> variant.sourceSets.forEach { sourceProvider ->
val androidSourceSet = android.sourceSets.findByName(sourceProvider.name) ?: return@forEach val androidSourceSet = android.sourceSets.findByName(sourceProvider.name) ?: return@forEach
@@ -41,10 +41,7 @@ import org.jetbrains.kotlin.gradle.tasks.configuration.KotlinCompileConfig
import org.jetbrains.kotlin.gradle.tasks.thisTaskProvider import org.jetbrains.kotlin.gradle.tasks.thisTaskProvider
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.tooling.includeKotlinToolingMetadataInApk import org.jetbrains.kotlin.gradle.tooling.includeKotlinToolingMetadataInApk
import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.androidPluginIds
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.newInstance
import java.io.File import java.io.File
import java.io.ObjectInputStream import java.io.ObjectInputStream
import java.io.ObjectOutputStream import java.io.ObjectOutputStream
@@ -78,7 +75,7 @@ internal class AndroidProjectHandler(
"plugins to be applied to the project:\n\t" + "plugins to be applied to the project:\n\t" +
androidPluginIds.joinToString("\n\t") { "* $it" }) androidPluginIds.joinToString("\n\t") { "* $it" })
project.forEachVariant { variant -> project.forAllAndroidVariants { variant ->
val compilationFactory = KotlinJvmAndroidCompilationFactory(kotlinAndroidTarget, variant) val compilationFactory = KotlinJvmAndroidCompilationFactory(kotlinAndroidTarget, variant)
val variantName = getVariantName(variant) val variantName = getVariantName(variant)
@@ -101,7 +98,7 @@ internal class AndroidProjectHandler(
} }
project.whenEvaluated { project.whenEvaluated {
forEachVariant { variant -> forAllAndroidVariants { variant ->
val compilation = kotlinAndroidTarget.compilations.getByName(getVariantName(variant)) val compilation = kotlinAndroidTarget.compilations.getByName(getVariantName(variant))
postprocessVariant(variant, compilation, project, ext, plugin) postprocessVariant(variant, compilation, project, ext, plugin)
@@ -201,7 +198,7 @@ internal class AndroidProjectHandler(
project.tasks.matching { it.name == allTestTaskName }.configureEach { task -> project.tasks.matching { it.name == allTestTaskName }.configureEach { task ->
task.dependsOn(project.provider { task.dependsOn(project.provider {
val androidUnitTestTasks = mutableListOf<Any>() val androidUnitTestTasks = mutableListOf<Any>()
forEachVariant(project) { variant -> project.forAllAndroidVariants { variant ->
if (variant is UnitTestVariant) { if (variant is UnitTestVariant) {
// There's no API for getting the Android unit test tasks from the variant, so match them by name: // There's no API for getting the Android unit test tasks from the variant, so match them by name:
androidUnitTestTasks.add(project.provider { androidUnitTestTasks.add(project.provider {
@@ -398,24 +395,6 @@ internal fun BaseVariant.getJavaTaskProvider(): TaskProvider<out JavaCompile> =
?.invoke(this) as? TaskProvider<JavaCompile> ?.invoke(this) as? TaskProvider<JavaCompile>
?: @Suppress("DEPRECATION") javaCompile.thisTaskProvider ?: @Suppress("DEPRECATION") javaCompile.thisTaskProvider
internal fun forEachVariant(project: Project, action: (BaseVariant) -> Unit) {
val androidExtension = project.extensions.getByName("android")
when (androidExtension) {
is AppExtension -> androidExtension.applicationVariants.all(action)
is LibraryExtension -> {
androidExtension.libraryVariants.all(action)
if (androidExtension is FeatureExtension) {
androidExtension.featureVariants.all(action)
}
}
is TestExtension -> androidExtension.applicationVariants.all(action)
}
if (androidExtension is TestedExtension) {
androidExtension.testVariants.all(action)
androidExtension.unitTestVariants.all(action)
}
}
/** Filter for the AGP test variant classpath artifacts. */ /** Filter for the AGP test variant classpath artifacts. */
class AndroidTestedVariantArtifactsFilter( class AndroidTestedVariantArtifactsFilter(
private val artifactCollection: ArtifactCollection, private val artifactCollection: ArtifactCollection,
@@ -15,6 +15,7 @@ import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.gradle.utils.setProperty import org.jetbrains.kotlin.gradle.utils.setProperty
import javax.inject.Inject import javax.inject.Inject
@@ -66,7 +67,7 @@ abstract class KotlinAndroidTarget @Inject constructor(
private fun checkPublishLibraryVariantsExist() { private fun checkPublishLibraryVariantsExist() {
fun AndroidProjectHandler.getLibraryVariantNames() = fun AndroidProjectHandler.getLibraryVariantNames() =
mutableSetOf<String>().apply { mutableSetOf<String>().apply {
project.forEachVariant { project.forAllAndroidVariants {
if (getLibraryOutputTask(it) != null) if (getLibraryOutputTask(it) != null)
add(getVariantName(it)) add(getVariantName(it))
} }
@@ -99,7 +100,7 @@ abstract class KotlinAndroidTarget @Inject constructor(
private fun AndroidProjectHandler.doCreateComponents(): Set<KotlinTargetComponent> { private fun AndroidProjectHandler.doCreateComponents(): Set<KotlinTargetComponent> {
val publishableVariants = mutableListOf<BaseVariant>() val publishableVariants = mutableListOf<BaseVariant>()
.apply { project.forEachVariant { add(it) } } .apply { project.forAllAndroidVariants { add(it) } }
.toList() // Defensive copy against unlikely modification by the lambda that captures the list above in forEachVariant { } .toList() // Defensive copy against unlikely modification by the lambda that captures the list above in forEachVariant { }
.filter { getLibraryOutputTask(it) != null } .filter { getLibraryOutputTask(it) != null }
@@ -33,7 +33,7 @@ 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.model.AttributeConfigurationSelector import org.gradle.internal.component.model.AttributeConfigurationSelector
import org.jetbrains.kotlin.gradle.plugin.forEachVariant import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
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
@@ -136,7 +136,7 @@ object AndroidDependencyResolver {
val sourceSet2Impl = HashMap<String, SourceSetConfigs>() val sourceSet2Impl = HashMap<String, SourceSetConfigs>()
val allImplConfigs = HashSet<Configuration>() val allImplConfigs = HashSet<Configuration>()
project.forEachVariant { variant -> project.forAllAndroidVariants { variant ->
val compileConfig = variant.compileConfiguration val compileConfig = variant.compileConfiguration
variant.sourceSets.filterIsInstance(AndroidSourceSet::class.java).map { variant.sourceSets.filterIsInstance(AndroidSourceSet::class.java).map {
val implConfig = project.configurations.getByName(it.implementationConfigurationName) val implConfig = project.configurations.getByName(it.implementationConfigurationName)
@@ -12,6 +12,7 @@ import org.gradle.api.Project
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
// Use apply plugin: 'kotlin-parcelize' to enable Android Extensions in an Android project. // Use apply plugin: 'kotlin-parcelize' to enable Android Extensions in an Android project.
class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin { class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin {
@@ -23,7 +24,7 @@ class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin {
val kotlinPluginVersion = target.getKotlinPluginVersion() val kotlinPluginVersion = target.getKotlinPluginVersion()
val dependency = target.dependencies.create("org.jetbrains.kotlin:kotlin-parcelize-runtime:$kotlinPluginVersion") val dependency = target.dependencies.create("org.jetbrains.kotlin:kotlin-parcelize-runtime:$kotlinPluginVersion")
target.forEachVariant { target.forAllAndroidVariants {
it.runtimeConfiguration.dependencies.add(dependency) it.runtimeConfiguration.dependencies.add(dependency)
it.compileConfiguration.dependencies.add(dependency) it.compileConfiguration.dependencies.add(dependency)
} }
@@ -0,0 +1,29 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.utils
import com.android.build.gradle.*
import com.android.build.gradle.api.BaseVariant
import org.gradle.api.Project
internal fun Project.forAllAndroidVariants(action: (BaseVariant) -> Unit) {
val androidExtension = this.extensions.getByName("android")
when (androidExtension) {
is AppExtension -> androidExtension.applicationVariants.all(action)
is LibraryExtension -> {
androidExtension.libraryVariants.all(action)
if (androidExtension is FeatureExtension) {
androidExtension.featureVariants.all(action)
}
}
is TestExtension -> androidExtension.applicationVariants.all(action)
}
if (androidExtension is TestedExtension) {
androidExtension.testVariants.all(action)
androidExtension.unitTestVariants.all(action)
}
}
@@ -13,10 +13,10 @@ import com.android.builder.model.SourceProvider
import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.project.ProjectInternal
import org.gradle.testfixtures.ProjectBuilder import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.gradle.applyMultiplatformPlugin import org.jetbrains.kotlin.gradle.applyMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.forEachVariant
import org.jetbrains.kotlin.gradle.plugin.sources.android.* import org.jetbrains.kotlin.gradle.plugin.sources.android.*
import org.jetbrains.kotlin.gradle.setMultiplatformAndroidSourceSetLayoutVersion import org.jetbrains.kotlin.gradle.setMultiplatformAndroidSourceSetLayoutVersion
import org.jetbrains.kotlin.gradle.utils.androidExtension import org.jetbrains.kotlin.gradle.utils.androidExtension
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertFalse import kotlin.test.assertFalse
@@ -185,7 +185,7 @@ class MultiplatformAndroidSourceSetLayoutV2Test {
fun `test - kotlin source directories - are in sync between KotlinSourceSet and AndroidSourceSet`() { fun `test - kotlin source directories - are in sync between KotlinSourceSet and AndroidSourceSet`() {
kotlin.android() kotlin.android()
forEachVariant(project) { variant -> project.forAllAndroidVariants { variant ->
variant.sourceSets.forEach { androidSourceSet -> variant.sourceSets.forEach { androidSourceSet ->
androidSourceSet as SourceProvider androidSourceSet as SourceProvider
@@ -213,7 +213,7 @@ class MultiplatformAndroidSourceSetLayoutV2Test {
fun `test - kotlin source directories - supports AGP default location`() { fun `test - kotlin source directories - supports AGP default location`() {
kotlin.android() kotlin.android()
forEachVariant(project) { variant -> project.forAllAndroidVariants { variant ->
variant.sourceSets.forEach { androidSourceSet -> variant.sourceSets.forEach { androidSourceSet ->
val kotlinSourceSet = project.getKotlinSourceSetOrFail(androidSourceSet) val kotlinSourceSet = project.getKotlinSourceSetOrFail(androidSourceSet)
assertTrue( assertTrue(