From ad807309afbba4e1ad8a1a34ea20e3054ae2b5c2 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 1 Dec 2017 13:28:36 +0700 Subject: [PATCH] IDEA-182933 Simplifying boolean condition removes necessary brackets and changes semantics --- .../fixture/SimplifyConcatWithParentheses.java | 13 +++++++++++++ .../SimplifyConcatWithParentheses_after.java | 13 +++++++++++++ .../java/codeInspection/DataFlowInspectionTest.java | 5 +++++ .../src/com/siyeh/ig/psiutils/ParenthesesUtils.java | 3 ++- 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses.java create mode 100644 java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses_after.java diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses.java b/java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses.java new file mode 100644 index 000000000000..e86a3f8e6da4 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses.java @@ -0,0 +1,13 @@ +class Test { + + // IDEA-182933 + public static void main(String[] args) { + int a = 1; + int b = 2; + boolean f = false; + + String s = "Hello " + (a + b) + (f ? " Earth" : " World"); + + System.out.println(s); // Prints Hello 3 World + } +} \ No newline at end of file diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses_after.java new file mode 100644 index 000000000000..d70db62bd520 --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/SimplifyConcatWithParentheses_after.java @@ -0,0 +1,13 @@ +class Test { + + // IDEA-182933 + public static void main(String[] args) { + int a = 1; + int b = 2; + boolean f = false; + + String s = "Hello " + (a + b) + " World"; + + System.out.println(s); // Prints Hello 3 World + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java index d03afaab2d18..8fc594731f48 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspectionTest.java @@ -498,6 +498,11 @@ public class DataFlowInspectionTest extends DataFlowInspectionTestCase { checkIntentionResult("Simplify 'Test.valueOf(value) != null' to true extracting side effects"); } + public void testSimplifyConcatWithParentheses() { + doTest(); + checkIntentionResult("Simplify 'f' to false"); + } + public void testSideEffectWhile() { doTest(); checkIntentionResult("Remove 'while' statement extracting side effects"); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java index 065f26af9c94..3f16ccf3d734 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ParenthesesUtils.java @@ -309,7 +309,8 @@ public class ParenthesesUtils { return; } } - if (ignoreClarifyingParentheses) { + if (ignoreClarifyingParentheses || + (parentOperator == JavaTokenType.PLUS && TypeUtils.isJavaLangString(parentType) && !TypeUtils.isJavaLangString(bodyType))) { if (parentOperator.equals(bodyOperator)) { removeParentheses(body, ignoreClarifyingParentheses); }