From 2efae9fe9aa7de902b3325aa3077f7bc3fc5c62a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 12 Sep 2017 19:06:24 +0200 Subject: [PATCH] add necessary parentheses when simplifying if (IDEA-178828) --- .../src/com/siyeh/ig/psiutils/BoolUtils.java | 14 ++++----- .../trivialIf/Parentheses.after.java | 5 ++++ .../controlflow/trivialIf/Parentheses.java | 6 ++++ .../fixes/controlflow/TrivialIfFixTest.java | 30 +++++-------------- 4 files changed, 25 insertions(+), 30 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java index 4605e5ede4a7..774de7c48330 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/BoolUtils.java @@ -92,7 +92,7 @@ public class BoolUtils { } if (expression instanceof PsiPolyadicExpression) { final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression; - IElementType tokenType = polyadicExpression.getOperationTokenType(); + final IElementType tokenType = polyadicExpression.getOperationTokenType(); final PsiExpression[] operands = polyadicExpression.getOperands(); if (ComparisonUtils.isComparison(polyadicExpression)) { final String negatedComparison = ComparisonUtils.getNegatedComparison(tokenType); @@ -121,23 +121,23 @@ public class BoolUtils { } if(tokenType.equals(JavaTokenType.ANDAND) || tokenType.equals(JavaTokenType.OROR)) { final String targetToken; - final boolean needParenthesis; + final int newPrecedence; if (tokenType.equals(JavaTokenType.ANDAND)) { targetToken = "||"; - needParenthesis = ParenthesesUtils.OR_PRECEDENCE > precedence; + newPrecedence = ParenthesesUtils.OR_PRECEDENCE; } else { targetToken = "&&"; - needParenthesis = ParenthesesUtils.AND_PRECEDENCE > precedence; + newPrecedence = ParenthesesUtils.AND_PRECEDENCE; } - Function replacer = child -> { + final Function replacer = child -> { if (child instanceof PsiExpression) { - return getNegatedExpressionText((PsiExpression)child); + return getNegatedExpressionText((PsiExpression)child, newPrecedence); } return child instanceof PsiJavaToken ? targetToken : child.getText(); }; final String join = StringUtil.join(polyadicExpression.getChildren(), replacer, ""); - return needParenthesis ? '(' + join + ')' : join; + return (newPrecedence > precedence) ? '(' + join + ')' : join; } } return '!' + ParenthesesUtils.getText(expression, ParenthesesUtils.PREFIX_PRECEDENCE); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.after.java new file mode 100644 index 000000000000..03f551cdf0cb --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.after.java @@ -0,0 +1,5 @@ +class X { + boolean test(String s1, String s2) { + return (s1 == null || s1.isEmpty()) && (s2 == null || s2.isEmpty()); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.java new file mode 100644 index 000000000000..a6a25a053930 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/controlflow/trivialIf/Parentheses.java @@ -0,0 +1,6 @@ +class X { + boolean test(String s1, String s2) { + if(s1 != null && !s1.isEmpty() || s2 != null && !s2.isEmpty()) return false; + return true; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java index 429c09a8ab11..14fac6e77367 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/controlflow/TrivialIfFixTest.java @@ -28,27 +28,11 @@ public class TrivialIfFixTest extends IGQuickFixesTestCase { myDefaultHint = "Simplify 'if else'"; } - public void testComments() { - doTest(); - } - - public void testCommentsInAssignment() { - doTest(); - } - - public void testNegatedConditional() { - doTest(); - } - - public void testNegatedConditional1() { - doTest(); - } - - public void testAssert1() { - doTest(); - } - - public void testAssert2() { - doTest(); - } + public void testComments() { doTest(); } + public void testCommentsInAssignment() { doTest(); } + public void testNegatedConditional() { doTest(); } + public void testNegatedConditional1() { doTest(); } + public void testAssert1() { doTest(); } + public void testAssert2() { doTest(); } + public void testParentheses() { doTest(); } } \ No newline at end of file