From 90dbeb07959640a63e0916ac59e2f18eaf1caef4 Mon Sep 17 00:00:00 2001 From: Dave Griffith Date: Fri, 28 Jan 2005 17:43:44 +0300 Subject: [PATCH] (no message) --- .../ig/confusing/NegatedIfElseInspection.java | 32 ++++++++++++++++--- .../src/com/siyeh/ig/psiutils/BoolUtils.java | 28 +++++++++------- .../siyeh/ig/psiutils/ComparisonUtils.java | 24 +++++++++++++- 3 files changed, 67 insertions(+), 17 deletions(-) diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/confusing/NegatedIfElseInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/confusing/NegatedIfElseInspection.java index d5998486d92a..300ef2877031 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/confusing/NegatedIfElseInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/confusing/NegatedIfElseInspection.java @@ -1,18 +1,19 @@ package com.siyeh.ig.confusing; import com.intellij.codeInspection.InspectionManager; +import com.intellij.codeInspection.ProblemDescriptor; +import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; -import com.siyeh.ig.BaseInspection; -import com.siyeh.ig.BaseInspectionVisitor; -import com.siyeh.ig.GroupNames; -import com.siyeh.ig.StatementInspection; +import com.siyeh.ig.*; +import com.siyeh.ig.psiutils.BoolUtils; import com.siyeh.ig.ui.SingleCheckboxOptionsPanel; import javax.swing.*; public class NegatedIfElseInspection extends StatementInspection { public boolean m_ignoreNegatedNullComparison = true; + private final NegatedIfElseFix fix = new NegatedIfElseFix(); public String getDisplayName() { return "If statement with negated condition"; @@ -35,6 +36,29 @@ public class NegatedIfElseInspection extends StatementInspection { this, "m_ignoreNegatedNullComparison"); } + protected InspectionGadgetsFix buildFix(PsiElement location){ + return fix; + } + + private static class NegatedIfElseFix extends InspectionGadgetsFix{ + + + public String getName(){ + return "Invert If Condition"; + } + + public void applyFix(Project project, + ProblemDescriptor problemDescriptor){ + final PsiElement ifToken = problemDescriptor.getPsiElement(); + final PsiIfStatement ifStatement = (PsiIfStatement) ifToken.getParent(); + final PsiStatement elseBranch = ifStatement.getElseBranch(); + final PsiStatement thenBranch = ifStatement.getThenBranch(); + final PsiExpression condition = ifStatement.getCondition(); + final String negatedCondition = BoolUtils.getNegatedExpressionText(condition); + final String newStatement = "if("+ negatedCondition + ')' +elseBranch.getText() + " else " + thenBranch.getText(); + replaceStatement(project, ifStatement, newStatement); + } + } private class NegatedIfElseVisitor extends BaseInspectionVisitor { private NegatedIfElseVisitor(BaseInspection inspection, InspectionManager inspectionManager, boolean isOnTheFly) { super(inspection, inspectionManager, isOnTheFly); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/BoolUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/BoolUtils.java index 86c390d5963a..057739797c9c 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/BoolUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/BoolUtils.java @@ -1,9 +1,6 @@ package com.siyeh.ig.psiutils; -import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiJavaToken; -import com.intellij.psi.PsiPrefixExpression; +import com.intellij.psi.*; public class BoolUtils { private BoolUtils() { @@ -24,15 +21,22 @@ public class BoolUtils { final PsiExpression operand = prefixExp.getOperand(); return ParenthesesUtils.stripParentheses(operand); } - - public static String getNegatedExpressionText(PsiExpression condition) { - if (isNegation(condition)) { - final PsiExpression negatedCondition = getNegated(condition); - return negatedCondition.getText(); - } else if (ParenthesesUtils.getPrecendence(condition) > - ParenthesesUtils.PREFIX_PRECEDENCE) { + public static String getNegatedExpressionText(PsiExpression condition){ + if(BoolUtils.isNegation(condition)){ + final PsiExpression negated = getNegated(condition); + return negated.getText(); + } else if(ComparisonUtils.isComparison(condition)){ + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) condition; + final PsiJavaToken sign = binaryExpression.getOperationSign(); + final String operator = sign.getText(); + final String negatedComparison = ComparisonUtils.getNegatedComparison(operator); + final PsiExpression lhs = binaryExpression.getLOperand(); + final PsiExpression rhs = binaryExpression.getROperand(); + return lhs.getText() + negatedComparison + rhs.getText(); + } else if(ParenthesesUtils.getPrecendence(condition) > + ParenthesesUtils.PREFIX_PRECEDENCE){ return "!(" + condition.getText() + ')'; - } else { + } else{ return '!' + condition.getText(); } diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ComparisonUtils.java b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ComparisonUtils.java index 5911c827dc81..60ae5609ce83 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ComparisonUtils.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/psiutils/ComparisonUtils.java @@ -3,6 +3,7 @@ package com.siyeh.ig.psiutils; import com.intellij.psi.JavaTokenType; import com.intellij.psi.PsiBinaryExpression; import com.intellij.psi.PsiJavaToken; +import com.intellij.psi.PsiExpression; import com.intellij.psi.tree.IElementType; import java.util.HashMap; @@ -14,7 +15,7 @@ public class ComparisonUtils { private ComparisonUtils() { super(); } - + private static final Map s_invertedComparisons = new HashMap(6); private static final Set s_comparisonStrings = new HashSet(6); private static final Map s_swappedComparisons = new HashMap(6); @@ -33,8 +34,25 @@ public class ComparisonUtils { s_swappedComparisons.put(">=", "<="); s_swappedComparisons.put("<=", ">="); + s_invertedComparisons.put("==", "!="); + s_invertedComparisons.put("!=", "=="); + s_invertedComparisons.put(">", "<="); + s_invertedComparisons.put("<", ">="); + s_invertedComparisons.put(">=", "<"); + s_invertedComparisons.put("<=", ">"); + } + public static boolean isComparison(PsiExpression exp){ + if(!(exp instanceof PsiBinaryExpression)){ + return false; + } + final PsiBinaryExpression binaryExpression = (PsiBinaryExpression) exp; + final PsiJavaToken sign = binaryExpression.getOperationSign(); + final String operation = sign.getText(); + return s_comparisonStrings.contains(operation); + } + public static boolean isComparison(String str) { return s_comparisonStrings.contains(str); } @@ -52,4 +70,8 @@ public class ComparisonUtils { return tokenType.equals(JavaTokenType.EQEQ) || tokenType.equals(JavaTokenType.NE); } + public static String getNegatedComparison(String str){ + return (String) s_invertedComparisons.get(str); + } + }