From 822cb7f545e475da4d3cb9b2cc3a9872c6cc0a36 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 17 Oct 2023 09:41:25 +0200 Subject: [PATCH] [Gradle] Implement UserDefinedAttributesSetupAction KT-61634 --- .../kotlin/gradle/plugin/AbstractKotlinPlugin.kt | 2 -- .../kotlin/gradle/plugin/KotlinAndroidPlugin.kt | 2 -- .../gradle/plugin/mpp/KotlinMultiplatformPlugin.kt | 2 -- .../gradle/plugin/mpp/applyUserDefinedAttributes.kt | 12 +++++++++--- .../gradle/plugin/registerKotlinPluginExtensions.kt | 7 ++++++- .../kotlin/gradle/utils/kotlinExtensionUtils.kt | 9 +++++++++ 6 files changed, 24 insertions(+), 10 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt index 89f34e06cfe..8a86291ee2b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/AbstractKotlinPlugin.kt @@ -62,8 +62,6 @@ internal abstract class AbstractKotlinPlugin( { compilation -> buildSourceSetProcessor(project, compilation) } ) - applyUserDefinedAttributes(target) - rewriteMppDependenciesInPom(target) configureProjectGlobalSettings(project) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt index 07a66b6eb6b..3ed0beeead0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinAndroidPlugin.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder import org.jetbrains.kotlin.gradle.plugin.KotlinJvmPlugin.Companion.configureCompilerOptionsForTarget import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget -import org.jetbrains.kotlin.gradle.plugin.mpp.applyUserDefinedAttributes import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider import org.jetbrains.kotlin.gradle.utils.whenEvaluated import org.jetbrains.kotlin.gradle.utils.androidPluginIds @@ -55,7 +54,6 @@ internal open class KotlinAndroidPlugin( } } ) { androidTarget -> - applyUserDefinedAttributes(androidTarget) customizeKotlinDependencies(project) registry.register(KotlinModelBuilder(project.getKotlinPluginVersion(), androidTarget)) project.whenEvaluated { project.components.addAll(androidTarget.components) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index ad9d1f41e1f..9bdea4d1f35 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -50,8 +50,6 @@ class KotlinMultiplatformPlugin : Plugin { project.registerKotlinArtifactsExtension() configurePublishingWithMavenPublish(project) - - kotlinMultiplatformExtension.targets.withType(InternalKotlinTarget::class.java).all { applyUserDefinedAttributes(it) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt index 739ba9e9356..0adf9da513c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/applyUserDefinedAttributes.kt @@ -5,10 +5,15 @@ package org.jetbrains.kotlin.gradle.plugin.mpp +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript +import org.jetbrains.kotlin.gradle.plugin.KotlinProjectSetupCoroutine +import org.jetbrains.kotlin.gradle.plugin.await import org.jetbrains.kotlin.gradle.plugin.launchInStage import org.jetbrains.kotlin.gradle.utils.copyAttributes +import org.jetbrains.kotlin.gradle.utils.forAllTargets +import org.jetbrains.kotlin.gradle.utils.targets /** @@ -16,9 +21,10 @@ import org.jetbrains.kotlin.gradle.utils.copyAttributes * 1. Output configurations of each target need the corresponding compilation's attributes (and, indirectly, the target's attributes) * 2. Resolvable configurations of each compilation need the compilation's attributes */ -internal fun applyUserDefinedAttributes(target: InternalKotlinTarget) { - target.project.launchInStage(AfterEvaluateBuildscript) { - target.kotlinComponents.flatMap { it.internal.usages }.forEach { usage -> +internal val UserDefinedAttributesSetupAction = KotlinProjectSetupCoroutine { + AfterEvaluateBuildscript.await() + kotlinExtension.forAllTargets { target -> + target.internal.kotlinComponents.flatMap { it.internal.usages }.forEach { usage -> val dependencyConfiguration = target.project.configurations.findByName(usage.dependencyConfigurationName) ?: return@forEach copyAttributes(usage.compilation.attributes, dependencyConfiguration.attributes) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt index a63b1bdde52..4c41ff0511c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/registerKotlinPluginExtensions.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeMultiplatformImportSetupAction import org.jetbrains.kotlin.gradle.plugin.ide.IdeResolveDependenciesTaskSetupAction import org.jetbrains.kotlin.gradle.plugin.mpp.GlobalProjectStructureMetadataStorageSetupAction import org.jetbrains.kotlin.gradle.plugin.mpp.SyncLanguageSettingsWithKotlinExtensionSetupAction +import org.jetbrains.kotlin.gradle.plugin.mpp.UserDefinedAttributesSetupAction import org.jetbrains.kotlin.gradle.plugin.mpp.apple.AddBuildListenerForXCodeSetupAction import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubpluginSetupAction @@ -50,6 +51,8 @@ internal fun Project.registerKotlinPluginExtensions() { register(project, RegisterBuildKotlinToolingMetadataTask) register(project, KotlinToolingDiagnosticsSetupAction) register(project, SyncLanguageSettingsWithKotlinExtensionSetupAction) + register(project, UserDefinedAttributesSetupAction) + if (isJvm || isMultiplatform) { register(project, ScriptingGradleSubpluginSetupAction) @@ -99,4 +102,6 @@ private val Project.isMultiplatform get() = multiplatformExtensionOrNull != null private val Project.isJvm get() = kotlinJvmExtensionOrNull != null -private val Project.isJs get() = kotlinExtensionOrNull is KotlinJsProjectExtension \ No newline at end of file +private val Project.isJs get() = kotlinExtensionOrNull is KotlinJsProjectExtension + +private val Project.isAndroid get() = kotlinExtension is KotlinAndroidProjectExtension \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/kotlinExtensionUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/kotlinExtensionUtils.kt index 65565732af5..b3887287c46 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/kotlinExtensionUtils.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/kotlinExtensionUtils.kt @@ -16,3 +16,12 @@ internal val KotlinProjectExtension.targets: Iterable is KotlinMultiplatformExtension -> targets else -> error("Unexpected 'kotlin' extension $this") } + + +internal fun KotlinProjectExtension.forAllTargets(action: (target: KotlinTarget) -> Unit) { + when (this) { + is KotlinSingleTargetExtension<*> -> action(this.target) + is KotlinMultiplatformExtension -> targets.all(action) + else -> error("Unexpected 'kotlin' extension $this") + } +} \ No newline at end of file