[Gradle] invokeWhenCreated: Lenient until last stage of lifecycle
^KT-34662 Verification Pending
This commit is contained in:
committed by
Space Team
parent
28fa5423a1
commit
4a896a2579
+5
-8
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.konan.target.CompilerOutputKind
|
|||||||
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
||||||
import java.util.concurrent.atomic.AtomicBoolean
|
import java.util.concurrent.atomic.AtomicBoolean
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import javax.inject.Provider
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
private const val KOTLIN_PROJECT_EXTENSION_NAME = "kotlin"
|
private const val KOTLIN_PROJECT_EXTENSION_NAME = "kotlin"
|
||||||
@@ -134,14 +135,10 @@ abstract class KotlinTopLevelExtension(internal val project: Project) : KotlinTo
|
|||||||
*/
|
*/
|
||||||
@ExperimentalKotlinGradlePluginApi
|
@ExperimentalKotlinGradlePluginApi
|
||||||
fun <T : Named> NamedDomainObjectContainer<T>.invokeWhenCreated(name: String, configure: T.() -> Unit) {
|
fun <T : Named> NamedDomainObjectContainer<T>.invokeWhenCreated(name: String, configure: T.() -> Unit) {
|
||||||
val invoked = AtomicBoolean(false)
|
configureEach { if (it.name == name) it.configure() }
|
||||||
matching { it.name == name }.all { value -> if (!invoked.getAndSet(true)) value.configure() }
|
project.launchInStage(KotlinPluginLifecycle.Stage.ReadyForExecution) {
|
||||||
project.whenEvaluated {
|
if (name !in names) {
|
||||||
if (!invoked.getAndSet(true)) {
|
/* Expect 'named' to throw corresponding exception */
|
||||||
/*
|
|
||||||
Expected to fail, since the listener was not called.
|
|
||||||
Letting Gradle fail here will result in a more natural error message
|
|
||||||
*/
|
|
||||||
named(name).configure(configure)
|
named(name).configure(configure)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+16
@@ -10,9 +10,13 @@ package org.jetbrains.kotlin.gradle.unitTests
|
|||||||
import org.gradle.api.Named
|
import org.gradle.api.Named
|
||||||
import org.gradle.api.UnknownDomainObjectException
|
import org.gradle.api.UnknownDomainObjectException
|
||||||
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
|
||||||
|
import org.jetbrains.kotlin.gradle.plugin.await
|
||||||
import org.jetbrains.kotlin.gradle.util.buildProjectWithJvm
|
import org.jetbrains.kotlin.gradle.util.buildProjectWithJvm
|
||||||
|
import org.jetbrains.kotlin.gradle.util.runLifecycleAwareTest
|
||||||
import org.jetbrains.kotlin.tooling.core.withLinearClosure
|
import org.jetbrains.kotlin.tooling.core.withLinearClosure
|
||||||
import org.junit.Test
|
import org.junit.Test
|
||||||
|
import java.util.concurrent.atomic.AtomicInteger
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
import kotlin.test.assertFails
|
import kotlin.test.assertFails
|
||||||
import kotlin.test.fail
|
import kotlin.test.fail
|
||||||
@@ -68,4 +72,16 @@ class InvokeWhenCreatedTest {
|
|||||||
val causes = assertFails { project.evaluate() }.withLinearClosure { it.cause }
|
val causes = assertFails { project.evaluate() }.withLinearClosure { it.cause }
|
||||||
assertEquals<Class<*>>(UnknownDomainObjectException::class.java, causes.last().javaClass)
|
assertEquals<Class<*>>(UnknownDomainObjectException::class.java, causes.last().javaClass)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `test - is lenient up-to last stage of Kotlin Plugin Lifecycle`() = project.runLifecycleAwareTest {
|
||||||
|
project.kotlinExtension.apply {
|
||||||
|
val invocations = AtomicInteger(0)
|
||||||
|
container.invokeWhenCreated("x") { assertEquals(1, invocations.incrementAndGet()) }
|
||||||
|
await(KotlinPluginLifecycle.Stage.last)
|
||||||
|
assertEquals(0, invocations.get())
|
||||||
|
container.create("x")
|
||||||
|
assertEquals(1, invocations.get())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user