diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt index 606755c4a6d..ec48a097042 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-gradle-plugin-api.txt @@ -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 diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder.kt index 43f5f3fbc64..7f4a7c449a9 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinTargetHierarchyBuilder.kt @@ -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() 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 931bf5731ac..5dfb88c17e2 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 @@ -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 = emptySet() ) { + val childrenClosure: Set = + children.withClosure { it.children } + sealed class Node { abstract fun sharedSourceSetName(compilation: KotlinCompilation<*>): String? 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 29af1b67d24..e15bb34aa38 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 @@ -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) -} \ No newline at end of file +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/buildKotlinTargetHierarchy.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/buildKotlinTargetHierarchy.kt index 7d4ed0847db..bd721fd4608 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/buildKotlinTargetHierarchy.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/targetHierarchy/buildKotlinTargetHierarchy.kt @@ -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() - private val builtValues = hashMapOf() + private val builtValues = hashMapOf() 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() 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)" } 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 ac887f60105..dbf5b8ed268 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 @@ -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() diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDescriptorTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDescriptorTest.kt index 6ad97a48fcb..3c5aca901f5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDescriptorTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/KotlinTargetHierarchyDescriptorTest.kt @@ -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() -} \ No newline at end of file +} 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 4531291cb51..b46dacd98ef 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 @@ -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()