diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt index 34079fe073b..5f2f37c2e28 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/PropertiesProvider.kt @@ -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 + get() = property(PropertyNames.KOTLIN_SUPPRESS_GRADLE_PLUGIN_WARNINGS)?.split(",").orEmpty() + + val suppressedGradlePluginErrors: List + 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 { 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 168c3703778..adb4408428a 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 @@ -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 { - private val diagnosticsFromProject: MutableMap> = ConcurrentHashMap() + private val rawDiagnosticsFromProject: MutableMap> = ConcurrentHashMap() private val reportedIds: MutableSet = Collections.newSetFromMap(ConcurrentHashMap()) - fun getDiagnosticsForProject(project: Project): Collection = diagnosticsFromProject[project.path].orEmpty() - fun getAllDiagnostics(): Collection = diagnosticsFromProject.values.flatten() + fun getDiagnosticsForProject(project: Project): Collection { + 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 + rawDiagnosticsFromProject.compute(project.path) { _, previousListIfAny -> previousListIfAny?.apply { add(diagnostic) } ?: mutableListOf(diagnostic) } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/diagnosticsTests/DiagnosticsReportingFunctionalTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/diagnosticsTests/DiagnosticsReportingFunctionalTest.kt index 0f35b77a995..efb9790bd7f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/diagnosticsTests/DiagnosticsReportingFunctionalTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/diagnosticsTests/DiagnosticsReportingFunctionalTest.kt @@ -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( diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMultiplatformAndroidGradlePluginCompatibilityHealthCheckTest.kt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMultiplatformAndroidGradlePluginCompatibilityHealthCheckTest.kt index 10b78912a66..b423cb874a3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMultiplatformAndroidGradlePluginCompatibilityHealthCheckTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/kotlin/org/jetbrains/kotlin/gradle/unitTests/KotlinMultiplatformAndroidGradlePluginCompatibilityHealthCheckTest.kt @@ -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") } diff --git a/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/suppressForWarningsDoesntWorkForErrors.txt b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/suppressForWarningsDoesntWorkForErrors.txt new file mode 100644 index 00000000000..1402e9b1f7e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/functionalTest/resources/expectedDiagnostics/suppressForWarningsDoesntWorkForErrors.txt @@ -0,0 +1,3 @@ +[TEST_DIAGNOSTIC | ERROR] This is a test diagnostic + +It has multiple lines of text