diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index fa9f682cb4a..2082034ea9f 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -803,22 +803,3 @@ internal fun ifKaptEnabled(project: Project, block: () -> Unit) { private fun SourceSet.clearJavaSrcDirs() { java.setSrcDirs(emptyList()) } - -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) - } -} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSets.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSets.kt index 1d24fdfced9..8734062f6fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSets.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/android/KotlinAndroidSourceSets.kt @@ -7,10 +7,10 @@ package org.jetbrains.kotlin.gradle.plugin.sources.android import org.gradle.api.logging.Logging 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.sources.android.checker.KotlinAndroidSourceSetLayoutChecker import org.jetbrains.kotlin.gradle.utils.androidExtension +import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants import org.jetbrains.kotlin.gradle.utils.runProjectConfigurationHealthCheck internal object KotlinAndroidSourceSets { @@ -46,7 +46,7 @@ internal object KotlinAndroidSourceSets { } /* Hook into Android's variant creation: This is invoked in 'afterEvaluate' */ - forEachVariant(target.project) { variant -> + target.project.forAllAndroidVariants { variant -> variant.sourceSets.forEach { sourceProvider -> val androidSourceSet = android.sourceSets.findByName(sourceProvider.name) ?: return@forEach diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt index 66bb2e63463..eb58221eca6 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/AndroidProjectHandler.kt @@ -41,10 +41,7 @@ import org.jetbrains.kotlin.gradle.tasks.configuration.KotlinCompileConfig import org.jetbrains.kotlin.gradle.tasks.thisTaskProvider import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry import org.jetbrains.kotlin.gradle.tooling.includeKotlinToolingMetadataInApk -import org.jetbrains.kotlin.gradle.utils.addExtendsFromRelation -import org.jetbrains.kotlin.gradle.utils.androidPluginIds -import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName -import org.jetbrains.kotlin.gradle.utils.newInstance +import org.jetbrains.kotlin.gradle.utils.* import java.io.File import java.io.ObjectInputStream import java.io.ObjectOutputStream @@ -78,7 +75,7 @@ internal class AndroidProjectHandler( "plugins to be applied to the project:\n\t" + androidPluginIds.joinToString("\n\t") { "* $it" }) - project.forEachVariant { variant -> + project.forAllAndroidVariants { variant -> val compilationFactory = KotlinJvmAndroidCompilationFactory(kotlinAndroidTarget, variant) val variantName = getVariantName(variant) @@ -101,7 +98,7 @@ internal class AndroidProjectHandler( } project.whenEvaluated { - forEachVariant { variant -> + forAllAndroidVariants { variant -> val compilation = kotlinAndroidTarget.compilations.getByName(getVariantName(variant)) postprocessVariant(variant, compilation, project, ext, plugin) @@ -201,7 +198,7 @@ internal class AndroidProjectHandler( project.tasks.matching { it.name == allTestTaskName }.configureEach { task -> task.dependsOn(project.provider { val androidUnitTestTasks = mutableListOf() - forEachVariant(project) { variant -> + project.forAllAndroidVariants { variant -> if (variant is UnitTestVariant) { // There's no API for getting the Android unit test tasks from the variant, so match them by name: androidUnitTestTasks.add(project.provider { @@ -398,24 +395,6 @@ internal fun BaseVariant.getJavaTaskProvider(): TaskProvider = ?.invoke(this) as? TaskProvider ?: @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. */ class AndroidTestedVariantArtifactsFilter( private val artifactCollection: ArtifactCollection, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt index c6c663766fb..c9ce47159b7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/KotlinAndroidTarget.kt @@ -15,6 +15,7 @@ import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.Usage.JAVA_RUNTIME_JARS import org.jetbrains.kotlin.gradle.plugin.* 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.setProperty import javax.inject.Inject @@ -66,7 +67,7 @@ abstract class KotlinAndroidTarget @Inject constructor( private fun checkPublishLibraryVariantsExist() { fun AndroidProjectHandler.getLibraryVariantNames() = mutableSetOf().apply { - project.forEachVariant { + project.forAllAndroidVariants { if (getLibraryOutputTask(it) != null) add(getVariantName(it)) } @@ -99,7 +100,7 @@ abstract class KotlinAndroidTarget @Inject constructor( private fun AndroidProjectHandler.doCreateComponents(): Set { val publishableVariants = mutableListOf() - .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 { } .filter { getLibraryOutputTask(it) != null } 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 52e8e408fa9..641d5b59420 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 @@ -33,7 +33,7 @@ import org.gradle.api.services.BuildService import org.gradle.api.services.BuildServiceParameters import org.gradle.api.services.BuildServiceRegistry 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 java.io.File import java.nio.file.Path @@ -136,7 +136,7 @@ object AndroidDependencyResolver { val sourceSet2Impl = HashMap() val allImplConfigs = HashSet() - project.forEachVariant { variant -> + project.forAllAndroidVariants { variant -> val compileConfig = variant.compileConfiguration variant.sourceSets.filterIsInstance(AndroidSourceSet::class.java).map { val implConfig = project.configurations.getByName(it.implementationConfigurationName) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt index aa569e08276..a9c681c41f7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/android/internal/ParcelizeSubplugin.kt @@ -12,6 +12,7 @@ import org.gradle.api.Project import org.gradle.api.provider.Provider import org.jetbrains.kotlin.gradle.plugin.* 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. class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin { @@ -23,7 +24,7 @@ class ParcelizeSubplugin : KotlinCompilerPluginSupportPlugin { val kotlinPluginVersion = target.getKotlinPluginVersion() val dependency = target.dependencies.create("org.jetbrains.kotlin:kotlin-parcelize-runtime:$kotlinPluginVersion") - target.forEachVariant { + target.forAllAndroidVariants { it.runtimeConfiguration.dependencies.add(dependency) it.compileConfiguration.dependencies.add(dependency) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/forEachAndroidVariant.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/forEachAndroidVariant.kt new file mode 100644 index 00000000000..89307777540 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/forEachAndroidVariant.kt @@ -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) + } +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt index fdc1f517ec8..5f9f0440fa3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/sources/android/MultiplatformAndroidSourceSetLayoutV2Test.kt @@ -13,10 +13,10 @@ import com.android.builder.model.SourceProvider import org.gradle.api.internal.project.ProjectInternal import org.gradle.testfixtures.ProjectBuilder 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.setMultiplatformAndroidSourceSetLayoutVersion import org.jetbrains.kotlin.gradle.utils.androidExtension +import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants import org.junit.Test import kotlin.test.assertEquals import kotlin.test.assertFalse @@ -185,7 +185,7 @@ class MultiplatformAndroidSourceSetLayoutV2Test { fun `test - kotlin source directories - are in sync between KotlinSourceSet and AndroidSourceSet`() { kotlin.android() - forEachVariant(project) { variant -> + project.forAllAndroidVariants { variant -> variant.sourceSets.forEach { androidSourceSet -> androidSourceSet as SourceProvider @@ -213,7 +213,7 @@ class MultiplatformAndroidSourceSetLayoutV2Test { fun `test - kotlin source directories - supports AGP default location`() { kotlin.android() - forEachVariant(project) { variant -> + project.forAllAndroidVariants { variant -> variant.sourceSets.forEach { androidSourceSet -> val kotlinSourceSet = project.getKotlinSourceSetOrFail(androidSourceSet) assertTrue(