diff --git a/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api b/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api index 75d228fc8cd..7c7af1cd099 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api +++ b/libraries/tools/kotlin-gradle-plugin-api/api/kotlin-gradle-plugin-api.api @@ -525,6 +525,17 @@ public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinNativeXCFr public abstract fun targets ([Lorg/jetbrains/kotlin/konan/target/KonanTarget;)V } +public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl { + public abstract fun apply (Lorg/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate;Lkotlin/jvm/functions/Function1;)V + public abstract fun custom (Lkotlin/jvm/functions/Function1;)V + public abstract fun default (Lkotlin/jvm/functions/Function1;)V +} + +public final class org/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl$DefaultImpls { + public static synthetic fun apply$default (Lorg/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl;Lorg/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V + public static synthetic fun default$default (Lorg/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V +} + public abstract interface class org/jetbrains/kotlin/gradle/dsl/KotlinTopLevelExtensionConfig { public abstract fun explicitApi ()V public abstract fun explicitApiWarning ()V diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl.kt new file mode 100644 index 00000000000..583d8b6e753 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinTargetHierarchyDsl.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.dsl + +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi +import org.jetbrains.kotlin.gradle.plugin.KotlinHierarchyBuilder +import org.jetbrains.kotlin.gradle.plugin.KotlinHierarchyTemplate + +@Deprecated("Use 'KotlinHierarchyTemplate' instead") +@ExperimentalKotlinGradlePluginApi +interface KotlinTargetHierarchyDsl { + fun apply(hierarchyDescriptor: KotlinHierarchyTemplate, describeExtension: (KotlinHierarchyBuilder.Root.() -> Unit)? = null) + fun default(describeExtension: (KotlinHierarchyBuilder.Root.() -> Unit)? = null) + fun custom(describe: KotlinHierarchyBuilder.Root.() -> Unit) +} diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate.kt b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate.kt index 5e99fefbf3f..4f42377f04a 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate.kt @@ -88,6 +88,15 @@ internal class KotlinHierarchyTemplateImpl( fun layout(builder: KotlinHierarchyBuilder.Root) { describe(builder) } + + override fun hashCode(): Int { + return describe.hashCode() + } + + override fun equals(other: Any?): Boolean { + if (other !is KotlinHierarchyTemplateImpl) return false + return this.describe == other.describe + } } /* diff --git a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api index 67fa45af110..890e7582b9e 100644 --- a/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api +++ b/libraries/tools/kotlin-gradle-plugin/api/kotlin-gradle-plugin.api @@ -30,6 +30,7 @@ public abstract class org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtensi public fun androidTarget (Ljava/lang/String;Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinAndroidTarget; public fun androidTarget (Lorg/gradle/api/Action;)Lorg/jetbrains/kotlin/gradle/plugin/mpp/KotlinAndroidTarget; public final fun applyDefaultHierarchyTemplate ()V + public final fun applyDefaultHierarchyTemplate (Lkotlin/jvm/functions/Function1;)V public fun applyHierarchyTemplate (Lkotlin/jvm/functions/Function1;)V public fun applyHierarchyTemplate (Lorg/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate;)V public fun applyHierarchyTemplate (Lorg/jetbrains/kotlin/gradle/plugin/KotlinHierarchyTemplate;Lkotlin/jvm/functions/Function1;)V @@ -61,6 +62,7 @@ public abstract class org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtensi public fun getNativeMain (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider; public fun getNativeTest (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider; public fun getPresets ()Lorg/gradle/api/NamedDomainObjectCollection; + public final fun getTargetHierarchy ()Lorg/jetbrains/kotlin/gradle/dsl/DeprecatedKotlinTargetHierarchyDsl; public final fun getTargets ()Lorg/gradle/api/NamedDomainObjectCollection; public final fun getTestableTargets ()Lorg/gradle/api/NamedDomainObjectCollection; public fun getTvosMain (Lorg/gradle/api/NamedDomainObjectContainer;)Lorg/gradle/api/NamedDomainObjectProvider; diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/DeprecatedKotlinTargetHierarchyDsl.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/DeprecatedKotlinTargetHierarchyDsl.kt new file mode 100644 index 00000000000..71ff45fc89b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/DeprecatedKotlinTargetHierarchyDsl.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("DEPRECATION") + +package org.jetbrains.kotlin.gradle.dsl + +import org.jetbrains.kotlin.gradle.plugin.KotlinHierarchyBuilder +import org.jetbrains.kotlin.gradle.plugin.KotlinHierarchyTemplate + +@Deprecated("Use 'KotlinHierarchyTemplate's instead.") +class DeprecatedKotlinTargetHierarchyDsl internal constructor( + private val extension: KotlinMultiplatformExtension, +) : KotlinTargetHierarchyDsl { + + @Deprecated("Replace with 'kotlin.applyHierarchyTemplate'") + override fun apply(hierarchyDescriptor: KotlinHierarchyTemplate, describeExtension: (KotlinHierarchyBuilder.Root.() -> Unit)?) { + if (describeExtension != null) extension.applyHierarchyTemplate(hierarchyDescriptor, describeExtension) + else extension.applyHierarchyTemplate(hierarchyDescriptor) + } + + @Deprecated("Replace with 'kotlin.applyDefaultHierarchyTemplate'") + override fun default(describeExtension: (KotlinHierarchyBuilder.Root.() -> Unit)?) { + if (describeExtension != null) extension.applyDefaultHierarchyTemplate(describeExtension) + else extension.applyDefaultHierarchyTemplate() + } + + @Deprecated("Replace with 'kotlin.applyHierarchyTemplate'") + override fun custom(describe: KotlinHierarchyBuilder.Root.() -> Unit) { + extension.applyHierarchyTemplate(describe) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt index ac920b2e952..85a220a63c5 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension.kt @@ -104,6 +104,16 @@ abstract class KotlinMultiplatformExtension */ fun applyDefaultHierarchyTemplate() = applyHierarchyTemplate(KotlinHierarchyTemplate.default) + /** + * @see applyDefaultHierarchyTemplate + * @see applyHierarchyTemplate + * @param extension: Additionally extend the default hierarchy with additional groups + * + */ + @ExperimentalKotlinGradlePluginApi + fun applyDefaultHierarchyTemplate(extension: KotlinHierarchyBuilder.Root.() -> Unit) { + hierarchy.applyHierarchyTemplate(KotlinHierarchyTemplate.default, extension) + } @ExperimentalKotlinGradlePluginApi override fun applyHierarchyTemplate(template: KotlinHierarchyTemplate) { @@ -120,6 +130,9 @@ abstract class KotlinMultiplatformExtension hierarchy.applyHierarchyTemplate(template) } + @ExperimentalKotlinGradlePluginApi + val targetHierarchy: DeprecatedKotlinTargetHierarchyDsl get() = DeprecatedKotlinTargetHierarchyDsl(this) + @Suppress("unused") // DSL val testableTargets: NamedDomainObjectCollection> get() = targets.withType(KotlinTargetWithTests::class.java) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DeprecatedKotlinTargetHierarchyDslTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DeprecatedKotlinTargetHierarchyDslTest.kt new file mode 100644 index 00000000000..ed8aecc90e6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/DeprecatedKotlinTargetHierarchyDslTest.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +@file:Suppress("FunctionName", "DEPRECATION") + +package org.jetbrains.kotlin.gradle.unitTests + +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinHierarchyBuilder +import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.fail + +/** + * Test will check that the deprecated 'KotlinTargetHierarchyDsl' will act exactly the same as the new + * 'KotlinHierarchyDsl' + */ +class DeprecatedKotlinTargetHierarchyDslTest { + + val legacyProject = buildProjectWithMPP() + val project = buildProjectWithMPP() + + @Test + fun `test - default`() { + legacyProject.multiplatformExtension.targetHierarchy.default() + project.multiplatformExtension.applyDefaultHierarchyTemplate() + + assertEquals( + project.multiplatformExtension.hierarchy.appliedTemplates, + legacyProject.multiplatformExtension.hierarchy.appliedTemplates + ) + } + + @Test + fun `test - default with extension`() { + val extension: KotlinHierarchyBuilder.Root.() -> Unit = { + common { + group("nix") { + withLinux() + withMacos() + } + } + } + legacyProject.multiplatformExtension.targetHierarchy.default(extension) + project.multiplatformExtension.applyDefaultHierarchyTemplate(extension) + + listOf(legacyProject, project).forEach { project -> + project.multiplatformExtension.jvm() + project.multiplatformExtension.linuxX64() + project.multiplatformExtension.macosX64() + project.evaluate() + + if ("nativeMain" !in project.multiplatformExtension.sourceSets.names) + fail("Expected 'nativeMain' in source sets") + + if ("nixMain" !in project.multiplatformExtension.sourceSets.names) { + fail("Expected 'nixMain' in source sets") + } + } + } + + @Test + fun `test - custom`() { + val description: KotlinHierarchyBuilder.Root.() -> Unit = { /* Does not matter */ } + legacyProject.multiplatformExtension.targetHierarchy.custom(description) + project.multiplatformExtension.applyHierarchyTemplate(description) + + assertEquals( + project.multiplatformExtension.hierarchy.appliedTemplates, + legacyProject.multiplatformExtension.hierarchy.appliedTemplates + ) + } +}