diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt index c8af17ec882..b84c05e174a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/gradleUtils.kt @@ -44,5 +44,8 @@ internal inline fun Any.addExtension(name: String, extension: internal inline fun Any.getExtension(name: String): T? = (this as ExtensionAware).extensions.getByName(name) as T? +internal inline fun 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 diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildEventListenerRegistry.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildEventListenerRegistry.kt index c48094e5202..cd189576b49 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildEventListenerRegistry.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildEventListenerRegistry.kt @@ -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(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) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildProject.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildProject.kt index e13fff5229c..ecd95fc57fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildProject.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/buildProject.kt @@ -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() }