[Gradle] KotlinTargetHierarchyBuilder: Support Android compilations

KT-55218
This commit is contained in:
Sebastian Sellmair
2022-12-01 15:39:18 +01:00
committed by Space Team
parent 8bea195d68
commit 7c70319308
4 changed files with 80 additions and 4 deletions
@@ -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)
}
}
@@ -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
@@ -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
@@ -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 {