From 7c1a163fc856c4498107263ccd05a2995aa79142 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 10 Feb 2016 15:14:33 +0100 Subject: [PATCH] IPP: skip parentheses --- .../concatenation/CallSequencePredicate.java | 11 +++++++---- .../MergeCallSequenceToChainIntention.java | 13 +++++++------ .../merge_sequence/Parentheses.java | 11 +++++++++++ .../merge_sequence/Parentheses2.java | 9 +++++++++ .../merge_sequence/Parentheses2_after.java | 8 ++++++++ .../merge_sequence/Parentheses_after.java | 10 ++++++++++ ...MergeCallSequenceToChainIntentionTest.java | 19 ++++++++++++++++++- 7 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses_after.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/CallSequencePredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/CallSequencePredicate.java index 0edd8b949d1a..ccc352f259f7 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/CallSequencePredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/CallSequencePredicate.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package com.siyeh.ipp.concatenation; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.Nullable; @@ -76,13 +77,15 @@ class CallSequencePredicate implements PsiElementPredicate { return null; } final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); - final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + final PsiExpression qualifierExpression = ParenthesesUtils.stripParentheses(methodExpression.getQualifierExpression()); if (qualifierExpression instanceof PsiMethodCallExpression) { final PsiMethodCallExpression expression = (PsiMethodCallExpression)qualifierExpression; return getVariable(expression); - } else if (!(qualifierExpression instanceof PsiReferenceExpression)) { + } + else if (!(qualifierExpression instanceof PsiReferenceExpression)) { return null; - }final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifierExpression; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)qualifierExpression; final PsiElement target = referenceExpression.resolve(); if (!(target instanceof PsiVariable)) { return null; diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntention.java index 5e9170d0fbbc..c8d129c7aded 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntention.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2016 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,8 +17,9 @@ package com.siyeh.ipp.concatenation; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.IncorrectOperationException; +import com.intellij.psi.util.PsiUtil; import com.siyeh.ig.PsiReplacementUtil; +import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ipp.base.Intention; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.NotNull; @@ -35,7 +36,7 @@ public class MergeCallSequenceToChainIntention extends Intention { } @Override - protected void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { + protected void processIntention(@NotNull PsiElement element) { if (!(element instanceof PsiExpressionStatement)) { return; } @@ -56,7 +57,7 @@ public class MergeCallSequenceToChainIntention extends Intention { final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); final String methodName = methodExpression.getReferenceName(); newMethodCallExpression.append('.').append(methodName).append(argumentList.getText()); - final PsiElement parent = methodCallExpression.getParent(); + final PsiElement parent = PsiUtil.skipParenthesizedExprUp(methodCallExpression.getParent()); final PsiElement grandParent = parent.getParent(); if (!(grandParent instanceof PsiMethodCallExpression)) { break; @@ -67,9 +68,9 @@ public class MergeCallSequenceToChainIntention extends Intention { nextSibling.delete(); } - public static PsiMethodCallExpression getRootMethodCallExpression(PsiMethodCallExpression expression) { + private static PsiMethodCallExpression getRootMethodCallExpression(PsiMethodCallExpression expression) { final PsiReferenceExpression methodExpression = expression.getMethodExpression(); - final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); + final PsiExpression qualifierExpression = ParenthesesUtils.stripParentheses(methodExpression.getQualifierExpression()); if (qualifierExpression instanceof PsiMethodCallExpression) { final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)qualifierExpression; return getRootMethodCallExpression(methodCallExpression); diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses.java new file mode 100644 index 000000000000..50ab3f63a677 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses.java @@ -0,0 +1,11 @@ + +class Parentheses { + + public static void main(String... args) { + StringBuilder sb = new StringBuilder(); + sb.append("a"); + (sb).append("B"); + sb.append('c'); + sb.toString(); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2.java new file mode 100644 index 000000000000..13206be14aa4 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2.java @@ -0,0 +1,9 @@ +package com.siyeh.ipp.concatenation.merge_sequence; + +class Parentheses2 { + + void foo(StringBuilder s) { + s.append(1).append(2); + (s.append(3)).append(4); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2_after.java new file mode 100644 index 000000000000..f61e5059f34e --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses2_after.java @@ -0,0 +1,8 @@ +package com.siyeh.ipp.concatenation.merge_sequence; + +class Parentheses2 { + + void foo(StringBuilder s) { + s.append(1).append(2).append(3).append(4); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses_after.java new file mode 100644 index 000000000000..2952c1bbfa7f --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/merge_sequence/Parentheses_after.java @@ -0,0 +1,10 @@ + +class Parentheses { + + public static void main(String... args) { + StringBuilder sb = new StringBuilder(); + sb.append("a"); + (sb).append("B").append('c'); + sb.toString(); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntentionTest.java index 5bd7f85847f7..07d185c1dd9b 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MergeCallSequenceToChainIntentionTest.java @@ -1,15 +1,32 @@ - +/* + * Copyright 2000-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.siyeh.ipp.concatenation; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.IPPTestCase; /** + * @see MergeCallSequenceToChainIntention * @author Bas Leijdekkers */ public class MergeCallSequenceToChainIntentionTest extends IPPTestCase { public void testAppend() { doTest(); } + public void testParentheses() { doTest(); } + public void testParentheses2() { doTest(); } @Override protected String getIntentionName() {