From ac2eaec7616878ad3f2ccfb8d964892146257b39 Mon Sep 17 00:00:00 2001 From: Kurt Alfred Kluever Date: Wed, 15 Oct 2025 03:34:20 -0700 Subject: [PATCH] Simplify `ArrayHashCode` fix handling. PiperOrigin-RevId: 819670553 --- .../errorprone/bugpatterns/ArrayHashCode.java | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/ArrayHashCode.java b/core/src/main/java/com/google/errorprone/bugpatterns/ArrayHashCode.java index 3f42fa4bba2..ed8dfc216bd 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/ArrayHashCode.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/ArrayHashCode.java @@ -23,6 +23,7 @@ import static com.google.errorprone.matchers.Matchers.instanceMethod; import static com.google.errorprone.matchers.Matchers.staticMethod; import static com.google.errorprone.predicates.TypePredicates.isArray; +import static com.google.errorprone.util.ASTHelpers.getType; import com.google.common.base.Preconditions; import com.google.errorprone.BugPattern; @@ -33,7 +34,6 @@ import com.google.errorprone.matchers.Description; import com.google.errorprone.matchers.Matcher; import com.google.errorprone.matchers.Matchers; -import com.google.errorprone.util.ASTHelpers; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.MethodInvocationTree; import com.sun.tools.javac.code.Type; @@ -81,22 +81,17 @@ public class ArrayHashCode extends BugChecker implements MethodInvocationTreeMat */ @Override public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) { - SuggestedFix.Builder fix = null; + var fix = SuggestedFix.builder(); Types types = state.getTypes(); if (jdk7HashCodeMethodMatcher.matches(tree, state)) { // java.util.Objects#hashCode takes a single argument, so rewrite the whole method call // to use Arrays.hashCode/deepHashCode instead. - fix = - SuggestedFix.builder() - .replace(tree, rewriteArrayArgument(tree.getArguments().get(0), state)); + fix.replace(tree, rewriteArrayArgument(tree.getArguments().get(0), state)); } else if (instanceHashCodeMethodMatcher.matches(tree, state)) { // Rewrite call to instance hashCode method to use Arrays.hashCode/deepHashCode instead. - fix = - SuggestedFix.builder() - .replace( - tree, - rewriteArrayArgument( - ((JCFieldAccess) tree.getMethodSelect()).getExpression(), state)); + fix.replace( + tree, + rewriteArrayArgument(((JCFieldAccess) tree.getMethodSelect()).getExpression(), state)); } else if (varargsHashCodeMethodMatcher.matches(tree, state)) { // Varargs hash code methods, java.util.Objects#hash and // com.google.common.base.Objects#hashCode @@ -105,22 +100,21 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState // Types like Object[], String[], etc. are not an error because they don't get boxed // in this single-argument varargs call. ExpressionTree arg = tree.getArguments().get(0); - Type elemType = types.elemtype(ASTHelpers.getType(arg)); + Type elemType = types.elemtype(getType(arg)); if (elemType.isPrimitive() || types.isArray(elemType)) { - fix = SuggestedFix.builder().replace(tree, rewriteArrayArgument(arg, state)); + fix.replace(tree, rewriteArrayArgument(arg, state)); } } else { // If more than one argument, wrap each argument in a call to Arrays#hashCode/deepHashCode. - fix = SuggestedFix.builder(); for (ExpressionTree arg : tree.getArguments()) { - if (types.isArray(ASTHelpers.getType(arg))) { + if (types.isArray(getType(arg))) { fix.replace(arg, rewriteArrayArgument(arg, state)); } } } } - if (fix != null) { + if (!fix.isEmpty()) { fix.addImport("java.util.Arrays"); return describeMatch(tree, fix.build()); } @@ -135,7 +129,7 @@ public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState */ private static String rewriteArrayArgument(ExpressionTree arg, VisitorState state) { Types types = state.getTypes(); - Type argType = ASTHelpers.getType(arg); + Type argType = getType(arg); Preconditions.checkState(types.isArray(argType), "arg must be of array type"); if (types.isArray(types.elemtype(argType))) { return "Arrays.deepHashCode(" + state.getSourceForNode(arg) + ")";