diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/InconsistentCapitalization.java b/core/src/main/java/com/google/errorprone/bugpatterns/InconsistentCapitalization.java index f7b0f27be9f..507ce8fc7be 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/InconsistentCapitalization.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/InconsistentCapitalization.java @@ -16,11 +16,12 @@ package com.google.errorprone.bugpatterns; -import static com.google.common.collect.ImmutableMap.toImmutableMap; +import static com.google.common.collect.ImmutableListMultimap.toImmutableListMultimap; import static com.google.errorprone.BugPattern.SeverityLevel.WARNING; import static com.google.errorprone.util.ASTHelpers.isStatic; import com.google.common.base.Ascii; +import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.errorprone.BugPattern; @@ -39,6 +40,8 @@ import com.sun.source.util.TreePathScanner; import com.sun.source.util.TreeScanner; import com.sun.tools.javac.code.Symbol; + +import java.util.List; import java.util.Map; import javax.lang.model.element.ElementKind; @@ -58,11 +61,11 @@ public Description matchClass(ClassTree tree, VisitorState state) { return Description.NO_MATCH; } - ImmutableMap fieldNamesMap = + ImmutableListMultimap fieldNamesMap = fields.stream() .collect( - toImmutableMap( - symbol -> Ascii.toLowerCase(symbol.toString()), x -> x, (x, y) -> x)); + toImmutableListMultimap( + symbol -> Ascii.toLowerCase(symbol.toString()), x -> x)); ImmutableMap matchedParameters = MatchingParametersScanner.findMatchingParameters(fieldNamesMap, state.getPath()); @@ -180,17 +183,17 @@ public Void visitVariable(VariableTree tree, Void unused) { private static class MatchingParametersScanner extends TreePathScanner { static ImmutableMap findMatchingParameters( - ImmutableMap fieldNamesMap, TreePath path) { + ImmutableListMultimap fieldNamesMap, TreePath path) { ImmutableMap.Builder matchedParametersBuilder = ImmutableMap.builder(); new MatchingParametersScanner(fieldNamesMap, matchedParametersBuilder).scan(path, null); return matchedParametersBuilder.buildOrThrow(); } - private final ImmutableMap fields; + private final ImmutableListMultimap fields; private final ImmutableMap.Builder matchedParameters; private MatchingParametersScanner( - ImmutableMap fields, + ImmutableListMultimap fields, ImmutableMap.Builder matchedParameters) { this.fields = fields; this.matchedParameters = matchedParameters; @@ -212,12 +215,10 @@ public Void visitVariable(VariableTree tree, Void unused) { return super.visitVariable(tree, null); } String variableName = symbol.toString(); - Symbol matchedField = fields.get(Ascii.toLowerCase(variableName)); - if (matchedField != null) { - String fieldName = matchedField.toString(); - if (!variableName.equals(fieldName)) { - matchedParameters.put(getCurrentPath(), matchedField); - } + List matchedFields = fields.get(Ascii.toLowerCase(variableName)); + if (!matchedFields.isEmpty() + && matchedFields.stream().map(Symbol::toString).noneMatch(variableName::equals)) { + matchedParameters.put(getCurrentPath(), matchedFields.getFirst()); } return super.visitVariable(tree, null); } diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/InconsistentCapitalizationTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/InconsistentCapitalizationTest.java index fe8bb976b78..8d85b96a9f9 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/InconsistentCapitalizationTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/InconsistentCapitalizationTest.java @@ -194,6 +194,16 @@ static class Child extends Parent { } } } + + static class HandlesFieldsWithInconsistentCapitalization { + + private int abc; + private int ABC; + + void foo(int ABC) { + + } + } }\ """) .doTest();