diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlock.java b/core/src/main/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlock.java index ea569ddb2c3..398191e63ac 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlock.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlock.java @@ -38,6 +38,8 @@ import com.sun.source.tree.ClassTree; import com.sun.source.tree.ExpressionTree; import com.sun.source.tree.IdentifierTree; +import com.sun.source.tree.LambdaExpressionTree; +import com.sun.source.tree.MemberReferenceTree; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.MethodTree; import com.sun.source.tree.Tree; @@ -112,6 +114,16 @@ public Void visitMethod(MethodTree node, Void unused) { return null; } + @Override + public Void visitMemberReference(MemberReferenceTree node, Void unused) { + return null; + } + + @Override + public Void visitLambdaExpression(LambdaExpressionTree node, Void unused) { + return null; + } + @Override public Void visitMemberSelect(MemberSelectTree tree, Void unused) { if (ASTHelpers.constValue(tree) != null) { diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlockTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlockTest.java index b1c51f7f1d1..944937e3fc2 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlockTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/ClassInitializationDeadlockTest.java @@ -18,6 +18,7 @@ import com.google.auto.value.processor.AutoValueProcessor; import com.google.errorprone.CompilationTestHelper; + import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -309,4 +310,63 @@ public void nonNestedSubclass() { "class B extends A {}") .doTest(); } + + @Test + public void simpleSubclassMethodReference() { + testHelper + .addSourceLines( + "Foo.java", + "import java.util.function.Supplier;", + "class A {", + " static Supplier supplier = B::new;", + "}", + "class B extends A {}") + .doTest(); + } + + @Test + public void compoundSubclassMethodReference() { + testHelper + .addSourceLines( + "Foo.java", + "import java.util.Comparator;", + "class A {", + " static Comparator comparator = Comparator.comparing(B::value);", + "}", + "class B extends A {", + " int value;", + " int value() {", + " return value;", + " }", + "}") + .doTest(); + } + + @Test + public void lambda() { + testHelper + .addSourceLines( + "Foo.java", + "import java.util.function.Supplier;", + "class A {", + " static Supplier supplier = () -> new B();", + "}", + "class B extends A {}") + .doTest(); + } + + @Test + public void subclassStaticMethod() { + testHelper + .addSourceLines( + "Foo.java", + "class A {", + " // BUG: Diagnostic contains:", + " static int value = B.value(); ", + "}", + "class B extends A {", + " static int value() { return 0; }", + "}") + .doTest(); + } }