From 69e1ff670f22e16bd4434d2aa5fb4ab5594044be Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 10 Jul 2018 12:36:46 +0700 Subject: [PATCH] ReplaceShiftWithMultiplyIntention: support parentheses; tests --- .../ReplaceShiftWithMultiplyIntention.java | 5 +++-- .../ipp/shift/ShiftByLiteralPredicate.java | 3 ++- .../replace_shift_with_multiply/LeftShift.java | 5 +++++ .../LeftShiftAssign.java | 5 +++++ .../LeftShiftAssign_after.java | 5 +++++ .../LeftShift_after.java | 5 +++++ .../Parentheses.java | 5 +++++ .../Parentheses_after.java | 5 +++++ .../replace_shift_with_multiply/RightShift.java | 5 +++++ .../RightShift_after.java | 5 +++++ .../ReplaceShiftWithMultiplyIntentionTest.java | 17 +++++++++++++++++ 11 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift_after.java create mode 100644 plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntentionTest.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntention.java index 87f0794a63fb..16f82b65c625 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntention.java @@ -17,6 +17,7 @@ package com.siyeh.ipp.shift; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiUtil; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ig.PsiReplacementUtil; import com.siyeh.ig.psiutils.CommentTracker; @@ -69,7 +70,7 @@ public class ReplaceShiftWithMultiplyIntention extends MutablyNamedIntention { } @Override - public void processIntention(PsiElement element) { + public void processIntention(@NotNull PsiElement element) { if (element instanceof PsiBinaryExpression) { replaceShiftWithMultiplyOrDivide(element); } @@ -100,7 +101,7 @@ public class ReplaceShiftWithMultiplyIntention extends MutablyNamedIntention { private static void replaceShiftWithMultiplyOrDivide(PsiElement element) { final PsiBinaryExpression exp = (PsiBinaryExpression)element; final PsiExpression lhs = exp.getLOperand(); - final PsiExpression rhs = exp.getROperand(); + final PsiExpression rhs = PsiUtil.skipParenthesizedExprDown(exp.getROperand()); final IElementType tokenType = exp.getOperationTokenType(); final String operatorString; if (tokenType.equals(JavaTokenType.LTLT)) { diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ShiftByLiteralPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ShiftByLiteralPredicate.java index 55079bbe8d78..59e553f0e994 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ShiftByLiteralPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/shift/ShiftByLiteralPredicate.java @@ -17,6 +17,7 @@ package com.siyeh.ipp.shift; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiUtil; import com.siyeh.ipp.base.PsiElementPredicate; class ShiftByLiteralPredicate implements PsiElementPredicate { @@ -68,7 +69,7 @@ class ShiftByLiteralPredicate implements PsiElementPredicate { if (!ShiftUtils.isIntegral(lhsType)) { return false; } - final PsiExpression rhs = expression.getROperand(); + final PsiExpression rhs = PsiUtil.skipParenthesizedExprDown(expression.getROperand()); return ShiftUtils.isIntLiteral(rhs); } } diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift.java new file mode 100644 index 000000000000..fce460b55f75 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + int x = foo << 12; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign.java new file mode 100644 index 000000000000..f67718496fe2 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + foo <<= 12; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign_after.java new file mode 100644 index 000000000000..9917a70b3eab --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShiftAssign_after.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + foo *= 4096; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift_after.java new file mode 100644 index 000000000000..ba8acda3391e --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/LeftShift_after.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + int x = foo * 4096; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses.java new file mode 100644 index 000000000000..85f213315121 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + int x = foo << (24); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses_after.java new file mode 100644 index 000000000000..f56724b33cd0 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/Parentheses_after.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + int x = foo * 16777216; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift.java new file mode 100644 index 000000000000..592f29630884 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + int x = foo >> 12; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift_after.java new file mode 100644 index 000000000000..9eb37ba3df8f --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/shift/replace_shift_with_multiply/RightShift_after.java @@ -0,0 +1,5 @@ +class Test { + void test(int foo) { + int x = foo / 4096; + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntentionTest.java new file mode 100644 index 000000000000..b2325a8c1d1c --- /dev/null +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/shift/ReplaceShiftWithMultiplyIntentionTest.java @@ -0,0 +1,17 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.siyeh.ipp.shift; + +import com.siyeh.ipp.IPPTestCase; + +public class ReplaceShiftWithMultiplyIntentionTest extends IPPTestCase { + + public void testLeftShift() { doTest("Replace '<<' with '*'"); } + public void testLeftShiftAssign() { doTest("Replace '<<=' with '*='"); } + public void testParentheses() { doTest("Replace '<<' with '*'"); } + public void testRightShift() { doTest("Replace '>>' with '/'"); } + + @Override + protected String getRelativePath() { + return "shift/replace_shift_with_multiply"; + } +}