blob: f4d411df5cf13e2b4f6889f6806a683101889281 [file] [log] [blame]
/*
* Copyright 2003-2013 Dave Griffith, Bas Leijdekkers
*
* 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.shift;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.IntentionPowerPackBundle;
import com.siyeh.ig.PsiReplacementUtil;
import com.siyeh.ig.psiutils.ParenthesesUtils;
import com.siyeh.ipp.base.MutablyNamedIntention;
import com.siyeh.ipp.base.PsiElementPredicate;
import org.jetbrains.annotations.NotNull;
public class ReplaceMultiplyWithShiftIntention extends MutablyNamedIntention {
protected String getTextForElement(PsiElement element) {
if (element instanceof PsiBinaryExpression) {
final PsiBinaryExpression exp = (PsiBinaryExpression)element;
final PsiJavaToken sign = exp.getOperationSign();
final IElementType tokenType = sign.getTokenType();
final String operatorString;
if (tokenType.equals(JavaTokenType.ASTERISK)) {
operatorString = "<<";
}
else {
operatorString = ">>";
}
return IntentionPowerPackBundle.message(
"replace.some.operator.with.other.intention.name",
sign.getText(), operatorString);
}
else {
final PsiAssignmentExpression exp =
(PsiAssignmentExpression)element;
final PsiJavaToken sign = exp.getOperationSign();
final IElementType tokenType = sign.getTokenType();
final String assignString;
if (tokenType.equals(JavaTokenType.ASTERISKEQ)) {
assignString = "<<=";
}
else {
assignString = ">>=";
}
return IntentionPowerPackBundle.message(
"replace.some.operator.with.other.intention.name",
sign.getText(), assignString);
}
}
@NotNull
public PsiElementPredicate getElementPredicate() {
return new MultiplyByPowerOfTwoPredicate();
}
public void processIntention(PsiElement element)
throws IncorrectOperationException {
if (element instanceof PsiBinaryExpression) {
replaceMultiplyOrDivideWithShift((PsiBinaryExpression)element);
}
else {
replaceMultiplyOrDivideAssignWithShiftAssign(
(PsiAssignmentExpression)element);
}
}
private static void replaceMultiplyOrDivideAssignWithShiftAssign(
PsiAssignmentExpression expression)
throws IncorrectOperationException {
final PsiExpression lhs = expression.getLExpression();
final PsiExpression rhs = expression.getRExpression();
final IElementType tokenType = expression.getOperationTokenType();
final String assignString;
if (tokenType.equals(JavaTokenType.ASTERISKEQ)) {
assignString = "<<=";
}
else {
assignString = ">>=";
}
final String expString =
lhs.getText() + assignString + ShiftUtils.getLogBase2(rhs);
PsiReplacementUtil.replaceExpression(expression, expString);
}
private static void replaceMultiplyOrDivideWithShift(
PsiBinaryExpression expression)
throws IncorrectOperationException {
final PsiExpression lhs = expression.getLOperand();
final PsiExpression rhs = expression.getROperand();
final IElementType tokenType = expression.getOperationTokenType();
final String operatorString;
if (tokenType.equals(JavaTokenType.ASTERISK)) {
operatorString = "<<";
}
else {
operatorString = ">>";
}
final String lhsText;
if (ParenthesesUtils.getPrecedence(lhs) >
ParenthesesUtils.SHIFT_PRECEDENCE) {
lhsText = '(' + lhs.getText() + ')';
}
else {
lhsText = lhs.getText();
}
String expString =
lhsText + operatorString + ShiftUtils.getLogBase2(rhs);
final PsiElement parent = expression.getParent();
if (parent instanceof PsiExpression) {
if (!(parent instanceof PsiParenthesizedExpression) &&
ParenthesesUtils.getPrecedence((PsiExpression)parent) <
ParenthesesUtils.SHIFT_PRECEDENCE) {
expString = '(' + expString + ')';
}
}
PsiReplacementUtil.replaceExpression(expression, expString);
}
}