From 9ca22fa999f73dc48d066f6348039c7f35947397 Mon Sep 17 00:00:00 2001 From: Sebastian Sellmair Date: Mon, 16 Oct 2023 18:45:44 +0200 Subject: [PATCH] [Gradle] Implement GlobalProjectStructureMetadataStorageSetupAction KT-61634 --- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 16 --------------- .../mpp/KotlinProjectStructureMetadata.kt | 20 +++++++++++++++---- .../plugin/registerKotlinPluginExtensions.kt | 2 ++ 3 files changed, 18 insertions(+), 20 deletions(-) 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 faff987fea6..b48f498d96e 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 @@ -64,24 +64,8 @@ class KotlinMultiplatformPlugin : Plugin { project.setupGeneralKotlinExtensionParameters() project.pluginManager.apply(ScriptingGradleSubplugin::class.java) - - exportProjectStructureMetadataForOtherBuilds(kotlinMultiplatformExtension) } - private fun exportProjectStructureMetadataForOtherBuilds( - extension: KotlinMultiplatformExtension, - ) { - // Run in AfterEvaluate stage to avoid issues with Precompiled Script Plugins - // When Gradle runs `:generatePrecompiledScriptPluginAccessors` it creates dummy project and - // applies plugins from *.gradle.kts file to and generates accessors from it. - // These dummy projects never gets evaluated and should not expose any Project Structure Metadata. - // Putting registerProjectStructureMetadata in AfterEvaluate stage prevents PSM registration in dummy projects. - extension.project.launchInStage(AfterEvaluateBuildscript) { - GlobalProjectStructureMetadataStorage.registerProjectStructureMetadata(extension.project) { - extension.kotlinProjectStructureMetadata - } - } - } private fun setupAdditionalCompilerArguments(project: Project) { // common source sets use the compiler options from the metadata compilation: diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt index 0a573b7b8e7..2708fa0f46d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinProjectStructureMetadata.kt @@ -15,6 +15,10 @@ import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.Nested import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle +import org.jetbrains.kotlin.gradle.plugin.KotlinProjectSetupCoroutine +import org.jetbrains.kotlin.gradle.plugin.await import org.jetbrains.kotlin.gradle.plugin.sources.KotlinDependencyScope import org.jetbrains.kotlin.gradle.plugin.sources.sourceSetDependencyConfigurationByScope import org.jetbrains.kotlin.gradle.targets.metadata.dependsOnClosureWithInterCompilationDependencies @@ -22,10 +26,6 @@ import org.jetbrains.kotlin.gradle.targets.metadata.getPublishedPlatformCompilat import org.jetbrains.kotlin.gradle.targets.metadata.isNativeSourceSet import org.jetbrains.kotlin.gradle.targets.native.internal.CInteropCommonizerCompositeMetadataJarBundling.cinteropMetadataDirectoryPath import org.jetbrains.kotlin.gradle.utils.* -import org.jetbrains.kotlin.gradle.utils.buildPathCompat -import org.jetbrains.kotlin.gradle.utils.compositeBuildRootProject -import org.jetbrains.kotlin.gradle.utils.currentBuildId -import org.jetbrains.kotlin.gradle.utils.future import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.Node @@ -388,6 +388,18 @@ internal fun parseKotlinSourceSetMetadata( ) } +internal val GlobalProjectStructureMetadataStorageSetupAction = KotlinProjectSetupCoroutine { + // Run in AfterEvaluate stage to avoid issues with Precompiled Script Plugins + // When Gradle runs `:generatePrecompiledScriptPluginAccessors` it creates dummy project and + // applies plugins from *.gradle.kts file to and generates accessors from it. + // These dummy projects never gets evaluated and should not expose any Project Structure Metadata. + // Putting registerProjectStructureMetadata in AfterEvaluate stage prevents PSM registration in dummy projects. + KotlinPluginLifecycle.Stage.AfterEvaluateBuildscript.await() + GlobalProjectStructureMetadataStorage.registerProjectStructureMetadata(project) { + multiplatformExtension.kotlinProjectStructureMetadata + } +} + internal object GlobalProjectStructureMetadataStorage { private const val propertyPrefix = "kotlin.projectStructureMetadata.build" 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 835d162bb09..6590dd0424b 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 @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.UnusedSourceSetsC import org.jetbrains.kotlin.gradle.plugin.diagnostics.checkers.WasmSourceSetsNotFoundChecker 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.apple.AddBuildListenerForXCodeSetupAction import org.jetbrains.kotlin.gradle.targets.js.npm.AddNpmDependencyExtensionProjectSetupAction import org.jetbrains.kotlin.gradle.targets.native.CreateFatFrameworksSetupAction @@ -46,6 +47,7 @@ internal fun Project.registerKotlinPluginExtensions() { register(project, KotlinToolingDiagnosticsSetupAction) if (isMultiplatform) { + register(project, GlobalProjectStructureMetadataStorageSetupAction) register(project, IdeMultiplatformImportSetupAction) register(project, IdeResolveDependenciesTaskSetupAction) register(project, CInteropCommonizedCInteropApiElementsConfigurationsSetupAction)