[Gradle] Support suppressing KGP diagnostics

This commit is contained in:
Dmitry Savvinov
2023-04-19 12:12:04 +02:00
committed by Space Team
parent f5c4dffc3e
commit c5bda2f63c
5 changed files with 63 additions and 5 deletions
@@ -530,6 +530,12 @@ internal class PropertiesProvider private constructor(private val project: Proje
val internalVerboseDiagnostics: Boolean
get() = booleanProperty(KOTLIN_INTERNAL_VERBOSE_DIAGNOSTICS) ?: false
val suppressedGradlePluginWarnings: List<String>
get() = property(PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS)?.split(",").orEmpty()
val suppressedGradlePluginErrors: List<String>
get() = property(PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_ERRORS)?.split(",").orEmpty()
/**
* Retrieves a comma-separated list of browsers to use when running karma tests for [target]
* @see KOTLIN_JS_KARMA_BROWSERS
@@ -620,6 +626,8 @@ internal class PropertiesProvider private constructor(private val project: Proje
const val KOTLIN_MPP_ALLOW_LEGACY_DEPENDENCIES = "kotlin.mpp.allow.legacy.dependencies"
const val KOTLIN_EXPERIMENTAL_TRY_K2 = "kotlin.experimental.tryK2"
const val KOTLIN_INTERNAL_VERBOSE_DIAGNOSTICS = "kotlin.internal.verboseDiagnostics"
const val KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS = "kotlin.suppressGradlePluginWarnings"
const val KOTLIN_SUPPRESS_GRADLE_PLUGIN_ERRORS = "kotlin.internal.suppressGradlePluginErrors"
}
companion object {
@@ -9,6 +9,9 @@ import org.gradle.api.InvalidUserCodeException
import org.gradle.api.Project
import org.gradle.api.services.BuildService
import org.gradle.api.services.BuildServiceParameters
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.ERROR
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.WARNING
import org.jetbrains.kotlin.gradle.utils.registerClassLoaderScopedBuildService
import java.util.*
import java.util.concurrent.ConcurrentHashMap
@@ -17,11 +20,20 @@ private typealias ToolingDiagnosticId = String
private typealias GradleProjectPath = String
internal abstract class KotlinToolingDiagnosticsCollector : BuildService<BuildServiceParameters.None> {
private val diagnosticsFromProject: MutableMap<GradleProjectPath, MutableList<ToolingDiagnostic>> = ConcurrentHashMap()
private val rawDiagnosticsFromProject: MutableMap<GradleProjectPath, MutableList<ToolingDiagnostic>> = ConcurrentHashMap()
private val reportedIds: MutableSet<ToolingDiagnosticId> = Collections.newSetFromMap(ConcurrentHashMap())
fun getDiagnosticsForProject(project: Project): Collection<ToolingDiagnostic> = diagnosticsFromProject[project.path].orEmpty()
fun getAllDiagnostics(): Collection<ToolingDiagnostic> = diagnosticsFromProject.values.flatten()
fun getDiagnosticsForProject(project: Project): Collection<ToolingDiagnostic> {
val rawDiagnostics = rawDiagnosticsFromProject[project.path] ?: return emptyList()
val suppressedWarnings = project.kotlinPropertiesProvider.suppressedGradlePluginWarnings.toSet()
val suppressedErrors = project.kotlinPropertiesProvider.suppressedGradlePluginErrors.toSet()
fun ToolingDiagnostic.isSuppressed(): Boolean =
severity == WARNING && id in suppressedWarnings || severity == ERROR && id in suppressedErrors
return rawDiagnostics.filter { !it.isSuppressed() }
}
fun report(project: Project, diagnostic: ToolingDiagnostic) {
saveDiagnostic(project, diagnostic)
@@ -43,7 +55,7 @@ internal abstract class KotlinToolingDiagnosticsCollector : BuildService<BuildSe
if (diagnostic.severity == ToolingDiagnostic.Severity.FATAL) {
throw InvalidUserCodeException(diagnostic.message)
}
diagnosticsFromProject.compute(project.path) { _, previousListIfAny ->
rawDiagnosticsFromProject.compute(project.path) { _, previousListIfAny ->
previousListIfAny?.apply { add(diagnostic) } ?: mutableListOf(diagnostic)
}
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.diagnosticsTests
import org.gradle.api.Project
import org.gradle.api.internal.project.ProjectInternal
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.*
import org.jetbrains.kotlin.gradle.util.applyKotlinJvmPlugin
import org.jetbrains.kotlin.gradle.util.buildProject
@@ -15,6 +16,7 @@ import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.ERROR
import org.jetbrains.kotlin.gradle.plugin.diagnostics.ToolingDiagnostic.Severity.WARNING
import org.jetbrains.kotlin.gradle.plugin.extraProperties
import org.junit.Test
class DiagnosticsReportingFunctionalTest {
@@ -112,6 +114,39 @@ class DiagnosticsReportingFunctionalTest {
root.checkDiagnostics("oncePerProjectAndOncePerBuildAreEquivalentForRoot")
}
@Test
fun testSuppressedWarnings() {
buildProject().run {
applyKotlinJvmPlugin()
extraProperties.set(PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS, "TEST_DIAGNOSTIC")
reportTestDiagnostic()
evaluate()
checkDiagnostics("suppressedWarnings")
}
}
@Test
fun testSuppressedErrors() {
buildProject().run {
applyKotlinJvmPlugin()
extraProperties.set(PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_ERRORS, "TEST_DIAGNOSTIC")
reportTestDiagnostic(severity = ERROR)
evaluate()
checkDiagnostics("suppressedErrors")
}
}
@Test
fun testSuppressForWarningsDoesntWorkForErrors() {
buildProject().run {
applyKotlinJvmPlugin()
extraProperties.set(PropertiesProvider.PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS, "TEST_DIAGNOSTIC")
reportTestDiagnostic(severity = ERROR)
evaluate()
checkDiagnostics("suppressForWarningsDoesntWorkForErrors")
}
}
}
private fun buildProjectWithMockedCheckers(
@@ -316,7 +316,7 @@ class KotlinMultiplatformAndroidGradlePluginCompatibilityHealthCheckTest {
}
private fun Project.assertNoWarningMessage() {
val diagnostics = kotlinToolingDiagnosticsCollector.getAllDiagnostics()
val diagnostics = kotlinToolingDiagnosticsCollector.getDiagnosticsForProject(this)
if (diagnostics.isNotEmpty()) {
fail("Expected no warning messages to be emitted. Found: $diagnostics")
}
@@ -0,0 +1,3 @@
[TEST_DIAGNOSTIC | ERROR] This is a test diagnostic
It has multiple lines of text