diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/InfiniteRecursion.java b/core/src/main/java/com/google/errorprone/bugpatterns/InfiniteRecursion.java index 4bfa6199444..b8883692d48 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/InfiniteRecursion.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/InfiniteRecursion.java @@ -68,25 +68,27 @@ public ExpressionTree visitReturn(ReturnTree tree, Void unused) { return NO_MATCH; } ExpressionTree select = ((MethodInvocationTree) expr).getMethodSelect(); - switch (select.getKind()) { - case IDENTIFIER: - break; - case MEMBER_SELECT: - ExpressionTree receiver = ((MemberSelectTree) select).getExpression(); - if (receiver.getKind() != Kind.IDENTIFIER) { - return NO_MATCH; - } - if (!((IdentifierTree) receiver).getName().contentEquals("this")) { - return NO_MATCH; - } - break; - default: - return NO_MATCH; - } MethodSymbol sym = ASTHelpers.getSymbol(tree); if (sym == null || !sym.equals(ASTHelpers.getSymbol(expr))) { return NO_MATCH; } + if (!sym.isStatic()) { + switch (select.getKind()) { + case IDENTIFIER: + break; + case MEMBER_SELECT: + ExpressionTree receiver = ((MemberSelectTree) select).getExpression(); + if (receiver.getKind() != Kind.IDENTIFIER) { + return NO_MATCH; + } + if (!((IdentifierTree) receiver).getName().contentEquals("this")) { + return NO_MATCH; + } + break; + default: + return NO_MATCH; + } + } return describeMatch(statement); } } diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/InfiniteRecursionTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/InfiniteRecursionTest.java index 727aba9e4af..3eb0c278a33 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/InfiniteRecursionTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/InfiniteRecursionTest.java @@ -50,6 +50,38 @@ public void positive() { .doTest(); } + @Test + public void positiveStatic() { + compilationHelper + .addSourceLines( + "Test.java", + "class Test {", + " static void f(int x) {}", + " static void f() {", + " // BUG: Diagnostic contains:", + " Test.f();", + " }", + " static void instanceF() {", + " // BUG: Diagnostic contains:", + " new Test().instanceF();", + " }", + " static void subclassF() {", + " // BUG: Diagnostic contains:", + " Subclass.subclassF();", + " }", + " static int g() {", + " return 0;", + " }", + " static int g(int x) {", + " // BUG: Diagnostic contains:", + " return Test.g(x);", + " }", + "", + " class Subclass extends Test {}", + "}") + .doTest(); + } + @Test public void negative() { compilationHelper