[Gradle] Implement UserDefinedAttributesSetupAction

KT-61634
This commit is contained in:
Sebastian Sellmair
2023-10-17 09:41:25 +02:00
committed by Space Team
parent c22a7bf802
commit 822cb7f545
6 changed files with 24 additions and 10 deletions
@@ -62,8 +62,6 @@ internal abstract class AbstractKotlinPlugin(
{ compilation -> buildSourceSetProcessor(project, compilation) } { compilation -> buildSourceSetProcessor(project, compilation) }
) )
applyUserDefinedAttributes(target)
rewriteMppDependenciesInPom(target) rewriteMppDependenciesInPom(target)
configureProjectGlobalSettings(project) configureProjectGlobalSettings(project)
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder import org.jetbrains.kotlin.gradle.model.builder.KotlinModelBuilder
import org.jetbrains.kotlin.gradle.plugin.KotlinJvmPlugin.Companion.configureCompilerOptionsForTarget import org.jetbrains.kotlin.gradle.plugin.KotlinJvmPlugin.Companion.configureCompilerOptionsForTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinAndroidTarget 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.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.utils.whenEvaluated import org.jetbrains.kotlin.gradle.utils.whenEvaluated
import org.jetbrains.kotlin.gradle.utils.androidPluginIds import org.jetbrains.kotlin.gradle.utils.androidPluginIds
@@ -55,7 +54,6 @@ internal open class KotlinAndroidPlugin(
} }
} }
) { androidTarget -> ) { androidTarget ->
applyUserDefinedAttributes(androidTarget)
customizeKotlinDependencies(project) customizeKotlinDependencies(project)
registry.register(KotlinModelBuilder(project.getKotlinPluginVersion(), androidTarget)) registry.register(KotlinModelBuilder(project.getKotlinPluginVersion(), androidTarget))
project.whenEvaluated { project.components.addAll(androidTarget.components) } project.whenEvaluated { project.components.addAll(androidTarget.components) }
@@ -50,8 +50,6 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
project.registerKotlinArtifactsExtension() project.registerKotlinArtifactsExtension()
configurePublishingWithMavenPublish(project) configurePublishingWithMavenPublish(project)
kotlinMultiplatformExtension.targets.withType(InternalKotlinTarget::class.java).all { applyUserDefinedAttributes(it) }
} }
@@ -5,10 +5,15 @@
package org.jetbrains.kotlin.gradle.plugin.mpp 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.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript 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.plugin.launchInStage
import org.jetbrains.kotlin.gradle.utils.copyAttributes 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) * 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 * 2. Resolvable configurations of each compilation need the compilation's attributes
*/ */
internal fun applyUserDefinedAttributes(target: InternalKotlinTarget) { internal val UserDefinedAttributesSetupAction = KotlinProjectSetupCoroutine {
target.project.launchInStage(AfterEvaluateBuildscript) { AfterEvaluateBuildscript.await()
target.kotlinComponents.flatMap { it.internal.usages }.forEach { usage -> kotlinExtension.forAllTargets { target ->
target.internal.kotlinComponents.flatMap { it.internal.usages }.forEach { usage ->
val dependencyConfiguration = target.project.configurations.findByName(usage.dependencyConfigurationName) ?: return@forEach val dependencyConfiguration = target.project.configurations.findByName(usage.dependencyConfigurationName) ?: return@forEach
copyAttributes(usage.compilation.attributes, dependencyConfiguration.attributes) copyAttributes(usage.compilation.attributes, dependencyConfiguration.attributes)
} }
@@ -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.ide.IdeResolveDependenciesTaskSetupAction
import org.jetbrains.kotlin.gradle.plugin.mpp.GlobalProjectStructureMetadataStorageSetupAction import org.jetbrains.kotlin.gradle.plugin.mpp.GlobalProjectStructureMetadataStorageSetupAction
import org.jetbrains.kotlin.gradle.plugin.mpp.SyncLanguageSettingsWithKotlinExtensionSetupAction 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.mpp.apple.AddBuildListenerForXCodeSetupAction
import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction import org.jetbrains.kotlin.gradle.plugin.sources.LanguageSettingsSetupAction
import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubpluginSetupAction import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubpluginSetupAction
@@ -50,6 +51,8 @@ internal fun Project.registerKotlinPluginExtensions() {
register(project, RegisterBuildKotlinToolingMetadataTask) register(project, RegisterBuildKotlinToolingMetadataTask)
register(project, KotlinToolingDiagnosticsSetupAction) register(project, KotlinToolingDiagnosticsSetupAction)
register(project, SyncLanguageSettingsWithKotlinExtensionSetupAction) register(project, SyncLanguageSettingsWithKotlinExtensionSetupAction)
register(project, UserDefinedAttributesSetupAction)
if (isJvm || isMultiplatform) { if (isJvm || isMultiplatform) {
register(project, ScriptingGradleSubpluginSetupAction) register(project, ScriptingGradleSubpluginSetupAction)
@@ -100,3 +103,5 @@ private val Project.isMultiplatform get() = multiplatformExtensionOrNull != null
private val Project.isJvm get() = kotlinJvmExtensionOrNull != null private val Project.isJvm get() = kotlinJvmExtensionOrNull != null
private val Project.isJs get() = kotlinExtensionOrNull is KotlinJsProjectExtension private val Project.isJs get() = kotlinExtensionOrNull is KotlinJsProjectExtension
private val Project.isAndroid get() = kotlinExtension is KotlinAndroidProjectExtension
@@ -16,3 +16,12 @@ internal val KotlinProjectExtension.targets: Iterable<KotlinTarget>
is KotlinMultiplatformExtension -> targets is KotlinMultiplatformExtension -> targets
else -> error("Unexpected 'kotlin' extension $this") 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")
}
}