Skip to content

Commit 2d20166

Browse files
graememorganError Prone Team
authored andcommitted
Fix handling of foo.new A() {}.
This is awful. PiperOrigin-RevId: 441825465
1 parent 3906173 commit 2d20166

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import static com.google.errorprone.util.ASTHelpers.getGeneratedBy;
2121
import static com.google.errorprone.util.ASTHelpers.getSymbol;
2222
import static com.google.errorprone.util.ASTHelpers.getType;
23+
import static com.google.errorprone.util.ASTHelpers.isGeneratedConstructor;
2324
import static com.google.errorprone.util.FindIdentifiers.findIdent;
2425
import static com.sun.tools.javac.code.Kinds.KindSelector.VAL_TYP;
2526
import static java.util.stream.Collectors.toCollection;
@@ -37,10 +38,12 @@
3738
import com.google.errorprone.fixes.SuggestedFix;
3839
import com.google.errorprone.matchers.Description;
3940
import com.google.errorprone.util.ASTHelpers;
41+
import com.sun.source.tree.ClassTree;
4042
import com.sun.source.tree.CompilationUnitTree;
4143
import com.sun.source.tree.IdentifierTree;
4244
import com.sun.source.tree.ImportTree;
4345
import com.sun.source.tree.MemberSelectTree;
46+
import com.sun.source.tree.MethodTree;
4447
import com.sun.source.tree.Tree;
4548
import com.sun.source.util.SimpleTreeVisitor;
4649
import com.sun.source.util.TreePath;
@@ -86,6 +89,25 @@ public Void visitImport(ImportTree importTree, Void unused) {
8689
return null;
8790
}
8891

92+
@Override
93+
public Void visitClass(ClassTree tree, Void unused) {
94+
scan(tree.getModifiers(), null);
95+
scan(tree.getTypeParameters(), null);
96+
// Some anonymous classes have an extends clause which is fully qualified. Just ignore it.
97+
if (!getSymbol(tree).isAnonymous()) {
98+
scan(tree.getExtendsClause(), null);
99+
scan(tree.getImplementsClause(), null);
100+
}
101+
scan(tree.getMembers(), null);
102+
return null;
103+
}
104+
105+
@Override
106+
public Void visitMethod(MethodTree tree, Void unused) {
107+
// Some generated constructors sneak in a fully qualified argument.
108+
return isGeneratedConstructor(tree) ? null : super.visitMethod(tree, null);
109+
}
110+
89111
@Override
90112
public Void visitMemberSelect(MemberSelectTree memberSelectTree, Void unused) {
91113
if (!shouldIgnore()) {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,22 @@ public void exemptedNames() {
195195
.doTest();
196196
}
197197

198+
@Test
199+
public void innerClass() {
200+
helper
201+
.addInputLines(
202+
"A.java", //
203+
"package test;",
204+
"public class A {",
205+
" class B {}",
206+
" void test (A a) {",
207+
" a.new B() {};",
208+
" }",
209+
"}")
210+
.expectUnchanged()
211+
.doTest();
212+
}
213+
198214
@Test
199215
public void packageInfo() {
200216
CompilationTestHelper.newInstance(UnnecessarilyFullyQualified.class, getClass())

0 commit comments

Comments
 (0)