Update errorprone and make all active checks errors.
All failing checks are explicitly disabled with a few minor code changes
to avoid a few.
Bug: b/270534077
Change-Id: I2e9818e188229227cf2c8e8bf3060a01cdadb8c8
diff --git a/build.gradle b/build.gradle
index c3cdf5c..231349e 100644
--- a/build.gradle
+++ b/build.gradle
@@ -23,7 +23,7 @@
}
plugins {
- id "net.ltgt.errorprone" version "0.7"
+ id "net.ltgt.errorprone" version "2.0.2"
}
apply plugin: 'java'
@@ -44,7 +44,7 @@
kotlinVersion = '1.8.0'
kotlinExtMetadataJVMVersion = '0.6.0'
smaliVersion = '2.2b4'
- errorproneVersion = '2.3.2'
+ errorproneVersion = '2.18.0'
testngVersion = '6.10'
}
@@ -686,29 +686,78 @@
// Don't enable error prone on Java 8 as the plugin setup does not support it.
!org.gradle.internal.jvm.Jvm.current().javaVersion.java8) {
compileJava {
- // Enable error prone for D8/R8 sources.
+
+ // Enable error prone for D8/R8 main sources and make all warnings errors.
+ // Warnings that we have chosen not to fix (or suppress) are disabled outright below.
+ options.compilerArgs << "-Werror"
options.errorprone.enabled = true
- options.errorprone.disableAllChecks = true
- options.errorprone.check('ClassCanBeStatic', CheckSeverity.ERROR)
- options.errorprone.check('CollectionIncompatibleType', CheckSeverity.ERROR)
- options.errorprone.check('OperatorPrecedence', CheckSeverity.ERROR)
+
+ // Non-default / Experimental checks - explicitly enforced.
options.errorprone.check('RemoveUnusedImports', CheckSeverity.ERROR)
- options.errorprone.check('MissingOverride', CheckSeverity.ERROR)
- options.errorprone.check('IntLongMath', CheckSeverity.ERROR)
- options.errorprone.check('EqualsHashCode', CheckSeverity.ERROR)
options.errorprone.check('InconsistentOverloads', CheckSeverity.ERROR)
- options.errorprone.check('ArrayHashCode', CheckSeverity.ERROR)
- options.errorprone.check('EqualsIncompatibleType', CheckSeverity.ERROR)
- options.errorprone.check('NonOverridingEquals', CheckSeverity.ERROR)
- options.errorprone.check('FallThrough', CheckSeverity.ERROR)
- options.errorprone.check('MissingCasesInEnumSwitch', CheckSeverity.ERROR)
options.errorprone.check('MissingDefault', CheckSeverity.ERROR)
options.errorprone.check('MultipleTopLevelClasses', CheckSeverity.ERROR)
options.errorprone.check('NarrowingCompoundAssignment', CheckSeverity.ERROR)
- options.errorprone.check('BoxedPrimitiveConstructor', CheckSeverity.ERROR)
- options.errorprone.check('LogicalAssignment', CheckSeverity.ERROR)
- options.errorprone.check('FloatCast', CheckSeverity.ERROR)
- options.errorprone.check('ReturnValueIgnored', CheckSeverity.ERROR)
+
+ // TODO(b/270534077): These should likely be fixed/suppressed and become hard failures.
+ options.errorprone.check('JdkObsolete', CheckSeverity.OFF)
+ options.errorprone.check('UnusedMethod', CheckSeverity.OFF)
+ options.errorprone.check('UnusedVariable', CheckSeverity.OFF)
+ options.errorprone.check('EqualsUnsafeCast', CheckSeverity.OFF)
+ options.errorprone.check('TypeParameterUnusedInFormals', CheckSeverity.OFF)
+ options.errorprone.check('LoopOverCharArray', CheckSeverity.OFF)
+ options.errorprone.check('ImmutableEnumChecker', CheckSeverity.OFF)
+ options.errorprone.check('BadImport', CheckSeverity.OFF)
+ options.errorprone.check('StringSplitter', CheckSeverity.OFF)
+ options.errorprone.check('ComplexBooleanConstant', CheckSeverity.OFF)
+ options.errorprone.check('StreamToIterable', CheckSeverity.OFF)
+ options.errorprone.check('HidingField', CheckSeverity.OFF)
+ options.errorprone.check('StreamResourceLeak', CheckSeverity.OFF)
+ options.errorprone.check('CatchAndPrintStackTrace', CheckSeverity.OFF)
+ options.errorprone.check('ShortCircuitBoolean', CheckSeverity.OFF)
+ options.errorprone.check('NonCanonicalType', CheckSeverity.OFF)
+ options.errorprone.check('UnusedNestedClass', CheckSeverity.OFF)
+ options.errorprone.check('AmbiguousMethodReference', CheckSeverity.OFF)
+ options.errorprone.check('InvalidParam', CheckSeverity.OFF)
+ options.errorprone.check('CharacterGetNumericValue', CheckSeverity.OFF)
+ options.errorprone.check('ModifyCollectionInEnhancedForLoop', CheckSeverity.OFF)
+ options.errorprone.check('EmptyCatch', CheckSeverity.OFF)
+ options.errorprone.check('ArgumentSelectionDefectChecker', CheckSeverity.OFF)
+ options.errorprone.check('ImmutableAnnotationChecker', CheckSeverity.OFF)
+ options.errorprone.check('ObjectToString', CheckSeverity.OFF)
+ options.errorprone.check('DoNotClaimAnnotations', CheckSeverity.OFF)
+ options.errorprone.check('AnnotateFormatMethod', CheckSeverity.OFF)
+
+ // TODO(b/270537614): Remove finalize uses.
+ options.errorprone.check('Finalize', CheckSeverity.OFF)
+
+ // The following warnings could/should be active but are hit by R8 now so silence them.
+ options.errorprone.check('EqualsGetClass', CheckSeverity.OFF)
+ options.errorprone.check('MixedMutabilityReturnType', CheckSeverity.OFF)
+ options.errorprone.check('UnnecessaryParentheses', CheckSeverity.OFF)
+ options.errorprone.check('DoNotCallSuggester', CheckSeverity.OFF)
+ options.errorprone.check('InlineMeSuggester', CheckSeverity.OFF)
+ options.errorprone.check('MutablePublicArray', CheckSeverity.OFF)
+ options.errorprone.check('DefaultCharset', CheckSeverity.OFF)
+ options.errorprone.check('InconsistentCapitalization', CheckSeverity.OFF)
+ options.errorprone.check('InlineFormatString', CheckSeverity.OFF)
+ options.errorprone.check('MissingImplementsComparable', CheckSeverity.OFF)
+
+ // Warnings that cause unwanted edits (e.g., inability to write informative asserts).
+ options.errorprone.check('AlreadyChecked', CheckSeverity.OFF)
+
+ // JavaDoc related warnings. Would be nice to resolve but of no real consequence.
+ options.errorprone.check('InvalidLink', CheckSeverity.OFF)
+ options.errorprone.check('InvalidBlockTag', CheckSeverity.OFF)
+ options.errorprone.check('InvalidInlineTag', CheckSeverity.OFF)
+ options.errorprone.check('EmptyBlockTag', CheckSeverity.OFF)
+ options.errorprone.check('MissingSummary', CheckSeverity.OFF)
+ options.errorprone.check('UnrecognisedJavadocTag', CheckSeverity.OFF)
+ options.errorprone.check('AlmostJavadoc', CheckSeverity.OFF)
+
+ // Moving away from identity and canonical items is not planned.
+ options.errorprone.check('ReferenceEquality', CheckSeverity.OFF)
+ options.errorprone.check('IdentityHashMapUsage', CheckSeverity.OFF)
}
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 8c7c2ff..401a1eb 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -155,7 +155,7 @@
assert handlers != null;
assert instructions != null;
assert verifySetPositionFramesFollowedByDefaultEvent(debugInfo);
- hashCode(); // Cache the hash code eagerly.
+ int unused = hashCode(); // Cache the hash code eagerly.
}
public DexCode withCodeLens(GraphLens codeLens) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
index 7201b71..b0b2bd2 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -119,7 +119,7 @@
public boolean instructionInstanceCanThrow() {
// The const-string instruction can be a throwing instruction in DEX, if decode() fails.
try {
- value.toString();
+ String unused = value.toString();
} catch (RuntimeException e) {
if (e.getCause() instanceof UTFDataFormatException) {
return true;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index b0eb2bd..f4c211f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -585,7 +585,7 @@
consumer.accept(user.outValue());
}
}
- uniquePhiUsers().forEach(consumer::accept);
+ uniquePhiUsers().forEach(consumer);
}
public void replaceUsers(Value newValue) {
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
index f79b740..729f071 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/ForwardMethodSourceCode.java
@@ -108,7 +108,7 @@
private final boolean isInterface;
private final boolean extraNullParameter;
- protected ForwardMethodSourceCode(
+ ForwardMethodSourceCode(
DexType receiver,
DexMethod method,
DexMethod originalMethod,
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
index dfb5d76..f00c011 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -157,7 +157,7 @@
return sb.toString();
}
- private static <T> void appendKmHelper(
+ private static void appendKmHelper(
String key, StringBuilder sb, Action appendContent, String start, String end) {
sb.append(key);
sb.append(start);
@@ -165,7 +165,7 @@
sb.append(end);
}
- public static <T> void appendKmSection(
+ public static void appendKmSection(
String indent, String typeDescription, StringBuilder sb, Consumer<String> appendContent) {
appendKmHelper(
typeDescription,
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
index 17157c3..47bcc73 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -856,7 +856,7 @@
}
@Override
- public String toString() {
+ public String getMessage() {
if (eol) {
return "Parse error [" + lineNo + ":eol] " + msg;
} else {
diff --git a/src/main/java/com/android/tools/r8/utils/IterableUtils.java b/src/main/java/com/android/tools/r8/utils/IterableUtils.java
index cd6dcb6..5ca1e24e 100644
--- a/src/main/java/com/android/tools/r8/utils/IterableUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/IterableUtils.java
@@ -19,7 +19,7 @@
public class IterableUtils {
- public static <S, T> boolean allIdentical(Iterable<S> iterable) {
+ public static <S> boolean allIdentical(Iterable<S> iterable) {
return allIdentical(iterable, Function.identity());
}