EA-53797 - CCE: ShiftUtils.getLogBaseTwo

This commit is contained in:
Anna Kozlova
2014-02-11 16:34:51 +01:00
parent bb66ffce9c
commit 9a5f9fecf0
2 changed files with 20 additions and 29 deletions
@@ -53,16 +53,13 @@ public class MultiplyOrDivideByPowerOfTwoInspection
@Nullable
public JComponent createOptionsPanel() {
return new SingleCheckboxOptionsPanel(InspectionGadgetsBundle.message(
"multiply.or.divide.by.power.of.two.divide.option"), this,
"checkDivision");
"multiply.or.divide.by.power.of.two.divide.option"), this, "checkDivision");
}
@Override
@NotNull
public String buildErrorString(Object... infos) {
return InspectionGadgetsBundle.message(
"expression.can.be.replaced.problem.descriptor",
calculateReplacementShift((PsiExpression)infos[0]));
return InspectionGadgetsBundle.message("expression.can.be.replaced.problem.descriptor", calculateReplacementShift((PsiExpression)infos[0]));
}
static String calculateReplacementShift(PsiExpression expression) {
@@ -70,8 +67,7 @@ public class MultiplyOrDivideByPowerOfTwoInspection
final PsiExpression rhs;
final String operator;
if (expression instanceof PsiAssignmentExpression) {
final PsiAssignmentExpression exp =
(PsiAssignmentExpression)expression;
final PsiAssignmentExpression exp = (PsiAssignmentExpression)expression;
lhs = exp.getLExpression();
rhs = exp.getRExpression();
final IElementType tokenType = exp.getOperationTokenType();
@@ -94,16 +90,17 @@ public class MultiplyOrDivideByPowerOfTwoInspection
operator = ">>";
}
}
if (!(rhs instanceof PsiLiteralExpression)) return null;
final String lhsText;
if (ParenthesesUtils.getPrecedence(lhs) >
ParenthesesUtils.SHIFT_PRECEDENCE) {
if (ParenthesesUtils.getPrecedence(lhs) > ParenthesesUtils.SHIFT_PRECEDENCE) {
lhsText = '(' + lhs.getText() + ')';
}
else {
lhsText = lhs.getText();
}
String expString =
lhsText + operator + ShiftUtils.getLogBaseTwo(rhs);
String expString = lhsText + operator + ShiftUtils.getLogBaseTwo((PsiLiteralExpression)rhs);
final PsiElement parent = expression.getParent();
if (parent instanceof PsiExpression) {
if (!(parent instanceof PsiParenthesizedExpression) &&
@@ -119,19 +116,15 @@ public class MultiplyOrDivideByPowerOfTwoInspection
public InspectionGadgetsFix buildFix(Object... infos) {
final PsiExpression expression = (PsiExpression)infos[0];
if (expression instanceof PsiBinaryExpression) {
final PsiBinaryExpression binaryExpression =
(PsiBinaryExpression)expression;
final IElementType operationTokenType =
binaryExpression.getOperationTokenType();
final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression;
final IElementType operationTokenType = binaryExpression.getOperationTokenType();
if (JavaTokenType.DIV.equals(operationTokenType)) {
return null;
}
}
else if (expression instanceof PsiAssignmentExpression) {
final PsiAssignmentExpression assignmentExpression =
(PsiAssignmentExpression)expression;
final IElementType operationTokenType =
assignmentExpression.getOperationTokenType();
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)expression;
final IElementType operationTokenType = assignmentExpression.getOperationTokenType();
if (JavaTokenType.DIVEQ.equals(operationTokenType)) {
return null;
}
@@ -156,10 +149,11 @@ public class MultiplyOrDivideByPowerOfTwoInspection
@Override
public void doFix(Project project, ProblemDescriptor descriptor)
throws IncorrectOperationException {
final PsiExpression expression =
(PsiExpression)descriptor.getPsiElement();
final PsiExpression expression = (PsiExpression)descriptor.getPsiElement();
final String newExpression = calculateReplacementShift(expression);
PsiReplacementUtil.replaceExpression(expression, newExpression);
if (newExpression != null) {
PsiReplacementUtil.replaceExpression(expression, newExpression);
}
}
}
@@ -171,8 +165,7 @@ public class MultiplyOrDivideByPowerOfTwoInspection
private class ConstantShiftVisitor extends BaseInspectionVisitor {
@Override
public void visitBinaryExpression(
@NotNull PsiBinaryExpression expression) {
public void visitBinaryExpression(@NotNull PsiBinaryExpression expression) {
super.visitBinaryExpression(expression);
final PsiExpression rhs = expression.getROperand();
if (rhs == null) {
@@ -199,8 +192,7 @@ public class MultiplyOrDivideByPowerOfTwoInspection
}
@Override
public void visitAssignmentExpression(
@NotNull PsiAssignmentExpression expression) {
public void visitAssignmentExpression(@NotNull PsiAssignmentExpression expression) {
super.visitAssignmentExpression(expression);
if (!WellFormednessUtils.isWellFormed(expression)) {
return;
@@ -46,9 +46,8 @@ class ShiftUtils {
return intValue == 1;
}
public static int getLogBaseTwo(PsiExpression rhs) {
final PsiLiteralExpression literal = (PsiLiteralExpression)rhs;
final Object value = literal.getValue();
public static int getLogBaseTwo(PsiLiteralExpression rhs) {
final Object value = rhs.getValue();
int log = 0;
if (value == null) {
return log;