[Gradle] Implement Android DSL for choosing KotlinTargetHierarchy.ModuleName
KT-34662
This commit is contained in:
committed by
Space Team
parent
78751dcb55
commit
098cfae957
+6
-2
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.targetHierarchy
|
|||||||
import org.gradle.api.DomainObjectCollection
|
import org.gradle.api.DomainObjectCollection
|
||||||
import org.gradle.api.NamedDomainObjectContainer
|
import org.gradle.api.NamedDomainObjectContainer
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
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
|
import org.jetbrains.kotlin.gradle.plugin.mpp.internal
|
||||||
|
|
||||||
internal fun applyKotlinTargetHierarchy(
|
internal fun applyKotlinTargetHierarchy(
|
||||||
@@ -20,8 +22,10 @@ internal fun applyKotlinTargetHierarchy(
|
|||||||
.all { target ->
|
.all { target ->
|
||||||
target.compilations.all forCompilation@{ compilation ->
|
target.compilations.all forCompilation@{ compilation ->
|
||||||
target.project.kotlinMultiplatformPluginLifecycle.launch {
|
target.project.kotlinMultiplatformPluginLifecycle.launch {
|
||||||
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@launch
|
withRestrictedStages(upTo(Stage.FinaliseRefinesEdges)) {
|
||||||
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
|
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@withRestrictedStages
|
||||||
|
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-4
@@ -17,8 +17,8 @@ import org.gradle.api.attributes.AttributeContainer
|
|||||||
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
|
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
|
||||||
import org.jetbrains.kotlin.gradle.plugin.*
|
import org.jetbrains.kotlin.gradle.plugin.*
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.util.copyAttributes
|
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.KotlinAndroidTargetVariantTypeDsl
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.android.KotlinAndroidTargetVariantTypeDslImpl
|
||||||
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
import org.jetbrains.kotlin.gradle.utils.dashSeparatedName
|
||||||
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
|
import org.jetbrains.kotlin.gradle.utils.forAllAndroidVariants
|
||||||
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
|
||||||
@@ -41,13 +41,13 @@ abstract class KotlinAndroidTarget @Inject constructor(
|
|||||||
project.container(KotlinJvmAndroidCompilation::class.java)
|
project.container(KotlinJvmAndroidCompilation::class.java)
|
||||||
|
|
||||||
@ExperimentalKotlinGradlePluginApi
|
@ExperimentalKotlinGradlePluginApi
|
||||||
val main: KotlinAndroidTargetVariantTypeDsl = InternalKotlinAndroidTargetVariantTypeDsl(project)
|
val main: KotlinAndroidTargetVariantTypeDsl = KotlinAndroidTargetVariantTypeDslImpl(project)
|
||||||
|
|
||||||
@ExperimentalKotlinGradlePluginApi
|
@ExperimentalKotlinGradlePluginApi
|
||||||
val unitTest: KotlinAndroidTargetVariantTypeDsl = InternalKotlinAndroidTargetVariantTypeDsl(project)
|
val unitTest: KotlinAndroidTargetVariantTypeDsl = KotlinAndroidTargetVariantTypeDslImpl(project)
|
||||||
|
|
||||||
@ExperimentalKotlinGradlePluginApi
|
@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
|
/** 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.
|
* set up if the `maven-publish` Gradle plugin is applied.
|
||||||
|
|||||||
+19
-14
@@ -5,25 +5,30 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.targets.android
|
package org.jetbrains.kotlin.gradle.targets.android
|
||||||
|
|
||||||
|
import org.gradle.api.Action
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.provider.Property
|
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
|
import org.jetbrains.kotlin.gradle.plugin.newLifecycleAwareProperty
|
||||||
|
|
||||||
sealed class KotlinAndroidTargetVariantTypeDsl {
|
@ExperimentalKotlinGradlePluginApi
|
||||||
abstract val kotlinModuleName: Property<String>
|
interface KotlinAndroidTargetVariantTypeDsl {
|
||||||
}
|
interface TargetHierarchyDsl {
|
||||||
|
val module: Property<KotlinTargetHierarchy.ModuleName>
|
||||||
internal val KotlinAndroidTargetVariantTypeDsl.internal: InternalKotlinAndroidTargetVariantTypeDsl
|
|
||||||
get() = when (this) {
|
|
||||||
is InternalKotlinAndroidTargetVariantTypeDsl -> this
|
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class InternalKotlinAndroidTargetVariantTypeDsl(
|
val targetHierarchy: TargetHierarchyDsl
|
||||||
val project: Project,
|
fun targetHierarchy(configure: TargetHierarchyDsl.() -> Unit): Unit = targetHierarchy.configure()
|
||||||
) : KotlinAndroidTargetVariantTypeDsl() {
|
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()
|
||||||
}
|
}
|
||||||
+54
@@ -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")) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
-31
@@ -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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user