Skip to content

Commit 302912c

Browse files
authored
Merge pull request #90 from HubSpot/tk/class-init-deadlock-method-refs-fork
Allow lambdas and method references referencing subclasses
2 parents 9997a68 + 224937a commit 302912c

File tree

2 files changed

+72
-0
lines changed

2 files changed

+72
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
import com.sun.source.tree.ClassTree;
3939
import com.sun.source.tree.ExpressionTree;
4040
import com.sun.source.tree.IdentifierTree;
41+
import com.sun.source.tree.LambdaExpressionTree;
42+
import com.sun.source.tree.MemberReferenceTree;
4143
import com.sun.source.tree.MemberSelectTree;
4244
import com.sun.source.tree.MethodTree;
4345
import com.sun.source.tree.Tree;
@@ -112,6 +114,16 @@ public Void visitMethod(MethodTree node, Void unused) {
112114
return null;
113115
}
114116

117+
@Override
118+
public Void visitMemberReference(MemberReferenceTree node, Void unused) {
119+
return null;
120+
}
121+
122+
@Override
123+
public Void visitLambdaExpression(LambdaExpressionTree node, Void unused) {
124+
return null;
125+
}
126+
115127
@Override
116128
public Void visitMemberSelect(MemberSelectTree tree, Void unused) {
117129
if (ASTHelpers.constValue(tree) != null) {

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

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.google.auto.value.processor.AutoValueProcessor;
2020
import com.google.errorprone.CompilationTestHelper;
21+
2122
import org.junit.Test;
2223
import org.junit.runner.RunWith;
2324
import org.junit.runners.JUnit4;
@@ -309,4 +310,63 @@ public void nonNestedSubclass() {
309310
"class B extends A {}")
310311
.doTest();
311312
}
313+
314+
@Test
315+
public void simpleSubclassMethodReference() {
316+
testHelper
317+
.addSourceLines(
318+
"Foo.java",
319+
"import java.util.function.Supplier;",
320+
"class A {",
321+
" static Supplier<B> supplier = B::new;",
322+
"}",
323+
"class B extends A {}")
324+
.doTest();
325+
}
326+
327+
@Test
328+
public void compoundSubclassMethodReference() {
329+
testHelper
330+
.addSourceLines(
331+
"Foo.java",
332+
"import java.util.Comparator;",
333+
"class A {",
334+
" static Comparator<B> comparator = Comparator.comparing(B::value);",
335+
"}",
336+
"class B extends A {",
337+
" int value;",
338+
" int value() {",
339+
" return value;",
340+
" }",
341+
"}")
342+
.doTest();
343+
}
344+
345+
@Test
346+
public void lambda() {
347+
testHelper
348+
.addSourceLines(
349+
"Foo.java",
350+
"import java.util.function.Supplier;",
351+
"class A {",
352+
" static Supplier<B> supplier = () -> new B();",
353+
"}",
354+
"class B extends A {}")
355+
.doTest();
356+
}
357+
358+
@Test
359+
public void subclassStaticMethod() {
360+
testHelper
361+
.addSourceLines(
362+
"Foo.java",
363+
"class A {",
364+
" // BUG: Diagnostic contains:",
365+
" static int value = B.value(); ",
366+
"}",
367+
"class B extends A {",
368+
" static int value() { return 0; }",
369+
"}")
370+
.doTest();
371+
}
312372
}

0 commit comments

Comments
 (0)