From ed35fdafea8dff1f4dcfcb94b28d25d483d361f5 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Fri, 15 Apr 2022 11:15:21 -0700 Subject: [PATCH] Fix a crash in `UnnecessaryBoxedVariable` Don't assume that return statements are enclosed by a method with a return type, to handle statement lambdas inside constructors. Fixes https://github.com/google/error-prone/issues/3115 PiperOrigin-RevId: 442056569 --- .../bugpatterns/UnnecessaryBoxedVariable.java | 12 +++++++----- .../UnnecessaryBoxedVariableTest.java | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariable.java b/core/src/main/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariable.java index 25b8b9a986e..9dad59d75fa 100644 --- a/core/src/main/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariable.java +++ b/core/src/main/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariable.java @@ -21,6 +21,7 @@ import static com.google.errorprone.matchers.Matchers.anyOf; import static com.google.errorprone.matchers.method.MethodMatchers.instanceMethod; import static com.google.errorprone.matchers.method.MethodMatchers.staticMethod; +import static com.google.errorprone.util.ASTHelpers.findEnclosingMethod; import static com.google.errorprone.util.ASTHelpers.getSymbol; import com.google.common.collect.ArrayListMultimap; @@ -429,11 +430,12 @@ public Void visitReturn(ReturnTree node, Void unused) { // Don't count a return value as a boxed usage, except if we are returning a parameter, and // the method's return type is boxed. if (nodeSymbol.getKind() == ElementKind.PARAMETER) { - MethodTree enclosingMethod = - ASTHelpers.findEnclosingNode(getCurrentPath(), MethodTree.class); - Type returnType = ASTHelpers.getType(enclosingMethod.getReturnType()); - if (!returnType.isPrimitive()) { - boxedUsageFound.add((VarSymbol) nodeSymbol); + MethodTree enclosingMethod = findEnclosingMethod(state.withPath(getCurrentPath())); + if (enclosingMethod != null) { + Type returnType = ASTHelpers.getType(enclosingMethod.getReturnType()); + if (!returnType.isPrimitive()) { + boxedUsageFound.add((VarSymbol) nodeSymbol); + } } } return null; diff --git a/core/src/test/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariableTest.java b/core/src/test/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariableTest.java index 26629b25957..0309d9912b7 100644 --- a/core/src/test/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariableTest.java +++ b/core/src/test/java/com/google/errorprone/bugpatterns/UnnecessaryBoxedVariableTest.java @@ -69,4 +69,22 @@ public void lambdas() { "}") .doTest(); } + + @Test + public void lambdaReturn() { + compilationTestHelper + .addSourceLines( + "Test.java", + "class Test {", + " interface F {", + " int f(Integer i);", + " }", + " Test() {", + " F f = (Integer i) -> {", + " return i;", + " };", + " }", + "}") + .doTest(); + } }