[Gradle][KT-51583][Minor] add 'projectBuilder' block to buildProject functions

This commit is contained in:
sebastian.sellmair
2022-08-09 09:57:56 +02:00
committed by Space
parent 8acf04cf23
commit f713782737
3 changed files with 18 additions and 9 deletions
@@ -44,5 +44,8 @@ internal inline fun <reified T : Any> Any.addExtension(name: String, extension:
internal inline fun <reified T : Any> Any.getExtension(name: String): T? =
(this as ExtensionAware).extensions.getByName(name) as T?
internal inline fun <reified T : Any> Any.findExtension(name: String): T? =
(this as ExtensionAware).extensions.findByName(name)?.let { it as T? }
inline val Any.extraProperties: ExtraPropertiesExtension
get() = (this as ExtensionAware).extensions.extraProperties
@@ -12,6 +12,8 @@ import org.gradle.build.event.BuildEventsListenerRegistry
import org.gradle.internal.service.DefaultServiceRegistry
import org.gradle.internal.service.scopes.ProjectScopeServices
import org.gradle.tooling.events.OperationCompletionListener
import org.jetbrains.kotlin.gradle.plugin.addExtension
import org.jetbrains.kotlin.gradle.plugin.findExtension
import java.lang.reflect.Field
import java.util.concurrent.atomic.AtomicReference
@@ -21,7 +23,9 @@ import java.util.concurrent.atomic.AtomicReference
* https://github.com/gradle/gradle/issues/16774 (Waiting for Gradle 7.5)
*/
internal fun addBuildEventsListenerRegistryMock(project: Project) {
val executedExtensionKey = "addBuildEventsListenerRegistryMock.executed"
try {
if (project.findExtension<Boolean>(executedExtensionKey) == true) return
val projectScopeServices = (project as DefaultProject).services as ProjectScopeServices
val state: Field = ProjectScopeServices::class.java.superclass.getDeclaredField("state")
state.isAccessible = true
@@ -33,6 +37,7 @@ internal fun addBuildEventsListenerRegistryMock(project: Project) {
// add service and set state so that future mutations are not allowed
projectScopeServices.add(BuildEventsListenerRegistry::class.java, BuildEventsListenerRegistryMock)
stateValue.set(enumClass.enumConstants[1])
project.addExtension(executedExtensionKey, true)
} catch (e: Throwable) {
throw RuntimeException(e)
}
@@ -11,32 +11,33 @@ import org.gradle.api.internal.project.ProjectInternal
import org.gradle.testfixtures.ProjectBuilder
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.kotlinExtension
import org.jetbrains.kotlin.gradle.kpm.applyKpmPlugin
import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformJvmPlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.KotlinPm20ProjectExtension
fun buildProject(
configBuilder: ProjectBuilder.() -> Unit = { },
configProject: Project.() -> Unit = {},
projectBuilder: ProjectBuilder.() -> Unit = { },
configureProject: Project.() -> Unit = {},
): ProjectInternal = ProjectBuilder
.builder()
.apply(configBuilder)
.apply(projectBuilder)
.build()
//temporary solution for BuildEventsListenerRegistry
.also { addBuildEventsListenerRegistryMock(it) }
.apply(configProject)
.apply(configureProject)
.let { it as ProjectInternal }
fun buildProjectWithMPP(code: Project.() -> Unit = {}) = buildProject {
project.plugins.apply("kotlin-multiplatform")
fun buildProjectWithMPP(projectBuilder: ProjectBuilder.() -> Unit = { }, code: Project.() -> Unit = {}) = buildProject(projectBuilder) {
project.applyMultiplatformPlugin()
code()
}
fun buildProjectWithKPM(code: Project.() -> Unit= {}) = buildProject {
project.plugins.apply("org.jetbrains.kotlin.multiplatform.pm20")
fun buildProjectWithKPM(projectBuilder: ProjectBuilder.() -> Unit = { }, code: Project.() -> Unit= {}) = buildProject(projectBuilder) {
project.applyKpmPlugin()
code()
}
fun buildProjectWithJvm(code: Project.() -> Unit = {}) = buildProject {
fun buildProjectWithJvm(projectBuilder: ProjectBuilder.() -> Unit = {}, code: Project.() -> Unit = {}) = buildProject(projectBuilder) {
project.plugins.apply(KotlinPlatformJvmPlugin::class.java)
code()
}