diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/KotlinTargetHierarchy.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/KotlinTargetHierarchy.kt index 5dfb88c17e2..c1fcbdb8876 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/KotlinTargetHierarchy.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/KotlinTargetHierarchy.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation +import org.jetbrains.kotlin.gradle.plugin.sources.android.type import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.tooling.core.withClosure @@ -24,8 +26,13 @@ internal data class KotlinTargetHierarchy( } data class Group(val name: String) : Node() { - override fun sharedSourceSetName(compilation: KotlinCompilation<*>): String { - return lowerCamelCaseName(name, compilation.name) + override fun sharedSourceSetName(compilation: KotlinCompilation<*>): String? { + val suffix = when (compilation) { + is KotlinJvmAndroidCompilation -> compilation.androidVariant.type.androidBaseSourceSetName?.name + else -> compilation.name + } ?: return null + + return lowerCamelCaseName(name, suffix) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/applyKotlinTargetHierarchy.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/applyKotlinTargetHierarchy.kt index e15bb34aa38..dc60894807c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/applyKotlinTargetHierarchy.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/applyKotlinTargetHierarchy.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy import org.gradle.api.DomainObjectCollection import org.gradle.api.NamedDomainObjectContainer import org.jetbrains.kotlin.gradle.plugin.* +import org.jetbrains.kotlin.gradle.plugin.mpp.internal internal fun applyKotlinTargetHierarchy( hierarchyDescriptor: KotlinTargetHierarchyDescriptor, @@ -39,7 +40,9 @@ private fun applyKotlinTargetHierarchy( if (hierarchy.children.isNotEmpty()) { childSourceSets.forEach { childSourceSet -> childSourceSet.dependsOn(sharedSourceSet) } } else { - compilation.defaultSourceSet.dependsOn(sharedSourceSet) + compilation.internal.kotlinSourceSets.forAll { compilationSourceSet -> + compilationSourceSet.dependsOn(sharedSourceSet) + } } return sharedSourceSet diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/naturalKotlinTargetHierarchy.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/naturalKotlinTargetHierarchy.kt index dbf5b8ed268..f0368666135 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/naturalKotlinTargetHierarchy.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/naturalKotlinTargetHierarchy.kt @@ -5,13 +5,19 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchyDescriptor +import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJvmAndroidCompilation import org.jetbrains.kotlin.gradle.plugin.mpp.isMain import org.jetbrains.kotlin.gradle.plugin.mpp.isTest +import org.jetbrains.kotlin.gradle.plugin.sources.android.AndroidVariantType +import org.jetbrains.kotlin.gradle.plugin.sources.android.type internal val naturalKotlinTargetHierarchy = KotlinTargetHierarchyDescriptor { /* natural hierarchy is only applied to default 'main'/'test' compilations (by default) */ - filterCompilations { compilation -> compilation.isMain() || compilation.isTest() } + filterCompilations { compilation -> + compilation.isMain() || compilation.isTest() || compilation.isAndroidMain() || compilation.isAndroidUnitTest() + } common { group("native") { @@ -51,3 +57,9 @@ internal val naturalKotlinTargetHierarchy = KotlinTargetHierarchyDescriptor { } } } + +private fun KotlinCompilation<*>.isAndroidMain(): Boolean = + this is KotlinJvmAndroidCompilation && this.androidVariant.type == AndroidVariantType.Main + +private fun KotlinCompilation<*>.isAndroidUnitTest(): Boolean = + this is KotlinJvmAndroidCompilation && this.androidVariant.type == AndroidVariantType.UnitTest diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDslTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDslTest.kt index 71a87e5da89..5543adcc401 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDslTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDslTest.kt @@ -192,6 +192,60 @@ class KotlinTargetHierarchyDslTest { } } + @Test + fun `test - hierarchy - jvm and android`() { + val project = buildProjectWithMPP { + setMultiplatformAndroidSourceSetLayoutVersion(2) + } + + val kotlin = project.multiplatformExtension + + assumeAndroidSdkAvailable() + project.androidLibrary { compileSdk = 31 } + + kotlin.targetHierarchy.default { + common { + group("jvmAndAndroid") { + anyJvm() + anyAndroid() + } + } + } + + kotlin.android() + kotlin.jvm() + + project.evaluate() + + assertEquals( + stringSetOf("androidDebug", "androidMain", "androidRelease", "jvmAndAndroidMain", "jvmMain"), + kotlin.dependingSourceSetNames("commonMain") + ) + + assertEquals( + stringSetOf("jvmMain", "androidMain", "androidDebug", "androidRelease"), + kotlin.dependingSourceSetNames("jvmAndAndroidMain") + ) + + assertEquals( + stringSetOf("jvmAndAndroidTest", "jvmTest", "androidUnitTest", "androidUnitTestDebug", "androidUnitTestRelease"), + kotlin.dependingSourceSetNames("commonTest") + ) + + assertEquals( + stringSetOf("jvmTest", "androidUnitTest", "androidUnitTest", "androidUnitTestDebug", "androidUnitTestRelease"), + kotlin.dependingSourceSetNames("jvmAndAndroidTest") + ) + + /* Check all source sets: All from jvm and android target + expected common source sets */ + assertEquals( + setOf("commonMain", "commonTest", "jvmAndAndroidMain", "jvmAndAndroidTest") + + kotlin.android().compilations.flatMap { it.kotlinSourceSets }.map { it.name } + + kotlin.jvm().compilations.flatMap { it.kotlinSourceSets }.map { it.name }, + kotlin.sourceSets.map { it.name }.toStringSet() + ) + } + @Test fun `test - hierarchy apply - extend`() { val descriptor = KotlinTargetHierarchyDescriptor {