Skip to content

Commit 3277d72

Browse files
cushonError Prone Team
authored andcommitted
Preserve parentheses around unary plus and minus in non-primitive casts
PiperOrigin-RevId: 749108147
1 parent 09fd394 commit 3277d72

File tree

2 files changed

+39
-1
lines changed

2 files changed

+39
-1
lines changed

check_api/src/main/java/com/google/errorprone/util/ASTHelpers.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@
8181
import com.sun.source.tree.Tree;
8282
import com.sun.source.tree.Tree.Kind;
8383
import com.sun.source.tree.TryTree;
84+
import com.sun.source.tree.TypeCastTree;
8485
import com.sun.source.tree.TypeParameterTree;
8586
import com.sun.source.tree.UnaryTree;
8687
import com.sun.source.tree.VariableTree;
@@ -395,8 +396,19 @@ public static boolean requiresParentheses(ExpressionTree expression, VisitorStat
395396
return state.getOffsetTokensForNode(expression).stream()
396397
.anyMatch(t -> t.kind() == TokenKind.PLUS);
397398
}
398-
if (expression instanceof UnaryTree) {
399+
if (expression instanceof UnaryTree unaryTree) {
399400
Tree parent = state.getPath().getParentPath().getLeaf();
401+
if (parent instanceof TypeCastTree castTree
402+
&& !castTree.getType().getKind().equals(Kind.PRIMITIVE_TYPE)) {
403+
// unary plus and minus require parens when used with non-primitive casts
404+
// see https://docs.oracle.com/javase/specs/jls/se21/html/jls-15.html#jls-15.16
405+
switch (unaryTree.getKind()) {
406+
case UNARY_PLUS, UNARY_MINUS -> {
407+
return true;
408+
}
409+
default -> {}
410+
}
411+
}
400412
if (!(parent instanceof MemberSelectTree memberSelectTree)) {
401413
return false;
402414
}

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,4 +295,30 @@ public boolean match(String value) {
295295
.expectNoDiagnostics()
296296
.doTest();
297297
}
298+
299+
@Test
300+
public void unaryMinus() {
301+
testHelper
302+
.addInputLines(
303+
"Test.java",
304+
"""
305+
class Test {
306+
public void f() {
307+
Double d = (Double) (-1.0);
308+
d = (double) (-1.0);
309+
}
310+
}
311+
""")
312+
.addOutputLines(
313+
"Test.java",
314+
"""
315+
class Test {
316+
public void f() {
317+
Double d = (Double) (-1.0);
318+
d = (double) -1.0;
319+
}
320+
}
321+
""")
322+
.doTest();
323+
}
298324
}

0 commit comments

Comments
 (0)