From c22a7bf80247176fed54c855132e0f6437a65a3d Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Tue, 17 Oct 2023 09:27:41 +0200 Subject: [PATCH] [Gradle] Implement LanguageSettingsSetupAction KT-61634 --- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 57 ++----------------- .../plugin/registerKotlinPluginExtensions.kt | 2 + .../sources/LanguageSettingsSetupAction.kt | 50 ++++++++++++++++ 3 files changed, 57 insertions(+), 52 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/LanguageSettingsSetupAction.kt 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 0eea8672c47..ad9d1f41e1f 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 @@ -8,25 +8,19 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.JavaBasePlugin -import org.jetbrains.kotlin.gradle.dsl.* +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.targetFromPresetInternal import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies -import org.jetbrains.kotlin.gradle.plugin.* -import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript -import org.jetbrains.kotlin.gradle.plugin.hierarchy.orNull +import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet import org.jetbrains.kotlin.gradle.plugin.hierarchy.setupDefaultKotlinHierarchy -import org.jetbrains.kotlin.gradle.plugin.ide.kotlinIdeMultiplatformImport -import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName +import org.jetbrains.kotlin.gradle.plugin.launch import org.jetbrains.kotlin.gradle.plugin.mpp.internal.runDeprecationDiagnostics -import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder -import org.jetbrains.kotlin.gradle.plugin.sources.awaitPlatformCompilations -import org.jetbrains.kotlin.gradle.plugin.sources.internal import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService -import org.jetbrains.kotlin.gradle.scripting.internal.ScriptingGradleSubplugin import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTargetPreset import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinWasmTargetPreset import org.jetbrains.kotlin.gradle.targets.native.tasks.artifact.registerKotlinArtifactsExtension -import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget.* @@ -58,50 +52,9 @@ class KotlinMultiplatformPlugin : Plugin { configurePublishingWithMavenPublish(project) kotlinMultiplatformExtension.targets.withType(InternalKotlinTarget::class.java).all { applyUserDefinedAttributes(it) } - - // propagate compiler plugin options to the source set language settings - setupAdditionalCompilerArguments(project) } - private fun setupAdditionalCompilerArguments(project: Project) { - // common source sets use the compiler options from the metadata compilation: - val metadataCompilation = - project.multiplatformExtension.metadata().compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) - - val primaryCompilationsBySourceSet by lazy { // don't evaluate eagerly: Android targets are not created at this point - val allCompilationsForSourceSets = project.multiplatformExtension.sourceSets.associateWith { sourceSet -> - sourceSet.internal.compilations.filter { compilation -> compilation.target.platformType != KotlinPlatformType.common } - } - - allCompilationsForSourceSets.mapValues { (_, compilations) -> // choose one primary compilation - when (compilations.size) { - 0 -> metadataCompilation - 1 -> compilations.single() - else -> { - val sourceSetTargets = compilations.map { it.target }.distinct() - when (sourceSetTargets.size) { - 1 -> sourceSetTargets.single().compilations.findByName(KotlinCompilation.MAIN_COMPILATION_NAME) - ?: // use any of the compilations for now, looks OK for Android TODO maybe reconsider - compilations.first() - - else -> metadataCompilation - } - } - } - } - } - - project.kotlinExtension.sourceSets.all { sourceSet -> - (sourceSet.languageSettings as? DefaultLanguageSettingsBuilder)?.run { - compilerPluginOptionsTask = lazy { - val associatedCompilation = primaryCompilationsBySourceSet[sourceSet] ?: metadataCompilation - project.tasks.getByName(associatedCompilation.compileKotlinTaskName) as AbstractKotlinCompileTool<*> - } - } - } - } - fun setupDefaultPresets(project: Project) { with(project.multiplatformExtension.presets) { add(KotlinJvmTargetPreset(project)) 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 b3311062187..a63b1bdde52 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 @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.gradle.plugin.ide.IdeResolveDependenciesTaskSetupAct import org.jetbrains.kotlin.gradle.plugin.mpp.GlobalProjectStructureMetadataStorageSetupAction import org.jetbrains.kotlin.gradle.plugin.mpp.SyncLanguageSettingsWithKotlinExtensionSetupAction 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 import org.jetbrains.kotlin.gradle.targets.js.npm.AddNpmDependencyExtensionProjectSetupAction import org.jetbrains.kotlin.gradle.targets.native.CreateFatFrameworksSetupAction @@ -55,6 +56,7 @@ internal fun Project.registerKotlinPluginExtensions() { } if (isMultiplatform) { + register(project, LanguageSettingsSetupAction) register(project, GlobalProjectStructureMetadataStorageSetupAction) register(project, IdeMultiplatformImportSetupAction) register(project, IdeResolveDependenciesTaskSetupAction) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/LanguageSettingsSetupAction.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/LanguageSettingsSetupAction.kt new file mode 100644 index 00000000000..236357a2ea4 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/sources/LanguageSettingsSetupAction.kt @@ -0,0 +1,50 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.plugin.sources + +import org.jetbrains.kotlin.gradle.dsl.kotlinExtension +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType +import org.jetbrains.kotlin.gradle.plugin.KotlinProjectSetupAction +import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompileTool + +internal val LanguageSettingsSetupAction = KotlinProjectSetupAction { + // common source sets use the compiler options from the metadata compilation: + val metadataCompilation = multiplatformExtension.metadata().compilations.getByName(KotlinCompilation.MAIN_COMPILATION_NAME) + + val primaryCompilationsBySourceSet by lazy { // don't evaluate eagerly: Android targets are not created at this point + val allCompilationsForSourceSets = project.multiplatformExtension.sourceSets.associateWith { sourceSet -> + sourceSet.internal.compilations.filter { compilation -> compilation.target.platformType != KotlinPlatformType.common } + } + + allCompilationsForSourceSets.mapValues { (_, compilations) -> // choose one primary compilation + when (compilations.size) { + 0 -> metadataCompilation + 1 -> compilations.single() + else -> { + val sourceSetTargets = compilations.map { it.target }.distinct() + when (sourceSetTargets.size) { + 1 -> sourceSetTargets.single().compilations.findByName(KotlinCompilation.MAIN_COMPILATION_NAME) + ?: // use any of the compilations for now, looks OK for Android TODO maybe reconsider + compilations.first() + + else -> metadataCompilation + } + } + } + } + } + + project.kotlinExtension.sourceSets.all { sourceSet -> + (sourceSet.languageSettings as? DefaultLanguageSettingsBuilder)?.run { + compilerPluginOptionsTask = lazy { + val associatedCompilation = primaryCompilationsBySourceSet[sourceSet] ?: metadataCompilation + project.tasks.getByName(associatedCompilation.compileKotlinTaskName) as AbstractKotlinCompileTool<*> + } + } + } +} \ No newline at end of file