From a2c55164f28101dc6b5fec3259f3f211a364f2ce Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 15 Jul 2011 14:02:24 +0400 Subject: [PATCH] some binaryexpression usages removed --- .../expression/EvaluatorBuilderImpl.java | 31 ++-------- .../ConcatenationToMessageFormatAction.java | 2 +- .../codeInspection/dataFlow/DfaUtil.java | 2 +- .../dataFlow/value/DfaValueFactory.java | 2 +- .../inferNullity/NullityInferrer.java | 29 ++++----- .../element/ExcludeSillyAssignment.java | 2 +- .../tree/java/ReplaceExpressionUtil.java | 5 +- .../slicer/SliceNullnessAnalyzer.java | 2 +- .../codeInsight/CodeInsightServicesUtil.java | 4 +- .../TestDataReferenceCollector.java | 14 +++-- .../inject/java/ConcatenationInjector.java | 2 +- .../util/ContextComputationProcessor.java | 6 -- .../siyeh/ipp/bool/ConjunctionPredicate.java | 6 +- .../siyeh/ipp/bool/DemorgansIntention.java | 59 ++++++++----------- .../ipp/bool/FlipConjunctionIntention.java | 58 +++++++++--------- .../chartostring/CharToStringPredicate.java | 8 +-- .../chartostring/StringToCharPredicate.java | 37 ++++++------ .../siyeh/ipp/psiutils/ParenthesesUtils.java | 8 +-- 18 files changed, 117 insertions(+), 160 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java index c0d6cd662bc3..40e387c288ca 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/expression/EvaluatorBuilderImpl.java @@ -296,28 +296,6 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { } } - @Override - public void visitBinaryExpression(PsiBinaryExpression expression) { - if (LOG.isDebugEnabled()) { - LOG.debug("visitBinaryExpression " + expression); - } - final PsiExpression lOperand = expression.getLOperand(); - lOperand.accept(this); - Evaluator lResult = myResult; - final PsiExpression rOperand = expression.getROperand(); - if(rOperand == null) { - throwEvaluateException(DebuggerBundle.message("evaluation.error.invalid.expression", expression.getText())); return; - } - rOperand.accept(this); - Evaluator rResult = myResult; - IElementType opType = expression.getOperationTokenType(); - PsiType expressionExpectedType = expression.getType(); - if (expressionExpectedType == null) { - throwEvaluateException(DebuggerBundle.message("evaluation.error.unknown.expression.type", expression.getText())); - } - myResult = createBinaryEvaluator(lResult, lOperand.getType(), rResult, rOperand.getType(), opType, expressionExpectedType); - } - @Override public void visitPolyadicExpression(PsiPolyadicExpression wideExpression) { if (LOG.isDebugEnabled()) { @@ -336,12 +314,13 @@ public class EvaluatorBuilderImpl implements EvaluatorBuilder { expression.accept(this); Evaluator rResult = myResult; IElementType opType = wideExpression.getOperationTokenType(); - PsiType expressionExpectedType = expression.getType(); - if (expressionExpectedType == null) { + PsiType rType = expression.getType(); + if (rType == null) { throwEvaluateException(DebuggerBundle.message("evaluation.error.unknown.expression.type", expression.getText())); } - myResult = createBinaryEvaluator(result, lType, rResult, expression.getType(), opType, expressionExpectedType); - lType = TypeConversionUtil.calcTypeForBinaryExpression(lType, expressionExpectedType, opType, true); + PsiType typeForBinOp = TypeConversionUtil.calcTypeForBinaryExpression(lType, rType, opType, true); + myResult = createBinaryEvaluator(result, lType, rResult, rType, opType, typeForBinOp); + lType = typeForBinOp; result = myResult; } } diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConcatenationToMessageFormatAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConcatenationToMessageFormatAction.java index 3316c448d652..4a435898a227 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConcatenationToMessageFormatAction.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConcatenationToMessageFormatAction.java @@ -148,7 +148,7 @@ public class ConcatenationToMessageFormatAction implements IntentionAction { while (true) { final PsiElement parent = binaryExpression.getParent(); if (!(parent instanceof PsiPolyadicExpression)) return binaryExpression; - PsiPolyadicExpression parentBinaryExpression = (PsiBinaryExpression)parent; + PsiPolyadicExpression parentBinaryExpression = (PsiPolyadicExpression)parent; if (!stringType.equals(parentBinaryExpression.getType())) return binaryExpression; binaryExpression = parentBinaryExpression; } diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java index 6b3e025cb79b..740bcee30bf9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java @@ -213,7 +213,7 @@ public class DfaUtil { public static boolean allOperandsAreLiterals(@Nullable final PsiExpression expression) { if (expression == null) return false; if (expression instanceof PsiLiteralExpression) return true; - if (expression instanceof PsiBinaryExpression) { + if (expression instanceof PsiPolyadicExpression) { Stack stack = new Stack(); stack.add(expression); while (!stack.isEmpty()) { diff --git a/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java b/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java index fe6e7499adac..6f06b9521fa9 100644 --- a/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java +++ b/java/java-impl/src/com/intellij/codeInspection/dataFlow/value/DfaValueFactory.java @@ -76,7 +76,7 @@ public class DfaValueFactory { if (!(psiSource instanceof PsiField)) { PsiExpression initializer = variable.getInitializer(); - if (initializer instanceof PsiBinaryExpression && variable.hasModifierProperty(PsiModifier.FINAL)) { + if (initializer instanceof PsiPolyadicExpression && variable.hasModifierProperty(PsiModifier.FINAL)) { PsiType type = initializer.getType(); if (type != null && type.equalsToText("java.lang.String")) { return getNotNullFactory().create(type); diff --git a/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java b/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java index ce8f7971d4f2..a6c9da331a8a 100644 --- a/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java +++ b/java/java-impl/src/com/intellij/codeInspection/inferNullity/NullityInferrer.java @@ -261,16 +261,13 @@ public class NullityInferrer { PsiExpression elseExpression, PsiExpression rOperand, PsiExpression lOperand) { - if (rOperand instanceof PsiLiteralExpression && "null".equals(rOperand.getText())) { - if (lOperand instanceof PsiReferenceExpression) { - final PsiElement resolve = ((PsiReferenceExpression)lOperand).resolve(); - if (resolve instanceof PsiVariable) { - if (((PsiBinaryExpression)condition).getOperationTokenType() == JavaTokenType.EQEQ) { - if (elseExpression instanceof PsiReferenceExpression && ((PsiReferenceExpression)elseExpression).resolve() == resolve) { - return true; - } - } - } + if (rOperand instanceof PsiLiteralExpression && "null".equals(rOperand.getText()) && lOperand instanceof PsiReferenceExpression) { + final PsiElement resolve = ((PsiReferenceExpression)lOperand).resolve(); + if (resolve instanceof PsiVariable && + ((PsiBinaryExpression)condition).getOperationTokenType() == JavaTokenType.EQEQ && + elseExpression instanceof PsiReferenceExpression && + ((PsiReferenceExpression)elseExpression).resolve() == resolve) { + return true; } } return false; @@ -546,11 +543,10 @@ public class NullityInferrer { opposite = lOperand; } if (opposite != null && opposite.getType() == PsiType.NULL) { - if (parent.getParent() instanceof PsiAssertStatement) { - if (((PsiBinaryExpression)parent).getOperationTokenType() == JavaTokenType.NE) { - registerNotNullAnnotation(parameter); - return true; - } + if (parent.getParent() instanceof PsiAssertStatement && + ((PsiBinaryExpression)parent).getOperationTokenType() == JavaTokenType.NE) { + registerNotNullAnnotation(parameter); + return true; } registerNullableAnnotation(parameter); return true; @@ -561,7 +557,8 @@ public class NullityInferrer { if (qualifierExpression == expr) { registerNotNullAnnotation(parameter); return true; - } else { + } + else { PsiElement exprParent = expr.getParent(); while (exprParent instanceof PsiTypeCastExpression || exprParent instanceof PsiParenthesizedExpression) { if (qualifierExpression == exprParent) { diff --git a/java/java-impl/src/com/intellij/psi/filters/element/ExcludeSillyAssignment.java b/java/java-impl/src/com/intellij/psi/filters/element/ExcludeSillyAssignment.java index e999d77684ad..0028fa2e3847 100644 --- a/java/java-impl/src/com/intellij/psi/filters/element/ExcludeSillyAssignment.java +++ b/java/java-impl/src/com/intellij/psi/filters/element/ExcludeSillyAssignment.java @@ -31,7 +31,7 @@ public class ExcludeSillyAssignment implements ElementFilter { PsiElement each = context; while (each != null && !(each instanceof PsiFile)) { - if (each instanceof PsiExpressionList || each instanceof PsiPrefixExpression || each instanceof PsiBinaryExpression) { + if (each instanceof PsiExpressionList || each instanceof PsiPrefixExpression || each instanceof PsiPolyadicExpression) { return true; } diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java index 5c40945023ed..0f89e33705df 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/ReplaceExpressionUtil.java @@ -18,7 +18,6 @@ package com.intellij.psi.impl.source.tree.java; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiBinaryExpression; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiPolyadicExpression; import com.intellij.psi.impl.source.SourceTreeToPsiMap; @@ -49,7 +48,7 @@ public class ReplaceExpressionUtil { else if (i == JavaElementType.BINARY_EXPRESSION || i == JavaElementType.POLYADIC_EXPRESSION) { if (priority < parentPriority) return true; PsiElement element = SourceTreeToPsiMap.treeElementToPsi(oldParent); - IElementType opType = i == JavaElementType.BINARY_EXPRESSION ? ((PsiBinaryExpression)element).getOperationTokenType() : ((PsiPolyadicExpression)element).getOperationTokenType(); + IElementType opType = ((PsiPolyadicExpression)element).getOperationTokenType(); return ((CompositeElement)oldParent).getChildRole(oldExpr) != ChildRole.LOPERAND && opType != JavaTokenType.PLUS && opType != JavaTokenType.ASTERISK && @@ -105,7 +104,7 @@ public class ReplaceExpressionUtil { } else if (i == JavaElementType.BINARY_EXPRESSION || i == JavaElementType.POLYADIC_EXPRESSION) { PsiElement element = SourceTreeToPsiMap.treeElementToPsi(expr); - IElementType opType = i == JavaElementType.BINARY_EXPRESSION ? ((PsiBinaryExpression)element).getOperationTokenType() : ((PsiPolyadicExpression)element).getOperationTokenType(); + IElementType opType = ((PsiPolyadicExpression)element).getOperationTokenType(); if (opType == JavaTokenType.OROR) { return 2; } diff --git a/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java b/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java index 5149517b9a7c..70cc0535c9c3 100644 --- a/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java +++ b/java/java-impl/src/com/intellij/slicer/SliceNullnessAnalyzer.java @@ -224,7 +224,7 @@ public class SliceNullnessAnalyzer { if (method != null && AnnotationUtil.isNotNull(method)) return DfaUtil.Nullness.NOT_NULL; if (method != null && AnnotationUtil.isNullable(method)) return DfaUtil.Nullness.NULL; } - if (value instanceof PsiBinaryExpression && ((PsiBinaryExpression)value).getOperationTokenType() == JavaTokenType.PLUS) { + if (value instanceof PsiPolyadicExpression && ((PsiPolyadicExpression)value).getOperationTokenType() == JavaTokenType.PLUS) { return DfaUtil.Nullness.NOT_NULL; // "xxx" + var } diff --git a/java/openapi/src/com/intellij/codeInsight/CodeInsightServicesUtil.java b/java/openapi/src/com/intellij/codeInsight/CodeInsightServicesUtil.java index 5bac063e4730..b440e4cef490 100644 --- a/java/openapi/src/com/intellij/codeInsight/CodeInsightServicesUtil.java +++ b/java/openapi/src/com/intellij/codeInsight/CodeInsightServicesUtil.java @@ -42,7 +42,7 @@ public class CodeInsightServicesUtil { for (int i = 0; i < ourTokenMap.length; i++) { IElementType tokenType = ourTokenMap[i]; if (operationSign == tokenType) { - expression = (PsiBinaryExpression)expression.copy(); + expression = (PsiPolyadicExpression)expression.copy(); PsiExpression[] operands = expression.getOperands(); for (int o = 0; o < operands.length; o++) { PsiExpression op = operands[o]; @@ -80,7 +80,7 @@ public class CodeInsightServicesUtil { } PsiPrefixExpression result = (PsiPrefixExpression)factory.createExpressionFromText("!(a)", null); - if (!(booleanExpression instanceof PsiBinaryExpression)) { + if (!(booleanExpression instanceof PsiPolyadicExpression)) { result.getOperand().replace(booleanExpression); } else { diff --git a/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java b/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java index a5c34b66d4ab..6527249b1237 100644 --- a/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java +++ b/plugins/IdeaTestAssistant/src/com/intellij/testAssistant/TestDataReferenceCollector.java @@ -122,14 +122,16 @@ public class TestDataReferenceCollector { @Nullable private String evaluate(PsiExpression expression, Map> arguments) { - if (expression instanceof PsiBinaryExpression) { - PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression; + if (expression instanceof PsiPolyadicExpression) { + PsiPolyadicExpression binaryExpression = (PsiPolyadicExpression)expression; if (binaryExpression.getOperationTokenType() == JavaTokenType.PLUS) { - String lhs = evaluate(binaryExpression.getLOperand(), arguments); - String rhs = evaluate(binaryExpression.getROperand(), arguments); - if (lhs != null && rhs != null) { - return lhs + rhs; + String r = ""; + for (PsiExpression op : binaryExpression.getOperands()) { + String lhs = evaluate(op, arguments); + if (lhs == null) return null; + r += lhs; } + return r; } } else if (expression instanceof PsiLiteralExpression) { diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java index 67689d6fe807..10008e8aab33 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java @@ -407,7 +407,7 @@ public class ConcatenationInjector implements ConcatenationAwareInjector { return true; } } - else if (parent instanceof PsiBinaryExpression || parent instanceof PsiPolyadicExpression) { + else if (parent instanceof PsiPolyadicExpression) { return true; } return false; diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java index 7fedc7cdb25e..b4b5bb111e89 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/ContextComputationProcessor.java @@ -76,12 +76,6 @@ public class ContextComputationProcessor { collectOperands(((PsiConditionalExpression)expression).getThenExpression(), result, unparsable); collectOperands(((PsiConditionalExpression)expression).getElseExpression(), result, unparsable); } - else if (expression instanceof PsiBinaryExpression && - ((PsiBinaryExpression)expression).getOperationTokenType() == JavaTokenType.PLUS) { - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)expression; - collectOperands(binaryExpression.getLOperand(), result, unparsable); - collectOperands(binaryExpression.getROperand(), result, unparsable); - } else if (expression instanceof PsiPolyadicExpression && ((PsiPolyadicExpression)expression).getOperationTokenType() == JavaTokenType.PLUS) { final PsiPolyadicExpression binaryExpression = (PsiPolyadicExpression)expression; diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/ConjunctionPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/ConjunctionPredicate.java index fc5bfc3598de..b714dd024f81 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/ConjunctionPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/ConjunctionPredicate.java @@ -16,8 +16,8 @@ package com.siyeh.ipp.bool; import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiBinaryExpression; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiPolyadicExpression; import com.intellij.psi.tree.IElementType; import com.siyeh.ipp.base.PsiElementPredicate; import com.siyeh.ipp.psiutils.ErrorUtil; @@ -25,10 +25,10 @@ import com.siyeh.ipp.psiutils.ErrorUtil; class ConjunctionPredicate implements PsiElementPredicate{ public boolean satisfiedBy(PsiElement element){ - if(!(element instanceof PsiBinaryExpression)){ + if(!(element instanceof PsiPolyadicExpression)){ return false; } - final PsiBinaryExpression expression = (PsiBinaryExpression) element; + final PsiPolyadicExpression expression = (PsiPolyadicExpression) element; final IElementType tokenType = expression.getOperationTokenType(); if (!tokenType.equals(JavaTokenType.ANDAND) && !tokenType.equals(JavaTokenType.OROR)) { diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/DemorgansIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/DemorgansIntention.java index 0e9479cfbe01..0b94efb94595 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/DemorgansIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/DemorgansIntention.java @@ -18,19 +18,19 @@ package com.siyeh.ipp.bool; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; +import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.base.MutablyNamedIntention; import com.siyeh.ipp.base.PsiElementPredicate; import com.siyeh.ipp.psiutils.BoolUtils; import com.siyeh.ipp.psiutils.ComparisonUtils; import com.siyeh.ipp.psiutils.ParenthesesUtils; -import com.siyeh.IntentionPowerPackBundle; import org.jetbrains.annotations.NotNull; public class DemorgansIntention extends MutablyNamedIntention { protected String getTextForElement(PsiElement element) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)element; + final PsiPolyadicExpression binaryExpression = + (PsiPolyadicExpression)element; final IElementType tokenType = binaryExpression.getOperationTokenType(); if (tokenType.equals(JavaTokenType.ANDAND)) { return IntentionPowerPackBundle.message("demorgans.intention.name1"); @@ -44,14 +44,14 @@ public class DemorgansIntention extends MutablyNamedIntention { return new ConjunctionPredicate(); } - public void processIntention(PsiElement element) + public void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { - PsiBinaryExpression exp = - (PsiBinaryExpression)element; + PsiPolyadicExpression exp = + (PsiPolyadicExpression)element; final IElementType tokenType = exp.getOperationTokenType(); PsiElement parent = exp.getParent(); while (isConjunctionExpression(parent, tokenType)) { - exp = (PsiBinaryExpression)parent; + exp = (PsiPolyadicExpression)parent; assert exp != null; parent = exp.getParent(); } @@ -61,33 +61,20 @@ public class DemorgansIntention extends MutablyNamedIntention { exp); } - private static String convertConjunctionExpression(PsiBinaryExpression exp, + private static String convertConjunctionExpression(PsiPolyadicExpression exp, IElementType tokenType) { - final PsiExpression lhs = exp.getLOperand(); - final String lhsText; - if (isConjunctionExpression(lhs, tokenType)) { - lhsText = convertConjunctionExpression((PsiBinaryExpression)lhs, - tokenType); - } else { - lhsText = convertLeafExpression(lhs); - } - final PsiExpression rhs = exp.getROperand(); - final String rhsText; - if (isConjunctionExpression(rhs, tokenType)) { - rhsText = convertConjunctionExpression((PsiBinaryExpression)rhs, - tokenType); - } else { - rhsText = convertLeafExpression(rhs); - } - - final String flippedConjunction; - if (tokenType.equals(JavaTokenType.ANDAND)) { - flippedConjunction = "||"; - } else { - flippedConjunction = "&&"; - } - - return lhsText + flippedConjunction + rhsText; + final String flippedConjunction; + if (tokenType.equals(JavaTokenType.ANDAND)) { + flippedConjunction = "||"; + } else { + flippedConjunction = "&&"; + } + String result = null; + for (PsiExpression expression : exp.getOperands()) { + String lhsText = convertLeafExpression(expression); + result = result == null ? lhsText : result + flippedConjunction + lhsText; + } + return result; } private static String convertLeafExpression(PsiExpression condition) { @@ -120,11 +107,11 @@ public class DemorgansIntention extends MutablyNamedIntention { private static boolean isConjunctionExpression(PsiElement exp, IElementType conjunctionType) { - if (!(exp instanceof PsiBinaryExpression)) { + if (!(exp instanceof PsiPolyadicExpression)) { return false; } - final PsiBinaryExpression binExp = (PsiBinaryExpression)exp; + final PsiPolyadicExpression binExp = (PsiPolyadicExpression)exp; final IElementType tokenType = binExp.getOperationTokenType(); return tokenType.equals(conjunctionType); } -} \ No newline at end of file +} diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/FlipConjunctionIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/FlipConjunctionIntention.java index c9221f48aa96..79ace4ee8877 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/FlipConjunctionIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/bool/FlipConjunctionIntention.java @@ -18,17 +18,18 @@ package com.siyeh.ipp.bool; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.util.IncorrectOperationException; +import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.base.MutablyNamedIntention; import com.siyeh.ipp.base.PsiElementPredicate; -import com.siyeh.IntentionPowerPackBundle; import org.jetbrains.annotations.NotNull; public class FlipConjunctionIntention extends MutablyNamedIntention { protected String getTextForElement(PsiElement element) { - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)element; - final PsiJavaToken sign = binaryExpression.getOperationSign(); + final PsiPolyadicExpression binaryExpression = + (PsiPolyadicExpression)element; + PsiExpression op = binaryExpression.getOperands()[1]; + final PsiJavaToken sign = binaryExpression.getTokenBeforeOperand(op); return IntentionPowerPackBundle.message("flip.smth.intention.name", sign.getText()); } @@ -38,11 +39,10 @@ public class FlipConjunctionIntention extends MutablyNamedIntention { return new ConjunctionPredicate(); } - public void processIntention(PsiElement element) + public void processIntention(@NotNull PsiElement element) throws IncorrectOperationException { PsiExpression exp = (PsiExpression)element; - final PsiBinaryExpression binaryExpression = (PsiBinaryExpression)exp; - assert binaryExpression != null; + final PsiPolyadicExpression binaryExpression = (PsiPolyadicExpression)exp; final IElementType conjunctionType = binaryExpression.getOperationTokenType(); PsiElement parent = exp.getParent(); while (isConjunctionExpression(parent, conjunctionType)) { @@ -56,33 +56,35 @@ public class FlipConjunctionIntention extends MutablyNamedIntention { private static String flipExpression(PsiExpression expression, IElementType conjunctionType) { - if (isConjunctionExpression(expression, conjunctionType)) { - final PsiBinaryExpression andExpression = - (PsiBinaryExpression)expression; - final PsiExpression rhs = andExpression.getROperand(); - final PsiExpression lhs = andExpression.getLOperand(); - final String conjunctionSign; - if (conjunctionType.equals(JavaTokenType.ANDAND)) { - conjunctionSign = "&&"; - } else { - conjunctionSign = "||"; - } - return flipExpression(rhs, conjunctionType) + ' ' + - conjunctionSign + ' ' + - flipExpression(lhs, conjunctionType); - } else { - return expression.getText(); - } + if (!isConjunctionExpression(expression, conjunctionType)) { + return expression.getText(); + } + final PsiPolyadicExpression andExpression = + (PsiPolyadicExpression)expression; + final String conjunctionSign; + if (conjunctionType.equals(JavaTokenType.ANDAND)) { + conjunctionSign = "&&"; + } else { + conjunctionSign = "||"; + } + String r = null; + PsiExpression[] operands = andExpression.getOperands(); + for (int i = operands.length - 1; i >= 0; i--) { + PsiExpression op = operands[i]; + String flip = flipExpression(op, conjunctionType); + r = r == null ? flip : r + ' ' + conjunctionSign + ' ' + flip; + } + return r; } private static boolean isConjunctionExpression( PsiElement element, IElementType conjunctionType) { - if (!(element instanceof PsiBinaryExpression)) { + if (!(element instanceof PsiPolyadicExpression)) { return false; } - final PsiBinaryExpression binaryExpression = - (PsiBinaryExpression)element; + final PsiPolyadicExpression binaryExpression = + (PsiPolyadicExpression)element; final IElementType tokenType = binaryExpression.getOperationTokenType(); return tokenType.equals(conjunctionType); } -} \ No newline at end of file +} diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java index 9a1689a2b5c6..77411f7bf704 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/CharToStringPredicate.java @@ -47,9 +47,9 @@ class CharToStringPredicate implements PsiElementPredicate{ private static boolean isInConcatenationContext(PsiElement element){ final PsiElement parent = element.getParent(); - if(parent instanceof PsiBinaryExpression){ - final PsiBinaryExpression parentExpression = - (PsiBinaryExpression) parent; + if(parent instanceof PsiPolyadicExpression){ + final PsiPolyadicExpression parentExpression = + (PsiPolyadicExpression) parent; final PsiType parentType = parentExpression.getType(); if(parentType == null){ return false; @@ -116,4 +116,4 @@ class CharToStringPredicate implements PsiElementPredicate{ } return false; } -} \ No newline at end of file +} diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java index 825aa94e7f09..405f52e274f9 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/chartostring/StringToCharPredicate.java @@ -17,6 +17,7 @@ package com.siyeh.ipp.chartostring; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.util.ArrayUtil; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.NonNls; @@ -45,9 +46,9 @@ class StringToCharPredicate implements PsiElementPredicate{ private static boolean isInConcatenationContext(PsiElement element){ final PsiElement parent = element.getParent(); - if(parent instanceof PsiBinaryExpression){ - final PsiBinaryExpression parentExpression = - (PsiBinaryExpression) parent; + if(parent instanceof PsiPolyadicExpression){ + final PsiPolyadicExpression parentExpression = + (PsiPolyadicExpression) parent; final PsiType parentType = parentExpression.getType(); if(parentType == null){ return false; @@ -56,25 +57,21 @@ class StringToCharPredicate implements PsiElementPredicate{ if(!"java.lang.String".equals(parentTypeText)){ return false; } - final PsiExpression lhs = parentExpression.getLOperand(); - final PsiExpression rhs = parentExpression.getROperand(); - if(rhs == null){ - return false; - } - final PsiExpression otherOperand; - if(lhs.equals(element)){ - otherOperand = rhs; - } else{ - otherOperand = lhs; - } + if (parentExpression.getOperationTokenType() != JavaTokenType.PLUS) return false; + PsiExpression[] operands = parentExpression.getOperands(); + int n = ArrayUtil.indexOf(operands, element); + if (n == -1) return false; + for (int i=0; i<=n+1 && i