[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) }
)
applyUserDefinedAttributes(target)
rewriteMppDependenciesInPom(target)
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.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) }
@@ -50,8 +50,6 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
project.registerKotlinArtifactsExtension()
configurePublishingWithMavenPublish(project)
kotlinMultiplatformExtension.targets.withType(InternalKotlinTarget::class.java).all { applyUserDefinedAttributes(it) }
}
@@ -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)
}
@@ -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
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
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")
}
}