From 37fece89bf2ab2d225e5b7b90d6d9d7793e14aa4 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 2 Aug 2018 01:28:08 +0700 Subject: [PATCH] ExpressionUtils#replacePolyadicWithParent: support also cases like a+[b-c] which should be reparsed like [a+b]-c --- .../siyeh/ig/psiutils/ExpressionUtils.java | 33 +++++++++++-------- .../igfixes/parentheses/Polyadic2.after.java | 7 ++++ .../siyeh/igfixes/parentheses/Polyadic2.java | 7 ++++ .../igfixes/parentheses/Polyadic3.after.java | 7 ++++ .../siyeh/igfixes/parentheses/Polyadic3.java | 7 ++++ .../UnnecessaryParenthesesQuickFixTest.java | 2 ++ 6 files changed, 49 insertions(+), 14 deletions(-) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.java diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java index 1a5a552c0919..442b2ed8d8e2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ExpressionUtils.java @@ -1296,22 +1296,27 @@ public class ExpressionUtils { PsiExpression replacement, CommentTracker tracker) { PsiElement parent = expressionToReplace.getParent(); - if (parent instanceof PsiPolyadicExpression && - replacement instanceof PsiPolyadicExpression && - ((PsiPolyadicExpression)parent).getOperationTokenType() == ((PsiPolyadicExpression)replacement).getOperationTokenType()) { - int idx = ArrayUtil.indexOf(((PsiPolyadicExpression)parent).getOperands(), expressionToReplace); - if (idx >= 0) { - PsiPolyadicExpression copyParentPolyadic = (PsiPolyadicExpression)parent.copy(); - copyParentPolyadic.getOperands()[idx].replace(replacement); - PsiExpression recreateCopyFromText = JavaPsiFacade.getElementFactory(parent.getProject()) - .createExpressionFromText(copyParentPolyadic.getText(), parent); - PsiElement[] children = parent.getChildren(); - for (PsiElement child : children) { - if (child != expressionToReplace) { - tracker.markUnchanged(child); + if (parent instanceof PsiPolyadicExpression && replacement instanceof PsiPolyadicExpression) { + PsiPolyadicExpression parentPolyadic = (PsiPolyadicExpression)parent; + PsiPolyadicExpression childPolyadic = (PsiPolyadicExpression)replacement; + IElementType parentTokenType = parentPolyadic.getOperationTokenType(); + IElementType childTokenType = childPolyadic.getOperationTokenType(); + if (PsiPrecedenceUtil.getPrecedenceForOperator(parentTokenType) == + PsiPrecedenceUtil.getPrecedenceForOperator(childTokenType)) { + int idx = ArrayUtil.indexOf(parentPolyadic.getOperands(), expressionToReplace); + if (idx > 0 || (idx == 0 && parentTokenType == childTokenType)) { + PsiPolyadicExpression copyParentPolyadic = (PsiPolyadicExpression)parent.copy(); + copyParentPolyadic.getOperands()[idx].replace(replacement); + PsiExpression recreateCopyFromText = JavaPsiFacade.getElementFactory(parent.getProject()) + .createExpressionFromText(copyParentPolyadic.getText(), parent); + PsiElement[] children = parent.getChildren(); + for (PsiElement child : children) { + if (child != expressionToReplace) { + tracker.markUnchanged(child); + } } + return (PsiExpression)tracker.replaceAndRestoreComments(parent, recreateCopyFromText); } - return ((PsiPolyadicExpression)tracker.replaceAndRestoreComments(parent, recreateCopyFromText)).getOperands()[idx]; } } return null; diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.after.java new file mode 100644 index 000000000000..db0ccb1450c3 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.after.java @@ -0,0 +1,7 @@ +package com.siyeh.ipp.parentheses; + +class Polyadic { + boolean foo(int a, int b, int c) { + return a + b - c; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.java new file mode 100644 index 000000000000..4fda22ba1e11 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic2.java @@ -0,0 +1,7 @@ +package com.siyeh.ipp.parentheses; + +class Polyadic { + boolean foo(int a, int b, int c) { + return a + (b - c); + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.after.java new file mode 100644 index 000000000000..2fbad1839916 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.after.java @@ -0,0 +1,7 @@ +package com.siyeh.ipp.parentheses; + +class Polyadic { + boolean foo(int a, int b, int c, int d) { + return a + b - c + d; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.java new file mode 100644 index 000000000000..73d7178b9634 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/parentheses/Polyadic3.java @@ -0,0 +1,7 @@ +package com.siyeh.ipp.parentheses; + +class Polyadic { + boolean foo(int a, int b, int c, int d) { + return a + (b - c) + d; + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/parenthesis/UnnecessaryParenthesesQuickFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/parenthesis/UnnecessaryParenthesesQuickFixTest.java index 4f5ac8664e16..d8e451eaed77 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/parenthesis/UnnecessaryParenthesesQuickFixTest.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/parenthesis/UnnecessaryParenthesesQuickFixTest.java @@ -30,6 +30,8 @@ public class UnnecessaryParenthesesQuickFixTest extends IGQuickFixesTestCase { } public void testPolyadic() { doTest(); } + public void testPolyadic2() { doTest(); } + public void testPolyadic3() { doTest(); } public void testCommutative() { doTest(); } public void testWrapping() { doTest(); } public void testNotCommutative() { assertQuickfixNotAvailable(); }