From 1ded9a410567d1ab776c0e1225d35180c5d55856 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Tue, 22 Oct 2024 20:11:38 +0200 Subject: [PATCH] [Gradle] Don't register 'sourceSets' container dynamically Before this change created via 'KotlinJvmFactory' 'AndroidProjectExtension' and 'JvmProjectExtension' instances are missing source sets container as it was added dynamically in the plugin. On the other hand, there are no use-cases to add such a container dynamically. ^KT-72467 Verification Pending --- .../api/external/kotlin-gradle-plugin.api | 2 +- .../gradle/dsl/KotlinProjectExtension.kt | 23 +++++++++++++------ .../gradle/plugin/KotlinPluginWrapper.kt | 13 ----------- .../gradle/unitTests/KotlinCompileApiTest.kt | 5 ++++ 4 files changed, 22 insertions(+), 21 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api b/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api index 0dbfa48c610d5..cd309527c64f8 100644 --- a/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api +++ b/libraries/tools/kotlin-gradle-plugin/api/external/kotlin-gradle-plugin.api @@ -298,7 +298,7 @@ public abstract class org/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtensi public static synthetic fun withSourcesJar$default (Lorg/jetbrains/kotlin/gradle/dsl/KotlinMultiplatformExtension;ZILjava/lang/Object;)V } -public class org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension : org/jetbrains/kotlin/gradle/dsl/KotlinBaseExtension, org/jetbrains/kotlin/gradle/plugin/HasProject, org/jetbrains/kotlin/tooling/core/HasMutableExtras { +public abstract class org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension : org/gradle/api/plugins/ExtensionAware, org/jetbrains/kotlin/gradle/dsl/KotlinBaseExtension, org/jetbrains/kotlin/gradle/plugin/HasProject, org/jetbrains/kotlin/tooling/core/HasMutableExtras { public field coreLibrariesVersion Ljava/lang/String; public fun (Lorg/gradle/api/Project;)V public fun explicitApi ()V diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt index cceeb3ce36385..114f815bb294f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension.kt @@ -5,11 +5,12 @@ package org.jetbrains.kotlin.gradle.dsl +import com.gradle.scan.agent.serialization.scan.serializer.kryo.it import org.gradle.api.Action import org.gradle.api.Named import org.gradle.api.NamedDomainObjectContainer import org.gradle.api.Project -import org.gradle.api.internal.plugins.DslObject +import org.gradle.api.plugins.ExtensionAware import org.gradle.api.provider.Property import org.gradle.jvm.toolchain.JavaLanguageVersion import org.gradle.jvm.toolchain.JavaToolchainSpec @@ -19,6 +20,7 @@ import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.CoroutineStart.Undispatched import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinWithJavaTarget +import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsTargetDsl import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrSingleTargetPreset import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon @@ -77,21 +79,28 @@ internal fun KotlinBaseExtension.explicitApiModeAsCompilerArg(): String? { } @KotlinGradlePluginPublicDsl -open class KotlinProjectExtension @Inject constructor( +abstract class KotlinProjectExtension @Inject constructor( override val project: Project ) : KotlinBaseExtension, HasMutableExtras, - HasProject { + HasProject, + ExtensionAware { override lateinit var coreLibrariesVersion: String final override val extras: MutableExtras = mutableExtrasOf() + private val sourceSetsContainer = project.objects.domainObjectContainer( + KotlinSourceSet::class.java, + DefaultKotlinSourceSetFactory(project) + ).also { kotlinSourceSets -> + // Required for Gradle to generate accessors to source sets or 'sourceSets {}' DSL + extensions.add("sourceSets", kotlinSourceSets) + } override var sourceSets: NamedDomainObjectContainer - @Suppress("UNCHECKED_CAST") - get() = DslObject(this).extensions.getByName("sourceSets") as NamedDomainObjectContainer - internal set(value) { - DslObject(this).extensions.add("sourceSets", value) + get() = sourceSetsContainer + @Deprecated("Assigning new value to 'sourceSets' is deprecated", level = DeprecationLevel.ERROR) + internal set(_) { } internal suspend fun awaitSourceSets(): NamedDomainObjectContainer { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 71cc8e1c73109..2da07bc579524 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -17,7 +17,6 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.GradleException -import org.gradle.api.NamedDomainObjectFactory import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.artifacts.ExternalDependency @@ -41,7 +40,6 @@ import org.jetbrains.kotlin.gradle.plugin.internal.* import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport.internal.initSwiftExportClasspathConfigurations import org.jetbrains.kotlin.gradle.plugin.mpp.resources.resolve.KotlinTargetResourcesResolutionStrategy -import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.plugin.statistics.BuildFusService import org.jetbrains.kotlin.gradle.report.BuildMetricsService import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilerAttribute @@ -195,9 +193,6 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() { abstract val pluginVariant: String - internal open fun kotlinSourceSetFactory(project: Project): NamedDomainObjectFactory = - DefaultKotlinSourceSetFactory(project) - override fun apply(project: Project) { super.apply(project) project.logger.info("Using Kotlin Gradle Plugin $pluginVariant variant") @@ -212,14 +207,6 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() { project.createKotlinExtension(projectExtensionClass).apply { coreLibrariesVersion = pluginVersion - - fun kotlinSourceSetContainer(factory: NamedDomainObjectFactory) = - project.container(KotlinSourceSet::class.java, factory) - - val topLevelExtension = project.topLevelExtension - if (topLevelExtension is KotlinProjectExtension) { - project.kotlinExtension.sourceSets = kotlinSourceSetContainer(kotlinSourceSetFactory(project)) - } } project.extensions.add(KotlinTestsRegistry.PROJECT_EXTENSION_NAME, createTestRegistry(project)) diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt index 92e65cb79f494..9c305d1e1c9ff 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinCompileApiTest.kt @@ -22,6 +22,7 @@ import org.junit.Test import org.junit.rules.TemporaryFolder import kotlin.test.assertEquals import kotlin.test.assertNotEquals +import kotlin.test.assertNotNull class KotlinCompileApiTest { @@ -199,6 +200,7 @@ class KotlinCompileApiTest { jvmExtension.compilerOptions.jvmTarget.set(JvmTarget.JVM_21) jvmExtension.compilerOptions.javaParameters.set(true) jvmExtension.explicitApi = ExplicitApiMode.Strict + jvmExtension.sourceSets.register("main") project.evaluate() @@ -208,6 +210,7 @@ class KotlinCompileApiTest { ExplicitApiMode.Strict, (jvmTask.get() as KotlinCompile).explicitApiMode.get() ) + assertNotNull(jvmExtension.sourceSets.findByName("main")) } @Test @@ -231,6 +234,7 @@ class KotlinCompileApiTest { androidExtension.compilerOptions.jvmTarget.set(JvmTarget.JVM_21) androidExtension.compilerOptions.javaParameters.set(true) androidExtension.explicitApi = ExplicitApiMode.Strict + androidExtension.sourceSets.register("main") project.evaluate() @@ -240,6 +244,7 @@ class KotlinCompileApiTest { ExplicitApiMode.Strict, (androidTask.get() as KotlinCompile).explicitApiMode.get() ) + assertNotNull(androidExtension.sourceSets.findByName("main")) } @Test