[Gradle] Promote KotlinMultiplatformPluginLifecycle to KotlinPluginLifecycle

KT-34662
This commit is contained in:
Sebastian Sellmair
2023-03-09 13:02:10 +01:00
committed by Space Team
parent 098cfae957
commit 656ce4aead
13 changed files with 75 additions and 74 deletions
@@ -9,7 +9,7 @@ import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
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.* import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.*
import org.jetbrains.kotlin.gradle.utils.getOrPut import org.jetbrains.kotlin.gradle.utils.getOrPut
import java.lang.ref.WeakReference import java.lang.ref.WeakReference
import java.util.* import java.util.*
@@ -23,18 +23,18 @@ import kotlin.reflect.KProperty
Util functions Util functions
*/ */
internal fun Project.launch(block: suspend KotlinMultiplatformPluginLifecycle.() -> Unit) { internal fun Project.launch(block: suspend KotlinPluginLifecycle.() -> Unit) {
kotlinMultiplatformPluginLifecycle.launch(block) kotlinPluginLifecycle.launch(block)
} }
internal fun Project.launchInStage(stage: Stage, block: suspend KotlinMultiplatformPluginLifecycle.() -> Unit) { internal fun Project.launchInStage(stage: Stage, block: suspend KotlinPluginLifecycle.() -> Unit) {
launch { launch {
await(stage) await(stage)
block() block()
} }
} }
internal fun Project.launchInRequiredStage(stage: Stage, block: suspend KotlinMultiplatformPluginLifecycle.() -> Unit) { internal fun Project.launchInRequiredStage(stage: Stage, block: suspend KotlinPluginLifecycle.() -> Unit) {
launchInStage(stage) { launchInStage(stage) {
requiredStage(stage) { requiredStage(stage) {
block() block()
@@ -42,41 +42,42 @@ internal fun Project.launchInRequiredStage(stage: Stage, block: suspend KotlinMu
} }
} }
internal val Project.kotlinMultiplatformPluginLifecycle: KotlinMultiplatformPluginLifecycle internal val Project.kotlinPluginLifecycle: KotlinPluginLifecycle
get() = extraProperties.getOrPut(KotlinMultiplatformPluginLifecycle::class.java.name) { get() = extraProperties.getOrPut(KotlinPluginLifecycle::class.java.name) {
KotlinMultiplatformPluginLifecycleImpl(project) KotlinPluginLifecycleImpl(project)
} }
internal fun Project.startKotlinMultiplatformPluginLifecycle() { internal fun Project.startKotlinPluginLifecycle() {
(kotlinMultiplatformPluginLifecycle as KotlinMultiplatformPluginLifecycleImpl).start() (kotlinPluginLifecycle as KotlinPluginLifecycleImpl).start()
} }
internal suspend fun currentMultiplatformPluginLifecycle(): KotlinMultiplatformPluginLifecycle { internal suspend fun currentKotlinPluginLifecycle(): KotlinPluginLifecycle {
return currentCoroutineContext()[KotlinMultiplatformPluginLifecycleCoroutineContextElement]?.lifecycle return currentCoroutineContext()[KotlinMultiplatformPluginLifecycleCoroutineContextElement]?.lifecycle
?: error("Missing $KotlinMultiplatformPluginLifecycleCoroutineContextElement in currentCoroutineContext") ?: error("Missing $KotlinMultiplatformPluginLifecycleCoroutineContextElement in currentCoroutineContext")
} }
internal suspend fun await(stage: Stage) { internal suspend fun await(stage: Stage) {
currentMultiplatformPluginLifecycle().await(stage) currentKotlinPluginLifecycle().await(stage)
} }
internal inline fun <reified T : Any> Project.newLifecycleAwareProperty( internal inline fun <reified T : Any> Project.newKotlinPluginLifecycleAwareProperty(
finaliseIn: Stage = Stage.FinaliseDsl, initialValue: T? = null finaliseIn: Stage = Stage.FinaliseDsl, initialValue: T? = null
): LifecycleAwareProperty<T> { ): LifecycleAwareProperty<T> {
return kotlinMultiplatformPluginLifecycle.newLifecycleAwareProperty(T::class.java, finaliseIn, initialValue) return kotlinPluginLifecycle.newLifecycleAwareProperty(T::class.java, finaliseIn, initialValue)
} }
internal suspend fun <T : Any> Property<T>.findLifecycleAwareProperty(): LifecycleAwareProperty<T>? { internal suspend fun <T : Any> Property<T>.findKotlinPluginLifecycleAwareProperty(): LifecycleAwareProperty<T>? {
return (currentMultiplatformPluginLifecycle() as KotlinMultiplatformPluginLifecycleImpl).findLifecycleAwareProperty(this) return (currentKotlinPluginLifecycle() as KotlinPluginLifecycleImpl).findLifecycleAwareProperty(this)
} }
internal suspend fun <T : Any> Property<T>.awaitFinalValue(): T? { internal suspend fun <T : Any> Property<T>.awaitFinalValue(): T? {
val lifecycleAwareProperty = findLifecycleAwareProperty() ?: throw IllegalArgumentException("Property is not lifecycle aware") val lifecycleAwareProperty = findKotlinPluginLifecycleAwareProperty()
?: throw IllegalArgumentException("Property is not lifecycle aware")
return lifecycleAwareProperty.awaitFinalValue() return lifecycleAwareProperty.awaitFinalValue()
} }
internal suspend fun Property<*>.isLifecycleAware(): Boolean { internal suspend fun Property<*>.isKotlinPluginLifecycleAware(): Boolean {
return findLifecycleAwareProperty() != null return findKotlinPluginLifecycleAwareProperty() != null
} }
internal suspend fun <T> requiredStage(stage: Stage, block: suspend () -> T): T { internal suspend fun <T> requiredStage(stage: Stage, block: suspend () -> T): T {
@@ -84,11 +85,11 @@ internal suspend fun <T> requiredStage(stage: Stage, block: suspend () -> T): T
} }
internal suspend fun <T> requireCurrentStage(block: suspend () -> T): T { internal suspend fun <T> requireCurrentStage(block: suspend () -> T): T {
return requiredStage(currentMultiplatformPluginLifecycle().stage, block) return requiredStage(currentKotlinPluginLifecycle().stage, block)
} }
internal suspend fun <T> withRestrictedStages(allowed: Set<Stage>, block: suspend () -> T): T { internal suspend fun <T> withRestrictedStages(allowed: Set<Stage>, block: suspend () -> T): T {
return withContext(RestrictedLifecycleStages(currentMultiplatformPluginLifecycle(), allowed)) { return withContext(RestrictedLifecycleStages(currentKotlinPluginLifecycle(), allowed)) {
block() block()
} }
} }
@@ -97,7 +98,7 @@ internal suspend fun <T> withRestrictedStages(allowed: Set<Stage>, block: suspen
Definition of the Lifecycle and its stages Definition of the Lifecycle and its stages
*/ */
internal interface KotlinMultiplatformPluginLifecycle { internal interface KotlinPluginLifecycle {
enum class Stage { enum class Stage {
Configure, Configure,
AfterEvaluate, AfterEvaluate,
@@ -130,9 +131,9 @@ internal interface KotlinMultiplatformPluginLifecycle {
val stage: Stage val stage: Stage
fun enqueue(stage: Stage, action: KotlinMultiplatformPluginLifecycle.() -> Unit) fun enqueue(stage: Stage, action: KotlinPluginLifecycle.() -> Unit)
fun launch(block: suspend KotlinMultiplatformPluginLifecycle.() -> Unit) fun launch(block: suspend KotlinPluginLifecycle.() -> Unit)
suspend fun await(stage: Stage) suspend fun await(stage: Stage)
@@ -155,9 +156,9 @@ internal interface KotlinMultiplatformPluginLifecycle {
Implementation Implementation
*/ */
private class KotlinMultiplatformPluginLifecycleImpl(override val project: Project) : KotlinMultiplatformPluginLifecycle { private class KotlinPluginLifecycleImpl(override val project: Project) : KotlinPluginLifecycle {
private val enqueuedStages: ArrayDeque<Stage> = ArrayDeque(Stage.values) private val enqueuedStages: ArrayDeque<Stage> = ArrayDeque(Stage.values)
private val enqueuedActions: Map<Stage, ArrayDeque<KotlinMultiplatformPluginLifecycle.() -> Unit>> = private val enqueuedActions: Map<Stage, ArrayDeque<KotlinPluginLifecycle.() -> Unit>> =
Stage.values().associateWith { ArrayDeque() } Stage.values().associateWith { ArrayDeque() }
private var configureLoopRunning = AtomicBoolean(false) private var configureLoopRunning = AtomicBoolean(false)
@@ -168,11 +169,11 @@ private class KotlinMultiplatformPluginLifecycleImpl(override val project: Proje
fun start() { fun start() {
check(!isStarted.getAndSet(true)) { check(!isStarted.getAndSet(true)) {
"${KotlinMultiplatformPluginLifecycle::class.java.name} already started" "${KotlinPluginLifecycle::class.java.name} already started"
} }
check(!project.state.executed) { check(!project.state.executed) {
"${KotlinMultiplatformPluginLifecycle::class.java.name} cannot be started in ProjectState '${project.state}'" "${KotlinPluginLifecycle::class.java.name} cannot be started in ProjectState '${project.state}'"
} }
project.whenEvaluated { project.whenEvaluated {
@@ -213,7 +214,7 @@ private class KotlinMultiplatformPluginLifecycleImpl(override val project: Proje
override var stage: Stage = enqueuedStages.removeFirst() override var stage: Stage = enqueuedStages.removeFirst()
override fun enqueue(stage: Stage, action: KotlinMultiplatformPluginLifecycle.() -> Unit) { override fun enqueue(stage: Stage, action: KotlinPluginLifecycle.() -> Unit) {
if (stage < this.stage) { if (stage < this.stage) {
throw IllegalLifecycleException("Cannot enqueue Action for stage '${this.stage}' in current stage '${this.stage}'") throw IllegalLifecycleException("Cannot enqueue Action for stage '${this.stage}' in current stage '${this.stage}'")
} }
@@ -225,10 +226,10 @@ private class KotlinMultiplatformPluginLifecycleImpl(override val project: Proje
} }
} }
override fun launch(block: suspend KotlinMultiplatformPluginLifecycle.() -> Unit) { override fun launch(block: suspend KotlinPluginLifecycle.() -> Unit) {
val lifecycle = this val lifecycle = this
check(isStarted.get()) { "Cannot launch when ${KotlinMultiplatformPluginLifecycle::class.simpleName} is not started" } check(isStarted.get()) { "Cannot launch when ${KotlinPluginLifecycle::class.simpleName} is not started" }
check(!isFinished.get()) { "Cannot launch when ${KotlinMultiplatformPluginLifecycle::class.simpleName} is already finished" } check(!isFinished.get()) { "Cannot launch when ${KotlinPluginLifecycle::class.simpleName} is already finished" }
val coroutine = block.createCoroutine(this, object : Continuation<Unit> { val coroutine = block.createCoroutine(this, object : Continuation<Unit> {
override val context: CoroutineContext = EmptyCoroutineContext + override val context: CoroutineContext = EmptyCoroutineContext +
@@ -277,7 +278,7 @@ private class KotlinMultiplatformPluginLifecycleImpl(override val project: Proje
} }
private class KotlinMultiplatformPluginLifecycleCoroutineContextElement( private class KotlinMultiplatformPluginLifecycleCoroutineContextElement(
val lifecycle: KotlinMultiplatformPluginLifecycle val lifecycle: KotlinPluginLifecycle
) : CoroutineContext.Element { ) : CoroutineContext.Element {
companion object Key : CoroutineContext.Key<KotlinMultiplatformPluginLifecycleCoroutineContextElement> companion object Key : CoroutineContext.Key<KotlinMultiplatformPluginLifecycleCoroutineContextElement>
@@ -285,7 +286,7 @@ private class KotlinMultiplatformPluginLifecycleCoroutineContextElement(
} }
private class RestrictedLifecycleStages( private class RestrictedLifecycleStages(
private val lifecycle: KotlinMultiplatformPluginLifecycle, private val lifecycle: KotlinPluginLifecycle,
private val allowedStages: Set<Stage>, private val allowedStages: Set<Stage>,
) : CoroutineContext.Element, ContinuationInterceptor { ) : CoroutineContext.Element, ContinuationInterceptor {
@OptIn(ExperimentalStdlibApi::class) @OptIn(ExperimentalStdlibApi::class)
@@ -77,7 +77,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin {
checkGradleCompatibility() checkGradleCompatibility()
project.startKotlinMultiplatformPluginLifecycle() project.startKotlinPluginLifecycle()
project.gradle.projectsEvaluated { project.gradle.projectsEvaluated {
whenBuildEvaluated(project) whenBuildEvaluated(project)
@@ -172,7 +172,7 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
val production = sourceSets.create(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME) val production = sourceSets.create(KotlinSourceSet.COMMON_MAIN_SOURCE_SET_NAME)
val test = sourceSets.create(KotlinSourceSet.COMMON_TEST_SOURCE_SET_NAME) val test = sourceSets.create(KotlinSourceSet.COMMON_TEST_SOURCE_SET_NAME)
targets.all { target -> targets.all { target ->
project.launchInStage(KotlinMultiplatformPluginLifecycle.Stage.FinaliseRefinesEdges) { project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseRefinesEdges) {
/* Only setup default refines edges when no KotlinTargetHierarchy was applied */ /* Only setup default refines edges when no KotlinTargetHierarchy was applied */
if (project.multiplatformExtension.internalKotlinTargetHierarchy.appliedDescriptors.isNotEmpty()) return@launchInStage if (project.multiplatformExtension.internalKotlinTargetHierarchy.appliedDescriptors.isNotEmpty()) return@launchInStage
@@ -8,8 +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.KotlinPluginLifecycle.Stage
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage.Companion.upTo import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.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(
@@ -21,7 +21,7 @@ internal fun applyKotlinTargetHierarchy(
.matching { target -> target.platformType != KotlinPlatformType.common } .matching { target -> target.platformType != KotlinPlatformType.common }
.all { target -> .all { target ->
target.compilations.all forCompilation@{ compilation -> target.compilations.all forCompilation@{ compilation ->
target.project.kotlinMultiplatformPluginLifecycle.launch { target.project.kotlinPluginLifecycle.launch {
withRestrictedStages(upTo(Stage.FinaliseRefinesEdges)) { withRestrictedStages(upTo(Stage.FinaliseRefinesEdges)) {
val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@withRestrictedStages val hierarchy = hierarchyDescriptor.buildKotlinTargetHierarchy(compilation) ?: return@withRestrictedStages
applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets) applyKotlinTargetHierarchy(hierarchy, compilation, sourceSets)
@@ -8,9 +8,9 @@
package org.jetbrains.kotlin.gradle.plugin.sources package org.jetbrains.kotlin.gradle.plugin.sources
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.kotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.kotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.utils.MutableObservableSet import org.jetbrains.kotlin.gradle.utils.MutableObservableSet
import org.jetbrains.kotlin.gradle.utils.MutableObservableSetImpl import org.jetbrains.kotlin.gradle.utils.MutableObservableSetImpl
import org.jetbrains.kotlin.gradle.utils.ObservableSet import org.jetbrains.kotlin.gradle.utils.ObservableSet
@@ -34,8 +34,8 @@ abstract class AbstractKotlinSourceSet : InternalKotlinSourceSet {
final override fun dependsOn(other: KotlinSourceSet) { final override fun dependsOn(other: KotlinSourceSet) {
if (other == this) return if (other == this) return
assert(project.kotlinMultiplatformPluginLifecycle.stage <= KotlinMultiplatformPluginLifecycle.Stage.FinaliseRefinesEdges) { assert(project.kotlinPluginLifecycle.stage <= KotlinPluginLifecycle.Stage.FinaliseRefinesEdges) {
"Illegal 'dependsOn' call in stage '${project.kotlinMultiplatformPluginLifecycle.stage}'" "Illegal 'dependsOn' call in stage '${project.kotlinPluginLifecycle.stage}'"
} }
/* /*
@@ -9,7 +9,7 @@ import com.android.build.gradle.api.AndroidSourceSet
import com.android.build.gradle.api.BaseVariant import com.android.build.gradle.api.BaseVariant
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchy import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchy
import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.plugin.launchInStage
@@ -32,7 +32,7 @@ internal object MultiplatformLayoutV2DependsOnConfigurator : KotlinAndroidSource
} }
private fun setDefaultDependsOn(target: KotlinAndroidTarget, kotlinSourceSet: KotlinSourceSet, variantType: AndroidVariantType) { private fun setDefaultDependsOn(target: KotlinAndroidTarget, kotlinSourceSet: KotlinSourceSet, variantType: AndroidVariantType) {
target.project.launchInStage(KotlinMultiplatformPluginLifecycle.Stage.FinaliseRefinesEdges) { target.project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseRefinesEdges) {
/* Only setup default if not KotlinTargetHierarchy was applied */ /* Only setup default if not KotlinTargetHierarchy was applied */
if (target.project.multiplatformExtensionOrNull?.internalKotlinTargetHierarchy?.appliedDescriptors.orEmpty().isNotEmpty()) { if (target.project.multiplatformExtensionOrNull?.internalKotlinTargetHierarchy?.appliedDescriptors.orEmpty().isNotEmpty()) {
return@launchInStage return@launchInStage
@@ -9,9 +9,9 @@ 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.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage.FinaliseDsl import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.FinaliseDsl
import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchy import org.jetbrains.kotlin.gradle.plugin.KotlinTargetHierarchy
import org.jetbrains.kotlin.gradle.plugin.newLifecycleAwareProperty import org.jetbrains.kotlin.gradle.plugin.newKotlinPluginLifecycleAwareProperty
@ExperimentalKotlinGradlePluginApi @ExperimentalKotlinGradlePluginApi
interface KotlinAndroidTargetVariantTypeDsl { interface KotlinAndroidTargetVariantTypeDsl {
@@ -27,7 +27,7 @@ interface KotlinAndroidTargetVariantTypeDsl {
internal class KotlinAndroidTargetVariantTypeDslImpl(private val project: Project) : KotlinAndroidTargetVariantTypeDsl { internal class KotlinAndroidTargetVariantTypeDslImpl(private val project: Project) : KotlinAndroidTargetVariantTypeDsl {
internal inner class TargetHierarchyDslImpl : KotlinAndroidTargetVariantTypeDsl.TargetHierarchyDsl { internal inner class TargetHierarchyDslImpl : KotlinAndroidTargetVariantTypeDsl.TargetHierarchyDsl {
override val module: Property<KotlinTargetHierarchy.ModuleName> by project.newLifecycleAwareProperty(FinaliseDsl) override val module: Property<KotlinTargetHierarchy.ModuleName> by project.newKotlinPluginLifecycleAwareProperty(FinaliseDsl)
} }
override val targetHierarchy: KotlinAndroidTargetVariantTypeDsl.TargetHierarchyDsl = TargetHierarchyDslImpl() override val targetHierarchy: KotlinAndroidTargetVariantTypeDsl.TargetHierarchyDsl = TargetHierarchyDslImpl()
@@ -175,7 +175,7 @@ class KotlinMetadataTargetConfigurator :
private fun createMetadataCompilationsForCommonSourceSets( private fun createMetadataCompilationsForCommonSourceSets(
target: KotlinMetadataTarget, target: KotlinMetadataTarget,
allMetadataJar: TaskProvider<out Jar> allMetadataJar: TaskProvider<out Jar>
) = target.project.launchInStage(KotlinMultiplatformPluginLifecycle.Stage.FinaliseCompilations) { ) = target.project.launchInStage(KotlinPluginLifecycle.Stage.FinaliseCompilations) {
// Do this after all targets are configured by the user build script // Do this after all targets are configured by the user build script
val publishedCommonSourceSets: Set<KotlinSourceSet> = getCommonSourceSetsForMetadataCompilation(project) val publishedCommonSourceSets: Set<KotlinSourceSet> = getCommonSourceSetsForMetadataCompilation(project)
@@ -9,10 +9,10 @@ package org.jetbrains.kotlin.gradle.unitTests
import junit.framework.TestCase.assertNull import junit.framework.TestCase.assertNull
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue
import org.jetbrains.kotlin.gradle.plugin.currentMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.currentKotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.kotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.kotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.targets.android.KotlinAndroidTargetVariantTypeDslImpl import org.jetbrains.kotlin.gradle.targets.android.KotlinAndroidTargetVariantTypeDslImpl
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
@@ -27,7 +27,7 @@ class KotlinAndroidTargetVariantTypeDslImplTest {
@Test @Test
fun `test - module - not set`() = project.runLifecycleAwareTest { fun `test - module - not set`() = project.runLifecycleAwareTest {
project.kotlinMultiplatformPluginLifecycle.launch { project.kotlinPluginLifecycle.launch {
assertNull(dsl.targetHierarchy.module.orNull) assertNull(dsl.targetHierarchy.module.orNull)
assertNull(dsl.targetHierarchy.module.awaitFinalValue()) assertNull(dsl.targetHierarchy.module.awaitFinalValue())
} }
@@ -38,16 +38,16 @@ class KotlinAndroidTargetVariantTypeDslImplTest {
afterEvaluate { dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("x")) } afterEvaluate { dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("x")) }
dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("-set-before-after-evaluate-")) dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("-set-before-after-evaluate-"))
assertEquals("x", dsl.targetHierarchy.module.awaitFinalValue()?.name) assertEquals("x", dsl.targetHierarchy.module.awaitFinalValue()?.name)
assertEquals(KotlinMultiplatformPluginLifecycle.Stage.FinaliseDsl, currentMultiplatformPluginLifecycle().stage) assertEquals(KotlinPluginLifecycle.Stage.FinaliseDsl, currentKotlinPluginLifecycle().stage)
} }
@Test @Test
fun `test - module - cannot be set after FinaliseDsl`() = project.runLifecycleAwareTest { fun `test - module - cannot be set after FinaliseDsl`() = project.runLifecycleAwareTest {
launchInStage(KotlinMultiplatformPluginLifecycle.Stage.BeforeFinaliseDsl) { launchInStage(KotlinPluginLifecycle.Stage.BeforeFinaliseDsl) {
dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("x")) dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("x"))
} }
launchInStage(KotlinMultiplatformPluginLifecycle.Stage.FinaliseDsl) { launchInStage(KotlinPluginLifecycle.Stage.FinaliseDsl) {
assertFails { dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("y")) } assertFails { dsl.targetHierarchy.module.set(KotlinTargetHierarchy.ModuleName("y")) }
} }
} }
@@ -9,9 +9,9 @@ package org.jetbrains.kotlin.gradle.unitTests
import org.gradle.api.ProjectConfigurationException import org.gradle.api.ProjectConfigurationException
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.IllegalLifecycleException import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.IllegalLifecycleException
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle.Stage.* import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.*
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
import org.jetbrains.kotlin.tooling.core.withLinearClosure import org.jetbrains.kotlin.tooling.core.withLinearClosure
@@ -20,10 +20,10 @@ import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicInteger
import kotlin.test.* import kotlin.test.*
class KotlinMultiplatformPluginLifecycleTest { class KotlinPluginLifecycleTest {
private val project = buildProjectWithMPP() private val project = buildProjectWithMPP()
private val lifecycle = project.kotlinMultiplatformPluginLifecycle private val lifecycle = project.kotlinPluginLifecycle
@Test @Test
fun `test - configure phase is executed right away`() { fun `test - configure phase is executed right away`() {
@@ -8,11 +8,11 @@
package org.jetbrains.kotlin.gradle.unitTests package org.jetbrains.kotlin.gradle.unitTests
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.KotlinPluginLifecycle.Stage.*
import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue
import org.jetbrains.kotlin.gradle.plugin.currentMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.currentKotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.plugin.launchInStage
import org.jetbrains.kotlin.gradle.plugin.newLifecycleAwareProperty import org.jetbrains.kotlin.gradle.plugin.newKotlinPluginLifecycleAwareProperty
import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
import org.jetbrains.kotlin.gradle.utils.newProperty import org.jetbrains.kotlin.gradle.utils.newProperty
@@ -27,8 +27,8 @@ class LifecycleAwarePropertyTest {
@Test @Test
fun `test - awaitFinalValue`() = project.runLifecycleAwareTest { fun `test - awaitFinalValue`() = project.runLifecycleAwareTest {
val property by project.newLifecycleAwareProperty<Int>(AfterFinaliseRefinesEdges) val property by project.newKotlinPluginLifecycleAwareProperty<Int>(AfterFinaliseRefinesEdges)
assertTrue(property.isLifecycleAware()) assertTrue(property.isKotlinPluginLifecycleAware())
launchInStage(BeforeFinaliseRefinesEdges) { launchInStage(BeforeFinaliseRefinesEdges) {
property.set(1) property.set(1)
@@ -39,21 +39,21 @@ class LifecycleAwarePropertyTest {
property.set(2) property.set(2)
} }
assertEquals(Configure, currentMultiplatformPluginLifecycle().stage) assertEquals(Configure, currentKotlinPluginLifecycle().stage)
assertEquals(2, property.awaitFinalValue()) assertEquals(2, property.awaitFinalValue())
assertEquals(AfterFinaliseRefinesEdges, currentMultiplatformPluginLifecycle().stage) assertEquals(AfterFinaliseRefinesEdges, currentKotlinPluginLifecycle().stage)
} }
@Test @Test
fun `test - awaitFinalValue - on non lifecycle aware property`() = project.runLifecycleAwareTest { fun `test - awaitFinalValue - on non lifecycle aware property`() = project.runLifecycleAwareTest {
val property = project.newProperty<String>() val property = project.newProperty<String>()
assertFalse(property.isLifecycleAware()) assertFalse(property.isKotlinPluginLifecycleAware())
assertFailsWith<IllegalArgumentException> { property.awaitFinalValue() } assertFailsWith<IllegalArgumentException> { property.awaitFinalValue() }
} }
@Test @Test
fun `test - changing value after finalized`() = project.runLifecycleAwareTest { fun `test - changing value after finalized`() = project.runLifecycleAwareTest {
val property by project.newLifecycleAwareProperty<Int>(AfterEvaluate) val property by project.newKotlinPluginLifecycleAwareProperty<Int>(AfterEvaluate)
property.set(1) property.set(1)
launchInStage(AfterEvaluate) { launchInStage(AfterEvaluate) {
@@ -9,7 +9,7 @@ package org.jetbrains.kotlin.gradle.unitTests.sources
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet
import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.plugin.launchInStage
import org.jetbrains.kotlin.gradle.plugin.mpp.getHostSpecificMainSharedSourceSets import org.jetbrains.kotlin.gradle.plugin.mpp.getHostSpecificMainSharedSourceSets
@@ -70,7 +70,7 @@ class InternalKotlinSourceSetTest {
nativeMain.internal.compilations nativeMain.internal.compilations
) )
project.launchInStage(KotlinMultiplatformPluginLifecycle.Stage.Finalised) { project.launchInStage(KotlinPluginLifecycle.Stage.Finalised) {
assertEquals<Set<KotlinCompilation<*>>>( assertEquals<Set<KotlinCompilation<*>>>(
setOf( setOf(
metadataCompilation, metadataCompilation,
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.gradle.util
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.project.ProjectInternal
import org.jetbrains.kotlin.gradle.plugin.kotlinMultiplatformPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.kotlinPluginLifecycle
fun Project.runLifecycleAwareTest(block: suspend Project.() -> Unit) { fun Project.runLifecycleAwareTest(block: suspend Project.() -> Unit) {
kotlinMultiplatformPluginLifecycle.launch { block() } kotlinPluginLifecycle.launch { block() }
(this as ProjectInternal).evaluate() (this as ProjectInternal).evaluate()
} }