From 271d7671389b9c2525b8fda9a15b6c5289abc29b Mon Sep 17 00:00:00 2001 From: "Alexander.Likhachev" Date: Thu, 24 Aug 2023 20:15:34 +0200 Subject: [PATCH] [Gradle] Allow using `KotlinToolingDiagnosticsCollector` in transform actions Related to KT-56832 --- .../KotlinToolingDiagnosticsCollector.kt | 8 +++++ .../ToolingDiagnosticRenderingOptions.kt | 3 +- .../UsesKotlinToolingDiagnostics.kt | 34 +++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnosticsCollector.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnosticsCollector.kt index 7c50c26df76..181027abc7c 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnosticsCollector.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/KotlinToolingDiagnosticsCollector.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics import org.gradle.api.Project +import org.gradle.api.logging.Logger import org.gradle.api.provider.Provider import org.gradle.api.services.BuildService import org.gradle.api.services.BuildServiceParameters @@ -42,6 +43,13 @@ internal abstract class KotlinToolingDiagnosticsCollector : BuildService, logger: Logger, diagnostic: ToolingDiagnostic) { + val options = transform.parameters.diagnosticRenderingOptions.get() + if (!diagnostic.isSuppressed(options)) { + renderReportedDiagnostic(diagnostic, logger, options) + } + } + fun reportOncePerGradleProject(fromProject: Project, diagnostic: ToolingDiagnostic, key: ToolingDiagnosticId = diagnostic.id) { if (reportedIds.add("${fromProject.path}#$key")) { handleDiagnostic(fromProject, diagnostic) diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnosticRenderingOptions.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnosticRenderingOptions.kt index dd2edf05618..abd24f249fb 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnosticRenderingOptions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/ToolingDiagnosticRenderingOptions.kt @@ -9,13 +9,14 @@ import org.gradle.api.Project import org.gradle.api.logging.configuration.ShowStacktrace import org.jetbrains.kotlin.gradle.internal.isInIdeaSync import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider +import java.io.Serializable internal class ToolingDiagnosticRenderingOptions( val useParsableFormat: Boolean, val suppressedWarningIds: List, val suppressedErrorIds: List, val showStacktrace: Boolean, -) { +) : Serializable { companion object { fun forProject(project: Project): ToolingDiagnosticRenderingOptions { return with(project.kotlinPropertiesProvider) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/UsesKotlinToolingDiagnostics.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/UsesKotlinToolingDiagnostics.kt index 0b359540a77..0663dc5cea3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/UsesKotlinToolingDiagnostics.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/diagnostics/UsesKotlinToolingDiagnostics.kt @@ -5,7 +5,13 @@ package org.jetbrains.kotlin.gradle.plugin.diagnostics +import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.artifacts.transform.TransformAction +import org.gradle.api.artifacts.transform.TransformParameters +import org.gradle.api.artifacts.transform.TransformSpec +import org.gradle.api.logging.Logger +import org.gradle.api.logging.Logging import org.gradle.api.provider.Property import org.gradle.api.tasks.Internal @@ -20,3 +26,31 @@ internal interface UsesKotlinToolingDiagnostics : Task { toolingDiagnosticsCollector.get().report(this, diagnostic) } } + +/** + * Use this interface to make your [TransformAction] able to report [ToolingDiagnostic]. + * You must use [setupTransformActionToolingDiagnostics] to set up [TransformActionUsingKotlinToolingDiagnostics.Parameters]. + */ +internal interface TransformActionUsingKotlinToolingDiagnostics

: + TransformAction

{ + interface Parameters : TransformParameters { + @get:Internal + val toolingDiagnosticsCollector: Property + + @get:Internal + val diagnosticRenderingOptions: Property + } + + fun reportDiagnostic(diagnostic: ToolingDiagnostic) { + parameters.toolingDiagnosticsCollector.get().report(this, logger, diagnostic) + } + + companion object { + internal val logger: Logger = Logging.getLogger(Project::class.java) + } +} + +internal fun TransformSpec.setupTransformActionToolingDiagnostics(project: Project) { + parameters.toolingDiagnosticsCollector.set(project.kotlinToolingDiagnosticsCollectorProvider) + parameters.diagnosticRenderingOptions.set(ToolingDiagnosticRenderingOptions.forProject(project)) +} \ No newline at end of file