[Gradle][MPP] KotlinTargetHierarchyBuilderImpl: only build child groups if explicitly included

^KT-53570 Verification Pending
This commit is contained in:
Sebastian Sellmair
2022-10-06 21:27:19 +02:00
committed by Space Team
parent 487368d9df
commit 1823e0fad4
8 changed files with 257 additions and 206 deletions
@@ -1029,31 +1029,60 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinTargetE
}
public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder {
public abstract fun android ()V
public abstract fun androidNativeArm32 ()V
public abstract fun androidNativeArm64 ()V
public abstract fun androidNativeX64 ()V
public abstract fun androidNativeX86 ()V
public abstract fun anyAndroidNative ()V
public abstract fun anyApple ()V
public abstract fun anyIos ()V
public abstract fun anyJs ()V
public abstract fun anyLinux ()V
public abstract fun anyMacos ()V
public abstract fun anyMingw ()V
public abstract fun anyNative ()V
public abstract fun anyTvos ()V
public abstract fun anyWatchos ()V
public abstract fun common (Lkotlin/jvm/functions/Function1;)V
public abstract fun getCompilation ()Lorg/jetbrains/kotlin/gradle/plugin/KotlinCompilation;
public abstract fun getTarget ()Lorg/jetbrains/kotlin/gradle/plugin/KotlinTarget;
public abstract fun excludeCompilationIf (Lkotlin/jvm/functions/Function1;)V
public abstract fun filterCompilations (Lkotlin/jvm/functions/Function1;)V
public abstract fun group (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V
public abstract fun isAndroidJvm ()Z
public abstract fun isAndroidNative ()Z
public abstract fun isApple ()Z
public abstract fun isIos ()Z
public abstract fun isJs ()Z
public abstract fun isJsLegacy ()Z
public abstract fun isJvm ()Z
public abstract fun isLinux ()Z
public abstract fun isMacos ()Z
public abstract fun isNative ()Z
public abstract fun isTvos ()Z
public abstract fun isWatchos ()Z
public abstract fun isWindows ()Z
public abstract fun includeCompilationIf (Lkotlin/jvm/functions/Function1;)V
public abstract fun iosArm32 ()V
public abstract fun iosArm64 ()V
public abstract fun iosSimulatorArm64 ()V
public abstract fun iosX64 ()V
public abstract fun jvm ()V
public abstract fun linuxArm32Hfp ()V
public abstract fun linuxArm64 ()V
public abstract fun linuxMips32 ()V
public abstract fun linuxMipsel32 ()V
public abstract fun linuxX64 ()V
public abstract fun macosArm64 ()V
public abstract fun macosX64 ()V
public abstract fun mingwX64 ()V
public abstract fun mingwX86 ()V
public abstract fun tvosArm64 ()V
public abstract fun tvosSimulatorArm64 ()V
public abstract fun tvosX64 ()V
public abstract fun wasm32 ()V
public abstract fun watchosArm32 ()V
public abstract fun watchosArm64 ()V
public abstract fun watchosDeviceArm64 ()V
public abstract fun watchosSimulatorArm64 ()V
public abstract fun watchosX64 ()V
public abstract fun watchosX86 ()V
}
public final class org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder$DefaultImpls {
public static fun common (Lorg/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder;Lkotlin/jvm/functions/Function1;)V
public static fun filterCompilations (Lorg/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder;Lkotlin/jvm/functions/Function1;)V
public static synthetic fun group$default (Lorg/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V
}
public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyDescriptor : kotlin/jvm/functions/Function1 {
public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyDescriptor {
public abstract fun describe (Lorg/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder;)V
public abstract fun extend (Lkotlin/jvm/functions/Function1;)Lorg/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyDescriptor;
}
@@ -1094,6 +1123,9 @@ public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinTargets
public abstract fun getPresets ()Lorg/gradle/api/NamedDomainObjectCollection;
}
public abstract interface annotation class org/jetbrains/kotlin/gradle/plugin/KotlinTargetsDsl : java/lang/annotation/Annotation {
}
public abstract interface class org/jetbrains/kotlin/gradle/plugin/KotlinTestRun : org/jetbrains/kotlin/gradle/plugin/KotlinExecution {
public abstract fun filter (Lgroovy/lang/Closure;)V
public abstract fun filter (Lkotlin/jvm/functions/Function1;)V
@@ -11,8 +11,11 @@ interface KotlinTargetHierarchyBuilder {
fun group(name: String, build: KotlinTargetHierarchyBuilder.() -> Unit = {})
/* low-level APIs */
fun includeCompilation(predicate: (KotlinCompilation<*>) -> Boolean)
fun excludeCompilation(predicate: (KotlinCompilation<*>) -> Boolean)
fun includeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean)
fun excludeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean)
fun filterCompilations(predicate: (KotlinCompilation<*>) -> Boolean) =
excludeCompilationIf { !predicate(it) }
/* Convenient groups */
fun anyNative()
@@ -7,11 +7,15 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.tooling.core.withClosure
internal data class KotlinTargetHierarchy(
val node: Node, val children: Set<KotlinTargetHierarchy> = emptySet()
) {
val childrenClosure: Set<KotlinTargetHierarchy> =
children.withClosure<KotlinTargetHierarchy> { it.children }
sealed class Node {
abstract fun sharedSourceSetName(compilation: KotlinCompilation<*>): String?
@@ -17,8 +17,8 @@ internal fun applyKotlinTargetHierarchy(
targets
.matching { target -> target.platformType != KotlinPlatformType.common }
.all { target ->
target.compilations.all { compilation ->
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation)
target.compilations.all forCompilation@{ compilation ->
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@forCompilation
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
}
}
@@ -52,4 +52,4 @@ private fun createSharedSourceSetOrNull(
): KotlinSourceSet? {
val sharedSourceSetName = node.sharedSourceSetName(compilation) ?: return null
return sourceSets.maybeCreate(sharedSourceSetName)
}
}
@@ -18,8 +18,7 @@ import org.jetbrains.kotlin.konan.target.Family
import org.jetbrains.kotlin.konan.target.KonanTarget
import org.jetbrains.kotlin.tooling.core.closure
internal fun KotlinTargetHierarchyDescriptor.buildKotlinTargetHierarchy(compilation: KotlinCompilation<*>): KotlinTargetHierarchy {
internal fun KotlinTargetHierarchyDescriptor.buildKotlinTargetHierarchy(compilation: KotlinCompilation<*>): KotlinTargetHierarchy? {
val context = KotlinTargetHierarchyBuilderImplContext(compilation)
describe(context.getOrCreateBuilder(KotlinTargetHierarchy.Node.Root))
return context.build(KotlinTargetHierarchy.Node.Root)
@@ -27,15 +26,16 @@ internal fun KotlinTargetHierarchyDescriptor.buildKotlinTargetHierarchy(compilat
private class KotlinTargetHierarchyBuilderImplContext(private val compilation: KotlinCompilation<*>) {
private val builders = hashMapOf<KotlinTargetHierarchy.Node, KotlinTargetHierarchyBuilderImpl>()
private val builtValues = hashMapOf<KotlinTargetHierarchy.Node, KotlinTargetHierarchy>()
private val builtValues = hashMapOf<KotlinTargetHierarchy.Node, KotlinTargetHierarchy?>()
fun getOrCreateBuilder(node: KotlinTargetHierarchy.Node): KotlinTargetHierarchyBuilderImpl = builders.getOrPut(node) {
KotlinTargetHierarchyBuilderImpl(this, node)
}
fun build(node: KotlinTargetHierarchy.Node): KotlinTargetHierarchy {
fun build(node: KotlinTargetHierarchy.Node): KotlinTargetHierarchy? {
return builtValues.getOrPut(node) {
val builder = getOrCreateBuilder(node)
if (!builder.includes(compilation)) return@getOrPut null
/*
Keep the hierarchy 'deduplicated'.
@@ -45,22 +45,12 @@ private class KotlinTargetHierarchyBuilderImplContext(private val compilation: K
1) a -> b -> c
2) b -> c
then we can remove the duplicated 'sub hierarchy' 2) and only return
a -> b -> c
*/
val childrenNodes = builder.children.map { it.node } -
builder.children.flatMap { child -> child.childrenClosure }.map { it.node }.toSet()
/*
Respect include & exclude predicates!
*/
val applicableChildrenNodes = childrenNodes.filter { node ->
val childrenBuilder = getOrCreateBuilder(node)
childrenBuilder.predicate?.invoke(compilation) ?: true
}
KotlinTargetHierarchy(node, applicableChildrenNodes.map(this::build).toSet())
then we can remove the duplicated 'sub hierarchy' 2) and only return 1) a -> b -> c
(Remove children that are also reachable by more specific paths)
*/
val children = builder.children.mapNotNull { child -> build(child.node) }
val directChildren = children.toSet() - children.flatMap { child -> child.childrenClosure }.toSet()
KotlinTargetHierarchy(node, directChildren)
}
}
}
@@ -73,169 +63,175 @@ private class KotlinTargetHierarchyBuilderImpl(
val children = mutableSetOf<KotlinTargetHierarchyBuilderImpl>()
val childrenClosure get() = closure { it.children }
var predicate: ((KotlinCompilation<*>) -> Boolean)? = null
private var includePredicate: ((KotlinCompilation<*>) -> Boolean) = { false }
private var excludePredicate: ((KotlinCompilation<*>) -> Boolean) = { false }
override fun includeCompilation(predicate: (KotlinCompilation<*>) -> Boolean) {
val previousPredicate = this.predicate
if (previousPredicate == null) {
this.predicate = predicate
return
}
this.predicate = { previousPredicate(it) || predicate(it) }
override fun includeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean) {
val previousIncludePredicate = this.includePredicate
val previousExcludePredicate = this.excludePredicate
this.includePredicate = { previousIncludePredicate(it) || predicate(it) }
this.excludePredicate = { previousExcludePredicate(it) && !predicate(it) }
}
override fun excludeCompilation(predicate: (KotlinCompilation<*>) -> Boolean) {
val previousPredicate = this.predicate
if (previousPredicate == null) {
this.predicate = { !predicate(it) }
return
}
this.predicate = { previousPredicate(it) && !predicate(it) }
override fun excludeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean) {
val previousIncludePredicate = this.includePredicate
val previousExcludePredicate = this.excludePredicate
this.includePredicate = { previousIncludePredicate(it) && !predicate(it) }
this.excludePredicate = { previousExcludePredicate(it) || predicate(it) }
}
private inline fun includeTarget(crossinline predicate: (KotlinTarget) -> Boolean) = includeCompilation { predicate(it.target) }
fun includes(compilation: KotlinCompilation<*>): Boolean {
/* Return eagerly, when compilation is explicitly excluded */
if (excludePredicate(compilation)) return false
override fun anyNative() = includeTarget { it is KotlinNativeTarget }
/* Return eagerly, when compilation is explicitly included */
if (includePredicate(compilation)) return true
override fun anyApple() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family.isAppleFamily }
override fun anyIos() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.IOS }
override fun anyWatchos() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.WATCHOS }
override fun anyMacos() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.OSX }
override fun anyTvos() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.TVOS }
override fun anyMingw() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.MINGW }
override fun anyLinux() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.LINUX }
override fun anyAndroidNative() = includeTarget { it is KotlinNativeTarget && it.konanTarget.family == Family.ANDROID }
override fun anyJs() = includeTarget { it is KotlinJsTargetDsl }
override fun jvm() = includeTarget { it is KotlinJvmTarget }
override fun android() = includeTarget { it is KotlinAndroidTarget }
override fun androidNativeX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_X64
/* Find any child that includes this compilation */
return childrenClosure.any { child -> child.includes(compilation) }
}
override fun androidNativeX86() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_X86
}
override fun androidNativeArm32() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_X86
}
override fun androidNativeArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_ARM64
}
override fun iosArm32() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_ARM32
}
override fun iosArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_ARM64
}
override fun iosX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_X64
}
override fun iosSimulatorArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_SIMULATOR_ARM64
}
override fun watchosArm32() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_ARM32
}
override fun watchosArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_ARM64
}
override fun watchosX86() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_X86
}
override fun watchosX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_X64
}
override fun watchosSimulatorArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_SIMULATOR_ARM64
}
override fun watchosDeviceArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_DEVICE_ARM64
}
override fun tvosArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.TVOS_ARM64
}
override fun tvosX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.TVOS_X64
}
override fun tvosSimulatorArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.TVOS_SIMULATOR_ARM64
}
override fun linuxX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_X64
}
override fun mingwX86() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MINGW_X86
}
override fun mingwX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MINGW_X64
}
override fun macosX64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MACOS_X64
}
override fun macosArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MACOS_ARM64
}
override fun linuxArm64() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_ARM64
}
override fun linuxArm32Hfp() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_ARM32_HFP
}
override fun linuxMips32() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_MIPS32
}
override fun linuxMipsel32() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_MIPSEL32
}
override fun wasm32() = includeTarget {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WASM32
}
private inline fun includeTargetIf(crossinline predicate: (KotlinTarget) -> Boolean) = includeCompilationIf { predicate(it.target) }
override fun group(name: String, build: KotlinTargetHierarchyBuilder.() -> Unit) {
val node = KotlinTargetHierarchy.Node.Group(name)
val child = context.getOrCreateBuilder(node)
val child = context.getOrCreateBuilder(node).also(build)
children.add(child)
child.build()
checkCyclicHierarchy()
}
override fun anyNative() = includeTargetIf { it is KotlinNativeTarget }
override fun anyApple() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family.isAppleFamily }
override fun anyIos() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.IOS }
override fun anyWatchos() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.WATCHOS }
override fun anyMacos() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.OSX }
override fun anyTvos() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.TVOS }
override fun anyMingw() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.MINGW }
override fun anyLinux() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.LINUX }
override fun anyAndroidNative() = includeTargetIf { it is KotlinNativeTarget && it.konanTarget.family == Family.ANDROID }
override fun anyJs() = includeTargetIf { it is KotlinJsTargetDsl }
override fun jvm() = includeTargetIf { it is KotlinJvmTarget }
override fun android() = includeTargetIf { it is KotlinAndroidTarget }
override fun androidNativeX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_X64
}
override fun androidNativeX86() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_X86
}
override fun androidNativeArm32() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_X86
}
override fun androidNativeArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.ANDROID_ARM64
}
override fun iosArm32() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_ARM32
}
override fun iosArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_ARM64
}
override fun iosX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_X64
}
override fun iosSimulatorArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.IOS_SIMULATOR_ARM64
}
override fun watchosArm32() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_ARM32
}
override fun watchosArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_ARM64
}
override fun watchosX86() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_X86
}
override fun watchosX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_X64
}
override fun watchosSimulatorArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_SIMULATOR_ARM64
}
override fun watchosDeviceArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WATCHOS_DEVICE_ARM64
}
override fun tvosArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.TVOS_ARM64
}
override fun tvosX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.TVOS_X64
}
override fun tvosSimulatorArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.TVOS_SIMULATOR_ARM64
}
override fun linuxX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_X64
}
override fun mingwX86() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MINGW_X86
}
override fun mingwX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MINGW_X64
}
override fun macosX64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MACOS_X64
}
override fun macosArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.MACOS_ARM64
}
override fun linuxArm64() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_ARM64
}
override fun linuxArm32Hfp() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_ARM32_HFP
}
override fun linuxMips32() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_MIPS32
}
override fun linuxMipsel32() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.LINUX_MIPSEL32
}
override fun wasm32() = includeTargetIf {
it is KotlinNativeTarget && it.konanTarget == KonanTarget.WASM32
}
override fun toString(): String {
return "KotlinTargetHierarchyBuilder($node)"
}
@@ -10,11 +10,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.plugin.mpp.isTest
internal val naturalKotlinTargetHierarchy = KotlinTargetHierarchyDescriptor {
/* natural hierarchy is only applied to default 'main'/'test' compilations (by default) */
filterCompilations { compilation -> compilation.isMain() || compilation.isTest() }
common {
group("native") {
anyNative()
/* natural hierarchy is only defined for main and test default compilations, by default */
excludeCompilation { compilation -> !(compilation.isMain() || compilation.isTest()) }
group("apple") {
anyApple()
@@ -14,9 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.KotlinTargetHierar
import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.KotlinTargetHierarchy.Node
import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.buildKotlinTargetHierarchy
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertFailsWith
import kotlin.test.assertSame
import kotlin.test.*
class KotlinTargetHierarchyDescriptorTest {
@@ -27,8 +25,8 @@ class KotlinTargetHierarchyDescriptorTest {
fun `test - simple descriptor`() {
val descriptor = KotlinTargetHierarchyDescriptor {
common {
group("groupA") { includeCompilation { it.target.name == "a" } }
group("groupB") { includeCompilation { it.target.name == "b" } }
group("groupA") { includeCompilationIf { it.target.name == "a" } }
group("groupB") { includeCompilationIf { it.target.name == "b" } }
}
}
@@ -54,8 +52,8 @@ class KotlinTargetHierarchyDescriptorTest {
descriptor.buildKotlinTargetHierarchy(targetB.compilations.main)
)
assertEquals(
hierarchy { group("common") },
/* targetC is not mentioned in hierarchy description */
assertNull(
descriptor.buildKotlinTargetHierarchy(targetC.compilations.main)
)
}
@@ -64,7 +62,9 @@ class KotlinTargetHierarchyDescriptorTest {
fun `test - extend`() {
val descriptor = KotlinTargetHierarchyDescriptor { group("base") }.extend {
group("base") {
group("extension")
group("extension") {
includeCompilationIf { true }
}
}
}
@@ -84,7 +84,9 @@ class KotlinTargetHierarchyDescriptorTest {
val descriptor = KotlinTargetHierarchyDescriptor { group("base") }.extend {
group("newRoot") {
group("base") {
group("extension")
group("extension") {
includeCompilationIf { true }
}
}
}
}
@@ -108,19 +110,23 @@ class KotlinTargetHierarchyDescriptorTest {
.extend {
group("newRoot1") {
group("base") {
group("extension1")
group("extension1") {
includeCompilationIf { true }
}
}
}
}
.extend {
group("newRoot2") {
group("base") {
group("extension2")
group("extension2") {
includeCompilationIf { true }
}
}
}
}
val hierarchy = descriptor.buildKotlinTargetHierarchy(kotlin.linuxX64().compilations.main)
val hierarchy = assertNotNull(descriptor.buildKotlinTargetHierarchy(kotlin.linuxX64().compilations.main))
assertEquals(
hierarchy {
@@ -197,4 +203,4 @@ private class TestHierarchyBuilder(private val node: Node) {
private fun hierarchy(build: TestHierarchyBuilder.() -> Unit): KotlinTargetHierarchy {
return TestHierarchyBuilder(Node.Root).also(build).build()
}
}
@@ -186,7 +186,13 @@ class KotlinTargetHierarchyDslTest {
}
kotlin.apply {
targetHierarchy.apply(descriptor) { group("base") { group("extension") } }
targetHierarchy.apply(descriptor) {
group("base") {
group("extension") {
linuxX64()
}
}
}
linuxX64()
}
@@ -207,7 +213,6 @@ class KotlinTargetHierarchyDslTest {
)
}
@Test
fun `test - hierarchy set - extend - with new root`() {
val descriptor = KotlinTargetHierarchyDescriptor {
@@ -219,7 +224,11 @@ class KotlinTargetHierarchyDslTest {
kotlin.apply {
targetHierarchy.apply(descriptor) {
group("newRoot") {
group("base") { group("extension") }
group("base") {
group("extension") {
linuxX64()
}
}
}
}
linuxX64()