Skip to content

Commit 2d5a7f4

Browse files
cushonError Prone Team
authored andcommitted
Make OverrideThrowableToString match MethodTrees
This indirectly fixes support for suppressing on the method, instead of the enclosing class. PiperOrigin-RevId: 740442995
1 parent 9a28455 commit 2d5a7f4

File tree

2 files changed

+36
-20
lines changed

2 files changed

+36
-20
lines changed

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

Lines changed: 18 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,14 @@
1616

1717
package com.google.errorprone.bugpatterns;
1818

19-
import static com.google.common.collect.ImmutableList.toImmutableList;
2019
import static com.google.errorprone.BugPattern.SeverityLevel.WARNING;
20+
import static com.google.errorprone.matchers.Description.NO_MATCH;
21+
import static com.google.errorprone.util.ASTHelpers.getType;
22+
import static com.google.errorprone.util.ASTHelpers.isSubtype;
2123

22-
import com.google.common.collect.ImmutableList;
2324
import com.google.errorprone.BugPattern;
2425
import com.google.errorprone.VisitorState;
25-
import com.google.errorprone.bugpatterns.BugChecker.ClassTreeMatcher;
26+
import com.google.errorprone.bugpatterns.BugChecker.MethodTreeMatcher;
2627
import com.google.errorprone.fixes.SuggestedFixes;
2728
import com.google.errorprone.matchers.Description;
2829
import com.google.errorprone.matchers.Matchers;
@@ -40,26 +41,23 @@
4041
"To return a custom message with a Throwable class, one should "
4142
+ "override getMessage() instead of toString().",
4243
severity = WARNING)
43-
public final class OverrideThrowableToString extends BugChecker implements ClassTreeMatcher {
44+
public final class OverrideThrowableToString extends BugChecker implements MethodTreeMatcher {
4445

4546
@Override
46-
public Description matchClass(ClassTree classTree, VisitorState state) {
47-
if (!ASTHelpers.isSubtype(
48-
ASTHelpers.getType(classTree), state.getSymtab().throwableType, state)) {
49-
return Description.NO_MATCH;
47+
public Description matchMethod(MethodTree methodTree, VisitorState state) {
48+
if (!Matchers.toStringMethodDeclaration().matches(methodTree, state)) {
49+
return NO_MATCH;
5050
}
51-
ImmutableList<MethodTree> methods =
52-
classTree.getMembers().stream()
53-
.filter(m -> m instanceof MethodTree)
54-
.map(m -> (MethodTree) m)
55-
.collect(toImmutableList());
56-
if (methods.stream().anyMatch(m -> m.getName().contentEquals("getMessage"))) {
57-
return Description.NO_MATCH;
51+
ClassTree classTree = ASTHelpers.findEnclosingNode(state.getPath(), ClassTree.class);
52+
if (!isSubtype(getType(classTree), state.getSymtab().throwableType, state)) {
53+
return NO_MATCH;
5854
}
59-
return methods.stream()
60-
.filter(m -> Matchers.toStringMethodDeclaration().matches(m, state))
61-
.findFirst()
62-
.map(m -> describeMatch(m, SuggestedFixes.renameMethod(m, "getMessage", state)))
63-
.orElse(Description.NO_MATCH);
55+
if (classTree.getMembers().stream()
56+
.filter(m -> m instanceof MethodTree)
57+
.map(m -> (MethodTree) m)
58+
.anyMatch(m -> m.getName().contentEquals("getMessage"))) {
59+
return NO_MATCH;
60+
}
61+
return describeMatch(methodTree, SuggestedFixes.renameMethod(methodTree, "getMessage", state));
6462
}
6563
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,22 @@ public String getMessage() {
209209
""")
210210
.doTest(TestMode.AST_MATCH);
211211
}
212+
213+
@Test
214+
public void suppressionOnMethod() {
215+
compilationHelper
216+
.addSourceLines(
217+
"Test.java",
218+
"""
219+
class Test extends Throwable {
220+
221+
@SuppressWarnings("OverrideThrowableToString")
222+
@Override
223+
public String toString() {
224+
return "";
225+
}
226+
}\
227+
""")
228+
.doTest();
229+
}
212230
}

0 commit comments

Comments
 (0)