[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.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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-4
@@ -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.
|
||||
|
||||
+19
-14
@@ -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()
|
||||
}
|
||||
+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