[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 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 common (Lkotlin/jvm/functions/Function1;)V
public abstract fun getCompilation ()Lorg/jetbrains/kotlin/gradle/plugin/KotlinCompilation; public abstract fun excludeCompilationIf (Lkotlin/jvm/functions/Function1;)V
public abstract fun getTarget ()Lorg/jetbrains/kotlin/gradle/plugin/KotlinTarget; public abstract fun filterCompilations (Lkotlin/jvm/functions/Function1;)V
public abstract fun group (Ljava/lang/String;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 includeCompilationIf (Lkotlin/jvm/functions/Function1;)V
public abstract fun isAndroidNative ()Z public abstract fun iosArm32 ()V
public abstract fun isApple ()Z public abstract fun iosArm64 ()V
public abstract fun isIos ()Z public abstract fun iosSimulatorArm64 ()V
public abstract fun isJs ()Z public abstract fun iosX64 ()V
public abstract fun isJsLegacy ()Z public abstract fun jvm ()V
public abstract fun isJvm ()Z public abstract fun linuxArm32Hfp ()V
public abstract fun isLinux ()Z public abstract fun linuxArm64 ()V
public abstract fun isMacos ()Z public abstract fun linuxMips32 ()V
public abstract fun isNative ()Z public abstract fun linuxMipsel32 ()V
public abstract fun isTvos ()Z public abstract fun linuxX64 ()V
public abstract fun isWatchos ()Z public abstract fun macosArm64 ()V
public abstract fun isWindows ()Z 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 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 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 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; 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 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 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 (Lgroovy/lang/Closure;)V
public abstract fun filter (Lkotlin/jvm/functions/Function1;)V public abstract fun filter (Lkotlin/jvm/functions/Function1;)V
@@ -11,8 +11,11 @@ interface KotlinTargetHierarchyBuilder {
fun group(name: String, build: KotlinTargetHierarchyBuilder.() -> Unit = {}) fun group(name: String, build: KotlinTargetHierarchyBuilder.() -> Unit = {})
/* low-level APIs */ /* low-level APIs */
fun includeCompilation(predicate: (KotlinCompilation<*>) -> Boolean) fun includeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean)
fun excludeCompilation(predicate: (KotlinCompilation<*>) -> Boolean) fun excludeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean)
fun filterCompilations(predicate: (KotlinCompilation<*>) -> Boolean) =
excludeCompilationIf { !predicate(it) }
/* Convenient groups */ /* Convenient groups */
fun anyNative() 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.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.tooling.core.withClosure
internal data class KotlinTargetHierarchy( internal data class KotlinTargetHierarchy(
val node: Node, val children: Set<KotlinTargetHierarchy> = emptySet() val node: Node, val children: Set<KotlinTargetHierarchy> = emptySet()
) { ) {
val childrenClosure: Set<KotlinTargetHierarchy> =
children.withClosure<KotlinTargetHierarchy> { it.children }
sealed class Node { sealed class Node {
abstract fun sharedSourceSetName(compilation: KotlinCompilation<*>): String? abstract fun sharedSourceSetName(compilation: KotlinCompilation<*>): String?
@@ -17,8 +17,8 @@ internal fun applyKotlinTargetHierarchy(
targets targets
.matching { target -> target.platformType != KotlinPlatformType.common } .matching { target -> target.platformType != KotlinPlatformType.common }
.all { target -> .all { target ->
target.compilations.all { compilation -> target.compilations.all forCompilation@{ compilation ->
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@forCompilation
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets) applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
} }
} }
@@ -52,4 +52,4 @@ private fun createSharedSourceSetOrNull(
): KotlinSourceSet? { ): KotlinSourceSet? {
val sharedSourceSetName = node.sharedSourceSetName(compilation) ?: return null val sharedSourceSetName = node.sharedSourceSetName(compilation) ?: return null
return sourceSets.maybeCreate(sharedSourceSetName) 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.konan.target.KonanTarget
import org.jetbrains.kotlin.tooling.core.closure 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) val context = KotlinTargetHierarchyBuilderImplContext(compilation)
describe(context.getOrCreateBuilder(KotlinTargetHierarchy.Node.Root)) describe(context.getOrCreateBuilder(KotlinTargetHierarchy.Node.Root))
return context.build(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 class KotlinTargetHierarchyBuilderImplContext(private val compilation: KotlinCompilation<*>) {
private val builders = hashMapOf<KotlinTargetHierarchy.Node, KotlinTargetHierarchyBuilderImpl>() 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) { fun getOrCreateBuilder(node: KotlinTargetHierarchy.Node): KotlinTargetHierarchyBuilderImpl = builders.getOrPut(node) {
KotlinTargetHierarchyBuilderImpl(this, node) KotlinTargetHierarchyBuilderImpl(this, node)
} }
fun build(node: KotlinTargetHierarchy.Node): KotlinTargetHierarchy { fun build(node: KotlinTargetHierarchy.Node): KotlinTargetHierarchy? {
return builtValues.getOrPut(node) { return builtValues.getOrPut(node) {
val builder = getOrCreateBuilder(node) val builder = getOrCreateBuilder(node)
if (!builder.includes(compilation)) return@getOrPut null
/* /*
Keep the hierarchy 'deduplicated'. Keep the hierarchy 'deduplicated'.
@@ -45,22 +45,12 @@ private class KotlinTargetHierarchyBuilderImplContext(private val compilation: K
1) a -> b -> c 1) a -> b -> c
2) b -> c 2) b -> c
then we can remove the duplicated 'sub hierarchy' 2) and only return then we can remove the duplicated 'sub hierarchy' 2) and only return 1) a -> b -> c
a -> b -> c (Remove children that are also reachable by more specific paths)
*/
*/ val children = builder.children.mapNotNull { child -> build(child.node) }
val childrenNodes = builder.children.map { it.node } - val directChildren = children.toSet() - children.flatMap { child -> child.childrenClosure }.toSet()
builder.children.flatMap { child -> child.childrenClosure }.map { it.node }.toSet() KotlinTargetHierarchy(node, directChildren)
/*
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())
} }
} }
} }
@@ -73,169 +63,175 @@ private class KotlinTargetHierarchyBuilderImpl(
val children = mutableSetOf<KotlinTargetHierarchyBuilderImpl>() val children = mutableSetOf<KotlinTargetHierarchyBuilderImpl>()
val childrenClosure get() = closure { it.children } 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) { override fun includeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean) {
val previousPredicate = this.predicate val previousIncludePredicate = this.includePredicate
if (previousPredicate == null) { val previousExcludePredicate = this.excludePredicate
this.predicate = predicate this.includePredicate = { previousIncludePredicate(it) || predicate(it) }
return this.excludePredicate = { previousExcludePredicate(it) && !predicate(it) }
}
this.predicate = { previousPredicate(it) || predicate(it) }
} }
override fun excludeCompilation(predicate: (KotlinCompilation<*>) -> Boolean) { override fun excludeCompilationIf(predicate: (KotlinCompilation<*>) -> Boolean) {
val previousPredicate = this.predicate val previousIncludePredicate = this.includePredicate
if (previousPredicate == null) { val previousExcludePredicate = this.excludePredicate
this.predicate = { !predicate(it) } this.includePredicate = { previousIncludePredicate(it) && !predicate(it) }
return this.excludePredicate = { previousExcludePredicate(it) || predicate(it) }
}
this.predicate = { previousPredicate(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 } /* Find any child that includes this compilation */
return childrenClosure.any { child -> child.includes(compilation) }
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
} }
override fun androidNativeX86() = includeTarget { private inline fun includeTargetIf(crossinline predicate: (KotlinTarget) -> Boolean) = includeCompilationIf { predicate(it.target) }
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
}
override fun group(name: String, build: KotlinTargetHierarchyBuilder.() -> Unit) { override fun group(name: String, build: KotlinTargetHierarchyBuilder.() -> Unit) {
val node = KotlinTargetHierarchy.Node.Group(name) val node = KotlinTargetHierarchy.Node.Group(name)
val child = context.getOrCreateBuilder(node) val child = context.getOrCreateBuilder(node).also(build)
children.add(child) children.add(child)
child.build()
checkCyclicHierarchy() 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 { override fun toString(): String {
return "KotlinTargetHierarchyBuilder($node)" return "KotlinTargetHierarchyBuilder($node)"
} }
@@ -10,11 +10,12 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.isMain
import org.jetbrains.kotlin.gradle.plugin.mpp.isTest import org.jetbrains.kotlin.gradle.plugin.mpp.isTest
internal val naturalKotlinTargetHierarchy = KotlinTargetHierarchyDescriptor { internal val naturalKotlinTargetHierarchy = KotlinTargetHierarchyDescriptor {
/* natural hierarchy is only applied to default 'main'/'test' compilations (by default) */
filterCompilations { compilation -> compilation.isMain() || compilation.isTest() }
common { common {
group("native") { group("native") {
anyNative() anyNative()
/* natural hierarchy is only defined for main and test default compilations, by default */
excludeCompilation { compilation -> !(compilation.isMain() || compilation.isTest()) }
group("apple") { group("apple") {
anyApple() 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.KotlinTargetHierarchy.Node
import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.buildKotlinTargetHierarchy import org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy.buildKotlinTargetHierarchy
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.*
import kotlin.test.assertFailsWith
import kotlin.test.assertSame
class KotlinTargetHierarchyDescriptorTest { class KotlinTargetHierarchyDescriptorTest {
@@ -27,8 +25,8 @@ class KotlinTargetHierarchyDescriptorTest {
fun `test - simple descriptor`() { fun `test - simple descriptor`() {
val descriptor = KotlinTargetHierarchyDescriptor { val descriptor = KotlinTargetHierarchyDescriptor {
common { common {
group("groupA") { includeCompilation { it.target.name == "a" } } group("groupA") { includeCompilationIf { it.target.name == "a" } }
group("groupB") { includeCompilation { it.target.name == "b" } } group("groupB") { includeCompilationIf { it.target.name == "b" } }
} }
} }
@@ -54,8 +52,8 @@ class KotlinTargetHierarchyDescriptorTest {
descriptor.buildKotlinTargetHierarchy(targetB.compilations.main) descriptor.buildKotlinTargetHierarchy(targetB.compilations.main)
) )
assertEquals( /* targetC is not mentioned in hierarchy description */
hierarchy { group("common") }, assertNull(
descriptor.buildKotlinTargetHierarchy(targetC.compilations.main) descriptor.buildKotlinTargetHierarchy(targetC.compilations.main)
) )
} }
@@ -64,7 +62,9 @@ class KotlinTargetHierarchyDescriptorTest {
fun `test - extend`() { fun `test - extend`() {
val descriptor = KotlinTargetHierarchyDescriptor { group("base") }.extend { val descriptor = KotlinTargetHierarchyDescriptor { group("base") }.extend {
group("base") { group("base") {
group("extension") group("extension") {
includeCompilationIf { true }
}
} }
} }
@@ -84,7 +84,9 @@ class KotlinTargetHierarchyDescriptorTest {
val descriptor = KotlinTargetHierarchyDescriptor { group("base") }.extend { val descriptor = KotlinTargetHierarchyDescriptor { group("base") }.extend {
group("newRoot") { group("newRoot") {
group("base") { group("base") {
group("extension") group("extension") {
includeCompilationIf { true }
}
} }
} }
} }
@@ -108,19 +110,23 @@ class KotlinTargetHierarchyDescriptorTest {
.extend { .extend {
group("newRoot1") { group("newRoot1") {
group("base") { group("base") {
group("extension1") group("extension1") {
includeCompilationIf { true }
}
} }
} }
} }
.extend { .extend {
group("newRoot2") { group("newRoot2") {
group("base") { 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( assertEquals(
hierarchy { hierarchy {
@@ -197,4 +203,4 @@ private class TestHierarchyBuilder(private val node: Node) {
private fun hierarchy(build: TestHierarchyBuilder.() -> Unit): KotlinTargetHierarchy { private fun hierarchy(build: TestHierarchyBuilder.() -> Unit): KotlinTargetHierarchy {
return TestHierarchyBuilder(Node.Root).also(build).build() return TestHierarchyBuilder(Node.Root).also(build).build()
} }
@@ -186,7 +186,13 @@ class KotlinTargetHierarchyDslTest {
} }
kotlin.apply { kotlin.apply {
targetHierarchy.apply(descriptor) { group("base") { group("extension") } } targetHierarchy.apply(descriptor) {
group("base") {
group("extension") {
linuxX64()
}
}
}
linuxX64() linuxX64()
} }
@@ -207,7 +213,6 @@ class KotlinTargetHierarchyDslTest {
) )
} }
@Test @Test
fun `test - hierarchy set - extend - with new root`() { fun `test - hierarchy set - extend - with new root`() {
val descriptor = KotlinTargetHierarchyDescriptor { val descriptor = KotlinTargetHierarchyDescriptor {
@@ -219,7 +224,11 @@ class KotlinTargetHierarchyDslTest {
kotlin.apply { kotlin.apply {
targetHierarchy.apply(descriptor) { targetHierarchy.apply(descriptor) {
group("newRoot") { group("newRoot") {
group("base") { group("extension") } group("base") {
group("extension") {
linuxX64()
}
}
} }
} }
linuxX64() linuxX64()