From a20fbf867f0b54662b6ff107a57235c6977ff9af Mon Sep 17 00:00:00 2001 From: Alexander Likhachev Date: Wed, 7 Sep 2022 17:14:38 +0200 Subject: [PATCH] [Gradle] Recreate KotlinPluginInMultipleProjectsHolder on each build #KT-50598 Fixed --- .../plugin/KotlinGradleBuildServices.kt | 80 +++++++++---------- .../KotlinPluginInMultipleProjectsHolder.kt | 3 - .../gradle/plugin/KotlinPluginWrapper.kt | 3 +- .../kotlin/gradle/utils/singleAction.kt | 3 + 4 files changed, 44 insertions(+), 45 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt index 73f76217cf5..d9c31ae0826 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinGradleBuildServices.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.plugin import org.gradle.api.Project +import org.gradle.api.invocation.Gradle import org.gradle.api.logging.Logging import org.gradle.api.provider.Provider import org.gradle.api.services.BuildService @@ -24,15 +25,43 @@ internal abstract class KotlinGradleBuildServices : BuildService = - project.gradle.sharedServices.registerIfAbsent( + private val CLASS_NAME = KotlinGradleBuildServices::class.java.simpleName + private val INIT_MESSAGE = "Initialized $CLASS_NAME" + private val DISPOSE_MESSAGE = "Disposed $CLASS_NAME" + + fun registerIfAbsent(gradle: Gradle): Provider = + gradle.sharedServices.registerIfAbsent( "kotlin-build-service-${KotlinGradleBuildServices::class.java.canonicalName}_${KotlinGradleBuildServices::class.java.classLoader.hashCode()}", KotlinGradleBuildServices::class.java ) { service -> - service.parameters.rootDir = project.rootProject.rootDir - service.parameters.buildDir = project.rootProject.buildDir - + service.parameters.rootDir = gradle.rootProject.rootDir + service.parameters.buildDir = gradle.rootProject.buildDir } - - - private val multipleProjectsHolder = KotlinPluginInMultipleProjectsHolder( - trackPluginVersionsSeparately = true - ) - - @Synchronized - internal fun detectKotlinPluginLoadedInMultipleProjects(project: Project, kotlinPluginVersion: String) { - val onRegister = { - project.gradle.taskGraph.whenReady { - if (multipleProjectsHolder.isInMultipleProjects(project, kotlinPluginVersion)) { - val loadedInProjects = multipleProjectsHolder.getAffectedProjects(project, kotlinPluginVersion)!! - if (PropertiesProvider(project).ignorePluginLoadedInMultipleProjects != true) { - project.logger.warn("\n$MULTIPLE_KOTLIN_PLUGINS_LOADED_WARNING") - project.logger.warn( - MULTIPLE_KOTLIN_PLUGINS_SPECIFIC_PROJECTS_WARNING + loadedInProjects.joinToString(limit = 4) { "'$it'" } - ) - } - project.logger.info( - "$MULTIPLE_KOTLIN_PLUGINS_SPECIFIC_PROJECTS_INFO: " + - loadedInProjects.joinToString { "'$it'" } - ) - } - } - } - - multipleProjectsHolder.addProject( - project, - kotlinPluginVersion, - onRegister - ) - } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginInMultipleProjectsHolder.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginInMultipleProjectsHolder.kt index 539440077ca..82160d47d8d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginInMultipleProjectsHolder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginInMultipleProjectsHolder.kt @@ -11,9 +11,6 @@ import org.gradle.api.plugins.ExtraPropertiesExtension internal class KotlinPluginInMultipleProjectsHolder( private val trackPluginVersionsSeparately: Boolean ) { - // Storing this property here might be considered the reason - // why the corresponding warning message is just shown in the first build - // https://youtrack.jetbrains.com/issue/KT-50598 private var loadedInProjectPath: String? = null fun addProject( diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 1f83d929342..bec8a5fef90 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -88,8 +88,7 @@ abstract class DefaultKotlinBasePlugin : KotlinBasePlugin { addGradlePluginMetadataAttributes(project) } - KotlinGradleBuildServices.registerIfAbsent(project).get() - KotlinGradleBuildServices.detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion) + KotlinGradleBuildServices.registerIfAbsent(project.gradle).get().detectKotlinPluginLoadedInMultipleProjects(project, kotlinPluginVersion) BuildMetricsService.registerIfAbsent(project)?.also { BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry.onTaskCompletion(it) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/singleAction.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/singleAction.kt index 77653e56325..3cb89d0c24c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/singleAction.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/utils/singleAction.kt @@ -22,14 +22,17 @@ internal abstract class SingleAction { } } +// Warning: if KGP is loaded multiple times by different classloaders, actions may be executed more than once internal object SingleActionPerBuild : SingleAction() { override fun selectKey(project: Project): Project = project.rootProject } +// Warning: if KGP is loaded multiple times by different classloaders, actions may be executed more than once internal object SingleActionPerProject : SingleAction() { override fun selectKey(project: Project) = project } +// Warning: if KGP is loaded multiple times by different classloaders, messages may be shown more than once internal object SingleWarningPerBuild { private const val ACTION_ID_SHOW_WARNING = "show-warning:"