[Gradle] Allow using KotlinToolingDiagnosticsCollector in transform actions

Related to KT-56832
This commit is contained in:
Alexander.Likhachev
2023-08-24 20:15:34 +02:00
committed by Space Team
parent e6ae3f1d85
commit 271d767138
3 changed files with 44 additions and 1 deletions
@@ -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<BuildSe
}
}
fun report(transform: TransformActionUsingKotlinToolingDiagnostics<*>, 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)
@@ -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<String>,
val suppressedErrorIds: List<String>,
val showStacktrace: Boolean,
) {
) : Serializable {
companion object {
fun forProject(project: Project): ToolingDiagnosticRenderingOptions {
return with(project.kotlinPropertiesProvider) {
@@ -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<P : TransformActionUsingKotlinToolingDiagnostics.Parameters> :
TransformAction<P> {
interface Parameters : TransformParameters {
@get:Internal
val toolingDiagnosticsCollector: Property<KotlinToolingDiagnosticsCollector>
@get:Internal
val diagnosticRenderingOptions: Property<ToolingDiagnosticRenderingOptions>
}
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<out TransformActionUsingKotlinToolingDiagnostics.Parameters>.setupTransformActionToolingDiagnostics(project: Project) {
parameters.toolingDiagnosticsCollector.set(project.kotlinToolingDiagnosticsCollectorProvider)
parameters.diagnosticRenderingOptions.set(ToolingDiagnosticRenderingOptions.forProject(project))
}