[Gradle] Implement Android DSL for choosing KotlinTargetHierarchy.ModuleName

KT-34662
This commit is contained in:
Sebastian Sellmair
2023-03-09 12:59:13 +01:00
committed by Space Team
parent 78751dcb55
commit 098cfae957
5 changed files with 83 additions and 51 deletions
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy
import org.gradle.api.DomainObjectCollection
import org.gradle.api.NamedDomainObjectContainer
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage.Companion.upTo
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
internal fun applyKotlinTargetHierarchy(
@@ -20,8 +22,10 @@ internal fun applyKotlinTargetHierarchy(
.all { target ->
target.compilations.all forCompilation@{ compilation ->
target.project.kotlinMultiplatformPluginLifecycle.launch {
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@launch
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
withRestrictedStages(upTo(Stage.FinaliseRefinesEdges)) {
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@withRestrictedStages
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
}
}
}
}
@@ -17,8 +17,8 @@ import org.gradle.api.attributes.AttributeContainer
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
import org.jetbrains.kotlin.gradle.targets.android.InternalKotlinAndroidTargetVariantTypeDsl
import org.jetbrains.kotlin.gradle.targets.android.KotlinAndroidTargetVariantTypeDsl
import org.jetbrains.kotlin.gradle.targets.android.KotlinAndroidTargetVariantTypeDslImpl
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
@@ -41,13 +41,13 @@ abstract class KotlinAndroidTarget @Inject constructor(
project.container(KotlinJvmAndroidCompilation::class.java)
@ExperimentalKotlinGradlePluginApi
val main: KotlinAndroidTargetVariantTypeDsl = InternalKotlinAndroidTargetVariantTypeDsl(project)
val main: KotlinAndroidTargetVariantTypeDsl = KotlinAndroidTargetVariantTypeDslImpl(project)
@ExperimentalKotlinGradlePluginApi
val unitTest: KotlinAndroidTargetVariantTypeDsl = InternalKotlinAndroidTargetVariantTypeDsl(project)
val unitTest: KotlinAndroidTargetVariantTypeDsl = KotlinAndroidTargetVariantTypeDslImpl(project)
@ExperimentalKotlinGradlePluginApi
val instrumentedTest: KotlinAndroidTargetVariantTypeDsl = InternalKotlinAndroidTargetVariantTypeDsl(project)
val instrumentedTest: KotlinAndroidTargetVariantTypeDsl = KotlinAndroidTargetVariantTypeDslImpl(project)
/** Names of the Android library variants that should be published from the target's project within the default publications which are
* set up if the `maven-publish` Gradle plugin is applied.
@@ -5,25 +5,30 @@
package org.jetbrains.kotlin.gradle.targets.android
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.provider.Property
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage.FinaliseDsl
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchy
import org.jetbrains.kotlin.gradle.plugin.newLifecycleAwareProperty
sealed class KotlinAndroidTargetVariantTypeDsl {
abstract val kotlinModuleName: Property<String>
}
internal val KotlinAndroidTargetVariantTypeDsl.internal: InternalKotlinAndroidTargetVariantTypeDsl
get() = when (this) {
is InternalKotlinAndroidTargetVariantTypeDsl -> this
@ExperimentalKotlinGradlePluginApi
interface KotlinAndroidTargetVariantTypeDsl {
interface TargetHierarchyDsl {
val module: Property<KotlinTargetHierarchy.ModuleName>
}
internal class InternalKotlinAndroidTargetVariantTypeDsl(
val project: Project,
) : KotlinAndroidTargetVariantTypeDsl() {
val targetHierarchy: TargetHierarchyDsl
fun targetHierarchy(configure: TargetHierarchyDsl.() -> Unit): Unit = targetHierarchy.configure()
fun targetHierarchy(configure: Action<@UnsafeVariance TargetHierarchyDsl>): Unit = configure.execute(targetHierarchy)
}
override val kotlinModuleName: Property<String> by project.newLifecycleAwareProperty<String>(
finaliseIn = Stage.BeforeFinaliseRefinesEdges
)
internal class KotlinAndroidTargetVariantTypeDslImpl(private val project: Project) : KotlinAndroidTargetVariantTypeDsl {
internal inner class TargetHierarchyDslImpl : KotlinAndroidTargetVariantTypeDsl.TargetHierarchyDsl {
override val module: Property<KotlinTargetHierarchy.ModuleName> by project.newLifecycleAwareProperty(FinaliseDsl)
}
override val targetHierarchy: KotlinAndroidTargetVariantTypeDsl.TargetHierarchyDsl = TargetHierarchyDslImpl()
}
@@ -0,0 +1,54 @@
/*
* 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")
package org.jetbrains.kotlin.gradle.unitTests
import junit.framework.TestCase.assertNull
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue
import org.jetbrains.kotlin.gradle.plugin.currentMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.kotlinMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.targets.android.KotlinAndroidTargetVariantTypeDslImpl
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
import org.junit.Test
import kotlin.test.assertEquals
import kotlin.test.assertFails
class KotlinAndroidTargetVariantTypeDslImplTest {
private val project = buildProjectWithMPP()
private val dsl = KotlinAndroidTargetVariantTypeDslImpl(project)
@Test
fun `test - module - not set`() = project.runLifecycleAwareTest {
project.kotlinMultiplatformPluginLifecycle.launch {
assertNull(dsl.targetHierarchy.module.orNull)
assertNull(dsl.targetHierarchy.module.awaitFinalValue())
}
}
@Test
fun `test - module - can be set in users afterEvaluate`() = project.runLifecycleAwareTest {
afterEvaluate { dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("x")) }
dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("-set-before-after-evaluate-"))
assertEquals("x", dsl.targetHierarchy.module.awaitFinalValue()?.name)
assertEquals(KotlinMultiplatformPluginLifecycle.Stage.FinaliseDsl, currentMultiplatformPluginLifecycle().stage)
}
@Test
fun `test - module - cannot be set after FinaliseDsl`() = project.runLifecycleAwareTest {
launchInStage(KotlinMultiplatformPluginLifecycle.Stage.BeforeFinaliseDsl) {
dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("x"))
}
launchInStage(KotlinMultiplatformPluginLifecycle.Stage.FinaliseDsl) {
assertFails { dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("y")) }
}
}
}
@@ -1,31 +0,0 @@
/*
* 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")
package org.jetbrains.kotlin.gradle.unitTests
import junit.framework.TestCase.assertNull
import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue
import org.jetbrains.kotlin.gradle.plugin.kotlinMultiplatformPluginLifecycle
import org.jetbrains.kotlin.gradle.targets.android.InternalKotlinAndroidTargetVariantTypeDsl
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.junit.Test
class KotlinAndroidTargetVariantTypeDslTest {
private val project = buildProjectWithMPP()
@Test
fun `test - targetHierarchyModuleName - not set`() {
val dsl = InternalKotlinAndroidTargetVariantTypeDsl(project)
project.kotlinMultiplatformPluginLifecycle.launch {
assertNull(dsl.kotlinModuleName.orNull)
assertNull(dsl.kotlinModuleName.awaitFinalValue())
}
project.evaluate()
}
}