diff options
author | Jean-Baptiste Queru <jbq@google.com> | 2013-04-01 14:41:51 -0700 |
---|---|---|
committer | Jean-Baptiste Queru <jbq@google.com> | 2013-04-01 14:41:51 -0700 |
commit | 2bd2b7c2623d4266384e890271869efc044aabff (patch) | |
tree | 0b31f50e55975b6354ed458314e17b4441bb4e17 /plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign | |
parent | 1d526b16d476792ca7ce47616d55833115e8d6ab (diff) | |
download | idea-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.java | 49 | ||||
-rw-r--r-- | plugins/IntentionPowerPak/src/com/siyeh/ipp/opassign/ReplaceWithOperatorAssignmentIntention.java | 59 | ||||
-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); |