summaryrefslogtreecommitdiff
path: root/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign
diff options
context:
space:
mode:
authorJean-Baptiste Queru <jbq@google.com>2013-04-01 14:41:51 -0700
committerJean-Baptiste Queru <jbq@google.com>2013-04-01 14:41:51 -0700
commit2bd2b7c2623d4266384e890271869efc044aabff (patch)
tree0b31f50e55975b6354ed458314e17b4441bb4e17 /plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign
parent1d526b16d476792ca7ce47616d55833115e8d6ab (diff)
downloadidea-2bd2b7c2623d4266384e890271869efc044aabff.tar.gz
Snapshot ee98b298267d0e09d2cd2f0731b6480a56dd48e7 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I4515f72af131fdea9fc6905a4dc0fe9532409a81
Diffstat (limited to 'plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign')
-rw-r--r--plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceOperatorAssignmentWithAssignmentIntention.java49
-rw-r--r--plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceWithOperatorAssignmentIntention.java59
-rw-r--r--plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceableWithOperatorAssignmentPredicate.java (renamed from plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/AssignmentExpressionReplaceableWithOperatorAssigment.java)30
3 files changed, 65 insertions, 73 deletions
diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceOperatorAssignmentWithAssignmentIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceOperatorAssignmentWithAssignmentIntention.java
index d9af9bba12e7..ea69411b0db1 100644
--- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceOperatorAssignmentWithAssignmentIntention.java
+++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceOperatorAssignmentWithAssignmentIntention.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2007-2012 Bas Leijdekkers
+ * Copyright 2007-2013 Bas Leijdekkers
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@ package com.siyeh.ipp.opassign;
import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.TypeConversionUtil;
-import com.intellij.util.IncorrectOperationException;
import com.siyeh.IntentionPowerPackBundle;
import com.siyeh.ipp.base.MutablyNamedIntention;
import com.siyeh.ipp.base.PsiElementPredicate;
@@ -28,22 +27,23 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
-public class ReplaceOperatorAssignmentWithAssignmentIntention
- extends MutablyNamedIntention {
+public class ReplaceOperatorAssignmentWithAssignmentIntention extends MutablyNamedIntention {
- private static final Map<IElementType, IElementType> tokenMap = new HashMap<IElementType, IElementType>() {{
- put(JavaTokenType.PLUSEQ, JavaTokenType.PLUS);
- put(JavaTokenType.MINUSEQ, JavaTokenType.MINUS);
- put(JavaTokenType.ASTERISKEQ, JavaTokenType.ASTERISK);
- put(JavaTokenType.DIVEQ, JavaTokenType.DIV);
- put(JavaTokenType.ANDEQ, JavaTokenType.AND);
- put(JavaTokenType.OREQ, JavaTokenType.OR);
- put(JavaTokenType.XOREQ, JavaTokenType.XOR);
- put(JavaTokenType.PERCEQ, JavaTokenType.PERC);
- put(JavaTokenType.LTLTEQ, JavaTokenType.LTLT);
- put(JavaTokenType.GTGTEQ, JavaTokenType.GTGT);
- put(JavaTokenType.GTGTGTEQ, JavaTokenType.GTGTGT);
- }};
+ private static final Map<IElementType, IElementType> tokenMap = new HashMap<IElementType, IElementType>();
+
+ static {
+ tokenMap.put(JavaTokenType.PLUSEQ, JavaTokenType.PLUS);
+ tokenMap.put(JavaTokenType.MINUSEQ, JavaTokenType.MINUS);
+ tokenMap.put(JavaTokenType.ASTERISKEQ, JavaTokenType.ASTERISK);
+ tokenMap.put(JavaTokenType.DIVEQ, JavaTokenType.DIV);
+ tokenMap.put(JavaTokenType.ANDEQ, JavaTokenType.AND);
+ tokenMap.put(JavaTokenType.OREQ, JavaTokenType.OR);
+ tokenMap.put(JavaTokenType.XOREQ, JavaTokenType.XOR);
+ tokenMap.put(JavaTokenType.PERCEQ, JavaTokenType.PERC);
+ tokenMap.put(JavaTokenType.LTLTEQ, JavaTokenType.LTLT);
+ tokenMap.put(JavaTokenType.GTGTEQ, JavaTokenType.GTGT);
+ tokenMap.put(JavaTokenType.GTGTGTEQ, JavaTokenType.GTGTGT);
+ }
@Override
@NotNull
@@ -53,17 +53,14 @@ public class ReplaceOperatorAssignmentWithAssignmentIntention
@Override
protected String getTextForElement(PsiElement element) {
- final PsiAssignmentExpression assignmentExpression =
- (PsiAssignmentExpression)element;
+ final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)element;
final PsiJavaToken sign = assignmentExpression.getOperationSign();
final String operator = sign.getText();
- return IntentionPowerPackBundle.message(
- "replace.operator.assignment.with.assignment.intention.name",
- operator);
+ return IntentionPowerPackBundle.message("replace.operator.assignment.with.assignment.intention.name", operator);
}
@Override
- protected void processIntention(@NotNull PsiElement element) throws IncorrectOperationException {
+ protected void processIntention(@NotNull PsiElement element) {
final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)element;
final PsiJavaToken sign = assignmentExpression.getOperationSign();
final PsiExpression lhs = assignmentExpression.getLExpression();
@@ -73,13 +70,13 @@ public class ReplaceOperatorAssignmentWithAssignmentIntention
final String lhsText = lhs.getText();
final String rhsText = (rhs == null) ? "" : rhs.getText();
final boolean parentheses;
- if (rhs instanceof PsiBinaryExpression) {
- final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)rhs;
+ if (rhs instanceof PsiPolyadicExpression) {
+ final PsiPolyadicExpression binaryExpression = (PsiPolyadicExpression)rhs;
final int precedence1 = ParenthesesUtils.getPrecedenceForOperator(binaryExpression.getOperationTokenType());
final IElementType signTokenType = sign.getTokenType();
final IElementType newOperatorToken = tokenMap.get(signTokenType);
final int precedence2 = ParenthesesUtils.getPrecedenceForOperator(newOperatorToken);
- parentheses = precedence1 >= precedence2 || !ParenthesesUtils.isCommutativeBinaryOperator(newOperatorToken);
+ parentheses = precedence1 >= precedence2 || !ParenthesesUtils.isCommutativeOperator(newOperatorToken);
}
else {
parentheses = false;
diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceWithOperatorAssignmentIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceWithOperatorAssignmentIntention.java
index 6e61e4dfe77a..f4d0397fcc93 100644
--- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceWithOperatorAssignmentIntention.java
+++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceWithOperatorAssignmentIntention.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers
+ * 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.
@@ -17,50 +17,53 @@ package com.siyeh.ipp.opassign;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
-import com.intellij.util.IncorrectOperationException;
import com.siyeh.IntentionPowerPackBundle;
import com.siyeh.ipp.base.MutablyNamedIntention;
import com.siyeh.ipp.base.PsiElementPredicate;
import org.jetbrains.annotations.NotNull;
-public class ReplaceWithOperatorAssignmentIntention
- extends MutablyNamedIntention {
+public class ReplaceWithOperatorAssignmentIntention extends MutablyNamedIntention {
public String getTextForElement(PsiElement element) {
- final PsiAssignmentExpression assignmentExpression =
- (PsiAssignmentExpression)element;
+ final PsiAssignmentExpression assignmentExpression = (PsiAssignmentExpression)element;
final PsiExpression rhs = assignmentExpression.getRExpression();
- final PsiBinaryExpression expression =
- (PsiBinaryExpression)PsiUtil.deparenthesizeExpression(rhs);
+ final PsiPolyadicExpression expression = (PsiPolyadicExpression)PsiUtil.deparenthesizeExpression(rhs);
assert expression != null;
- final PsiJavaToken sign = expression.getOperationSign();
+ final PsiJavaToken sign = expression.getTokenBeforeOperand(expression.getOperands()[1]);
+ assert sign != null;
final String operator = sign.getText();
- return IntentionPowerPackBundle.message(
- "replace.assignment.with.operator.assignment.intention.name",
- operator);
+ return IntentionPowerPackBundle.message("replace.assignment.with.operator.assignment.intention.name", operator);
}
@NotNull
public PsiElementPredicate getElementPredicate() {
- return new AssignmentExpressionReplaceableWithOperatorAssigment();
+ return new ReplaceableWithOperatorAssignmentPredicate();
}
- public void processIntention(@NotNull PsiElement element)
- throws IncorrectOperationException {
- final PsiAssignmentExpression expression =
- (PsiAssignmentExpression)element;
- final PsiExpression rhs =
- expression.getRExpression();
- final PsiBinaryExpression binaryExpression =
- (PsiBinaryExpression)PsiUtil.deparenthesizeExpression(rhs);
+ public void processIntention(@NotNull PsiElement element){
+ final PsiAssignmentExpression expression = (PsiAssignmentExpression)element;
+ final PsiExpression rhs = expression.getRExpression();
+ final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)PsiUtil.deparenthesizeExpression(rhs);
+ assert polyadicExpression != null;
final PsiExpression lhs = expression.getLExpression();
assert rhs != null;
- final PsiJavaToken sign = binaryExpression.getOperationSign();
- final String operand = sign.getText();
- final PsiExpression binaryRhs = binaryExpression.getROperand();
- assert binaryRhs != null;
- final String newExpression =
- lhs.getText() + operand + '=' + binaryRhs.getText();
- replaceExpression(newExpression, expression);
+ final PsiExpression[] operands = polyadicExpression.getOperands();
+ final PsiJavaToken sign = polyadicExpression.getTokenBeforeOperand(operands[1]);
+ assert sign != null;
+ final String signText = sign.getText();
+ final StringBuilder newExpression = new StringBuilder();
+ newExpression.append(lhs.getText()).append(signText).append('=');
+ boolean token = false;
+ for (int i = 1; i < operands.length; i++) {
+ final PsiExpression operand = operands[i];
+ if (token) {
+ newExpression.append(signText);
+ }
+ else {
+ token = true;
+ }
+ newExpression.append(operand.getText());
+ }
+ replaceExpression(newExpression.toString(), expression);
}
} \ No newline at end of file
diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/AssignmentExpressionReplaceableWithOperatorAssigment.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceableWithOperatorAssignmentPredicate.java
index ca0f09e7ef42..1f397a5a57bf 100644
--- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/AssignmentExpressionReplaceableWithOperatorAssigment.java
+++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceableWithOperatorAssignmentPredicate.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2003-2007 Dave Griffith, Bas Leijdekkers
+ * 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.
@@ -23,45 +23,37 @@ import com.siyeh.ipp.psiutils.EquivalenceChecker;
import com.siyeh.ipp.psiutils.ErrorUtil;
import com.siyeh.ipp.psiutils.SideEffectChecker;
-class AssignmentExpressionReplaceableWithOperatorAssigment
- implements PsiElementPredicate {
+class ReplaceableWithOperatorAssignmentPredicate implements PsiElementPredicate {
public boolean satisfiedBy(PsiElement element) {
if (!(element instanceof PsiAssignmentExpression)) {
return false;
}
- final PsiAssignmentExpression assignment =
- (PsiAssignmentExpression)element;
+ final PsiAssignmentExpression assignment = (PsiAssignmentExpression)element;
final IElementType tokenType = assignment.getOperationTokenType();
if (!JavaTokenType.EQ.equals(tokenType)) {
return false;
}
final PsiExpression rhs = assignment.getRExpression();
final PsiExpression expression = PsiUtil.deparenthesizeExpression(rhs);
- if (expression == null) {
+ if (!(expression instanceof PsiPolyadicExpression)) {
return false;
}
- if (!(expression instanceof PsiBinaryExpression)) {
+ final PsiPolyadicExpression polyadicExpression = (PsiPolyadicExpression)expression;
+ final PsiExpression[] operands = polyadicExpression.getOperands();
+ if (operands.length < 2) {
return false;
}
- final PsiBinaryExpression binaryRhs = (PsiBinaryExpression)expression;
- final PsiExpression rhsRhs = binaryRhs.getROperand();
- final PsiExpression rhsLhs = binaryRhs.getLOperand();
- if (rhsRhs == null) {
- return false;
- }
- final IElementType rhsTokenType = binaryRhs.getOperationTokenType();
- if (JavaTokenType.OROR.equals(rhsTokenType) ||
- JavaTokenType.ANDAND.equals(rhsTokenType) ||
- JavaTokenType.EQEQ.equals(rhsTokenType) ||
- JavaTokenType.NE.equals(rhsTokenType)) {
+ final IElementType rhsTokenType = polyadicExpression.getOperationTokenType();
+ if (JavaTokenType.OROR.equals(rhsTokenType) || JavaTokenType.ANDAND.equals(rhsTokenType) ||
+ JavaTokenType.EQEQ.equals(rhsTokenType) || JavaTokenType.NE.equals(rhsTokenType)) {
return false;
}
final PsiExpression lhs = assignment.getLExpression();
if (SideEffectChecker.mayHaveSideEffects(lhs)) {
return false;
}
- if (!EquivalenceChecker.expressionsAreEquivalent(lhs, rhsLhs)) {
+ if (!EquivalenceChecker.expressionsAreEquivalent(lhs, operands[0])) {
return false;
}
return !ErrorUtil.containsError(element);