Skip to content

Commit 8669adb

Browse files
cushonError Prone Team
authored andcommitted
Fix parameter name handling of enum constructor arguments
PiperOrigin-RevId: 837153976
1 parent 679c4ac commit 8669adb

File tree

2 files changed

+56
-4
lines changed

2 files changed

+56
-4
lines changed

core/src/main/java/com/google/errorprone/bugpatterns/ParameterName.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
2222
import static com.google.errorprone.matchers.Description.NO_MATCH;
2323
import static com.google.errorprone.util.ASTHelpers.getStartPosition;
24+
import static com.google.errorprone.util.ASTHelpers.hasExplicitSource;
2425

2526
import com.google.common.base.Preconditions;
2627
import com.google.common.base.Strings;
@@ -67,29 +68,44 @@ public class ParameterName extends BugChecker
6768
implements MethodInvocationTreeMatcher, NewClassTreeMatcher {
6869

6970
private final ImmutableList<String> exemptPackages;
71+
private final boolean matchImplicitSource;
7072

7173
@Inject
72-
ParameterName(ErrorProneFlags errorProneFlags) {
74+
ParameterName(ErrorProneFlags flags) {
7375
this.exemptPackages =
74-
errorProneFlags.getListOrEmpty("ParameterName:exemptPackagePrefixes").stream()
76+
flags.getListOrEmpty("ParameterName:exemptPackagePrefixes").stream()
7577
// add a trailing '.' so that e.g. com.foo matches as a prefix of com.foo.bar, but not
7678
// com.foobar
7779
.map(p -> p.endsWith(".") ? p : p + ".")
7880
.collect(toImmutableList());
81+
this.matchImplicitSource = flags.getBoolean("ParameterName:matchImplicitSource").orElse(true);
7982
}
8083

8184
@Override
8285
public Description matchMethodInvocation(MethodInvocationTree tree, VisitorState state) {
83-
checkArguments(tree, tree.getArguments(), state.getEndPosition(tree.getMethodSelect()), state);
86+
checkArguments(
87+
tree, tree.getArguments(), argListStartPosition(tree.getMethodSelect(), state), state);
8488
return NO_MATCH;
8589
}
8690

8791
@Override
8892
public Description matchNewClass(NewClassTree tree, VisitorState state) {
89-
checkArguments(tree, tree.getArguments(), state.getEndPosition(tree.getIdentifier()), state);
93+
checkArguments(
94+
tree, tree.getArguments(), argListStartPosition(tree.getIdentifier(), state), state);
9095
return NO_MATCH;
9196
}
9297

98+
int argListStartPosition(Tree tree, VisitorState state) {
99+
if (!matchImplicitSource && !hasExplicitSource(tree, state)) {
100+
return Position.NOPOS;
101+
}
102+
int pos = state.getEndPosition(tree);
103+
if (pos != Position.NOPOS) {
104+
return pos;
105+
}
106+
return getStartPosition(tree);
107+
}
108+
93109
private void checkArguments(
94110
Tree tree,
95111
List<? extends ExpressionTree> arguments,

core/src/test/java/com/google/errorprone/bugpatterns/ParameterNameTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -974,4 +974,40 @@ public class A {
974974
""")
975975
.doTest();
976976
}
977+
978+
@Test
979+
public void enumConstructor() {
980+
testHelper
981+
.addSourceLines(
982+
"E.java",
983+
"""
984+
package test.a;
985+
986+
public enum E {
987+
// BUG: Diagnostic contains:
988+
ONE(/* foo= */ 1);
989+
990+
E(int bar) {}
991+
}
992+
""")
993+
.doTest();
994+
}
995+
996+
@Test
997+
public void enumConstructor_requiresImplicitSource() {
998+
testHelper
999+
.addSourceLines(
1000+
"E.java",
1001+
"""
1002+
package test.a;
1003+
1004+
public enum E {
1005+
ONE(/* foo= */ 1);
1006+
1007+
E(int bar) {}
1008+
}
1009+
""")
1010+
.setArgs("-XepOpt:ParameterName:matchImplicitSource=false")
1011+
.doTest();
1012+
}
9771013
}

0 commit comments

Comments
 (0)