From ad513d5a82dc803dcc5179ffcdf7073d43430623 Mon Sep 17 00:00:00 2001 From: Kurt Alfred Kluever Date: Mon, 26 Feb 2024 10:45:09 -0800 Subject: [PATCH] Recommend using `var` for `var unused = ...;` and `var thrown = assertThrows(MyException.class, () -> ...);` PiperOrigin-RevId: 610457244 --- .../errorprone/bugpatterns/Varifier.java | 11 +++++ .../errorprone/bugpatterns/VarifierTest.java | 46 +++++++++++++++++++ 2 files changed, 57 insertions(+) diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/Varifier.java b/core/src/main/java/com/google/errorprone/bugpatterns/Varifier.java index 03a61264e23..f7ff65a1e4a 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/Varifier.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/Varifier.java @@ -67,6 +67,9 @@ public final class Varifier extends BugChecker implements VariableTreeMatcher { && isSameType(((MethodSymbol) symbol).getReturnType(), symbol.owner.type, s); }); + private static final Matcher ASSERT_THROWS = + staticMethod().onClass("org.junit.Assert").named("assertThrows"); + @Override public Description matchVariable(VariableTree tree, VisitorState state) { var symbol = getSymbol(tree); @@ -77,6 +80,14 @@ public Description matchVariable(VariableTree tree, VisitorState state) { || hasImplicitType(tree, state)) { return NO_MATCH; } + // Foo unused = ...; + if (symbol.getSimpleName().contentEquals("unused")) { + return fix(tree); + } + // MyException exception = assertThrows(MyException.class, () -> ...); + if (ASSERT_THROWS.matches(initializer, state)) { + return fix(tree); + } // Foo foo = (Foo) bar; if (initializer instanceof TypeCastTree && isSameType( diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/VarifierTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/VarifierTest.java index 499fa36de50..e9155c2823f 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/VarifierTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/VarifierTest.java @@ -176,4 +176,50 @@ public void fromFactoryMethod() { "}") .doTest(); } + + @Test + public void varUnused() { + refactoringHelper + .addInputLines( + "Test.java", + "class Test {", + " public void trim(String string) {", + " String unused = string.trim();", + " }", + "}") + .addOutputLines( + "Test.java", + "class Test {", + " public void trim(String string) {", + " var unused = string.trim();", + " }", + "}") + .doTest(); + } + + @Test + public void assertThrows() { + refactoringHelper + .addInputLines( + "Test.java", + "import static org.junit.Assert.assertThrows;", + "class Test {", + " public void testFoo() {", + " Object nil = null;", + " NullPointerException thrown = ", + " assertThrows(NullPointerException.class, () -> nil.toString());", + " }", + "}") + .addOutputLines( + "Test.java", + "import static org.junit.Assert.assertThrows;", + "class Test {", + " public void testFoo() {", + " Object nil = null;", + " var thrown = ", + " assertThrows(NullPointerException.class, () -> nil.toString());", + " }", + "}") + .doTest(); + } }