| // Copyright (c) 2026, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| import net.ltgt.gradle.errorprone.errorprone |
| import org.gradle.api.Project |
| import org.gradle.api.tasks.compile.JavaCompile |
| import org.gradle.kotlin.dsl.withType |
| |
| public fun Project.configureErrorProneForJavaCompile() { |
| val treatWarningsAsErrors = !project.hasProperty("disable_warnings_as_errors") |
| val enableErrorProne = !project.hasProperty("disable_errorprone") |
| dependencies.add("errorprone", getLibraryByName("errorprone")) |
| tasks.withType<JavaCompile>().configureEach { |
| options.errorprone.enabled.set(enableErrorProne) |
| options.errorprone.excludedPaths.set(".*/build/generated/source/proto/main/java/.*") |
| if (enableErrorProne) { |
| // Non-default / Experimental checks - explicitly enforced. |
| enableCheck(this, "RemoveUnusedImports", treatWarningsAsErrors) |
| enableCheck(this, "InconsistentOverloads", treatWarningsAsErrors) |
| enableCheck(this, "MissingDefault", treatWarningsAsErrors) |
| enableCheck(this, "MultipleTopLevelClasses", treatWarningsAsErrors) |
| enableCheck(this, "NarrowingCompoundAssignment", treatWarningsAsErrors) |
| enableCheck(this, "UnnecessarilyFullyQualified", treatWarningsAsErrors) |
| |
| // Warnings that cause unwanted edits (e.g., inability to write informative asserts). |
| options.errorprone.disable("AlreadyChecked") |
| |
| // JavaDoc related warnings. Would be nice to resolve but of no real consequence. |
| options.errorprone.disable("InvalidLink") |
| options.errorprone.disable("InvalidBlockTag") |
| options.errorprone.disable("InvalidInlineTag") |
| options.errorprone.disable("EmptyBlockTag") |
| options.errorprone.disable("MissingSummary") |
| options.errorprone.disable("UnrecognisedJavadocTag") |
| options.errorprone.disable("AlmostJavadoc") |
| |
| // Moving away from identity and canonical items is not planned. |
| options.errorprone.disable("IdentityHashMapUsage") |
| |
| // TODO: re-enable, disabled as part of 2.18.0 -> 2.50.0 upgrade |
| options.errorprone.disable( |
| "NonApiType", |
| "TypeParameterQualifier", |
| "ExposedPrivateType", |
| "EffectivelyPrivate", |
| "ReferenceEquality", |
| "DuplicateBranches", |
| "BoxingComparator", |
| "ClassInitializationDeadlock", |
| "RedundantControlFlow", |
| "BadImport", |
| "StringCaseLocaleUsage", |
| "UnusedVariable", |
| "AssignmentExpression", |
| "UnnecessaryStringBuilder", |
| "ComparisonOutOfRange", |
| "EnumOrdinal", |
| "SuperCallToObjectMethod", |
| "UnnecessaryParentheses", |
| "LockOnNonEnclosingClassLiteral", |
| "ClosingStandardOutputStreams", |
| "JdkObsolete", |
| "FormatStringShouldUsePlaceholders", |
| "NotJavadoc", |
| ) |
| } |
| |
| // Make all warnings errors. Warnings that we have chosen not to fix (or suppress) are disabled |
| // outright below. |
| if (treatWarningsAsErrors) { |
| options.compilerArgs.add("-Werror") |
| } |
| } |
| } |
| |
| private fun enableCheck(task: JavaCompile, warning: String, treatWarningsAsErrors: Boolean) { |
| if (treatWarningsAsErrors) { |
| task.options.errorprone.error(warning) |
| } else { |
| task.options.errorprone.warn(warning) |
| } |
| } |