From 29d15235bb8085ab7e04ae859a0c5abae83dc133 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Thu, 3 Aug 2023 11:58:13 +0200 Subject: [PATCH] [Gradle][Minor] Add Property.awaitFinalValueOrThrow util function KT-60159 --- .../gradle/plugin/KotlinPluginLifecycle.kt | 10 +++++ .../LifecycleAwaitFinalPropertyValueTest.kt | 42 +++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt index 82dcf017328..d961ee66918 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginLifecycle.kt @@ -190,6 +190,16 @@ internal suspend fun Property.awaitFinalValue(): T? { return orNull } +/** + * Will suspend until [Stage.FinaliseDsl], finalise the value using [Property.finalizeValue] and return the + * final value or throw if value wasn't set. + */ +internal suspend fun Property.awaitFinalValueOrThrow(): T { + Stage.AfterFinaliseDsl.await() + finalizeValue() + return orNull ?: throw IllegalLifecycleException("Property has no value available: ${currentKotlinPluginLifecycle()}") +} + /** * See also [withRestrictedStages] * diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/LifecycleAwaitFinalPropertyValueTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/LifecycleAwaitFinalPropertyValueTest.kt index efab9501e86..44fc8878a8f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/LifecycleAwaitFinalPropertyValueTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/LifecycleAwaitFinalPropertyValueTest.kt @@ -8,11 +8,8 @@ package org.jetbrains.kotlin.gradle.unitTests import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.IllegalLifecycleException import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.* -import org.jetbrains.kotlin.gradle.plugin.awaitFinalValue -import org.jetbrains.kotlin.gradle.plugin.currentKotlinPluginLifecycle -import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.util.buildProjectWithMPP import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest import org.jetbrains.kotlin.gradle.utils.newProperty @@ -57,6 +54,43 @@ class LifecycleAwaitFinalPropertyValueTest { } } + @Test + fun `test - getting value is an idempotent operation`() = project.runLifecycleAwareTest { + val property = project.newProperty() + property.set(1) + + launch { + assertEquals(1, property.awaitFinalValue()) + assertEquals(1, property.awaitFinalValue()) + } + } + + @Test + fun `test - awaitFinalValueOrThrow - throws when no value set`() = project.runLifecycleAwareTest { + val property = project.newProperty() + launch { + assertFailsWith { property.awaitFinalValueOrThrow() } + } + } + + @Test + fun `test - awaitFinalValueOrThrow - returns when convention value is set`() = project.runLifecycleAwareTest { + val property = project.newProperty() + property.convention(1) + launch { + assertEquals(1, property.awaitFinalValueOrThrow()) + } + } + + @Test + fun `test - awaitFinalValueOrThrow - returns when value is set`() = project.runLifecycleAwareTest { + val property = project.newProperty() + property.set(1) + launch { + assertEquals(1, property.awaitFinalValueOrThrow()) + } + } + @Test fun `test - creating a property - after finaliseDsl stage already passed`() = project.runLifecycleAwareTest { launchInStage(KotlinPluginLifecycle.Stage.last) {