From 67819a66c9d9f08baabd49a2baecd9aa02e4b841 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 10 Feb 2005 20:05:13 +0300 Subject: [PATCH] (no message) --- .../com/intellij/psi/JavaElementVisitor.java | 4 +- .../psi/PsiRecursiveElementVisitor.java | 4 - .../ComparingReferencesInspection.java | 4 - .../after.java.template | 8 + .../before.java.template | 10 ++ .../Remove Redundant 'else'/description.html | 8 + .../after.java.template | 5 + .../before.java.template | 5 + .../description.html | 7 + .../com/intellij/analysis/AnalysisScope.java | 4 - .../intellij/codeInsight/CodeInsightUtil.java | 4 - .../intellij/codeInsight/ExceptionUtil.java | 4 - .../completion/CodeCompletionHandlerBase.java | 4 - .../daemon/impl/analysis/HighlightUtil.java | 1 + .../impl/analysis/XmlHighlightVisitor.java | 3 - .../quickfix/RemoveRedundantElseAction.java | 2 +- .../SimplifyBooleanExpressionFix.java | 144 ++++++++++++++++++ .../AfterSemicolonEnterProcessor.java | 4 - .../folding/impl/FoldingPolicy.java | 3 - .../impl/SimplifyBooleanExpressionAction.java | 66 ++++++++ .../impl/config/IntentionManagerImpl.java | 5 +- .../dataFlow/DataFlowInspection.java | 30 +++- .../defUse/DefUseInspection.java | 4 - .../equalsAndHashcode/EqualsAndHashcode.java | 4 - .../localCanBeFinal/LocalCanBeFinal.java | 3 - .../RedundantTypeArgsInspection.java | 2 - .../CyclicDependenciesBuilder.java | 6 - .../debugger/engine/PositionManagerImpl.java | 4 - .../projectView/impl/nodes/ClassTreeNode.java | 3 - .../BackwardDependenciesBuilder.java | 3 - .../ForwardDependenciesBuilder.java | 13 +- .../impl/repositoryCache/RecordUtil.java | 4 - .../impl/source/PsiTypeCodeFragmentImpl.java | 4 - .../psi/impl/source/xml/XmlDocumentImpl.java | 7 +- .../psi/impl/source/xml/XmlTagImpl.java | 1 - .../ConvertToInstanceMethodProcessor.java | 4 - .../refactoring/util/RefactoringUtil.java | 4 - .../util/duplicates/DuplicatesFinder.java | 8 - 38 files changed, 295 insertions(+), 108 deletions(-) create mode 100644 resources/src/intentionDescriptions/Remove Redundant 'else'/after.java.template create mode 100644 resources/src/intentionDescriptions/Remove Redundant 'else'/before.java.template create mode 100644 resources/src/intentionDescriptions/Remove Redundant 'else'/description.html create mode 100644 resources/src/intentionDescriptions/Simplify boolean expression/after.java.template create mode 100644 resources/src/intentionDescriptions/Simplify boolean expression/before.java.template create mode 100644 resources/src/intentionDescriptions/Simplify boolean expression/description.html create mode 100644 source/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java create mode 100644 source/com/intellij/codeInsight/intention/impl/SimplifyBooleanExpressionAction.java diff --git a/openapi/src/com/intellij/psi/JavaElementVisitor.java b/openapi/src/com/intellij/psi/JavaElementVisitor.java index cc39396e304f..57b23097663c 100644 --- a/openapi/src/com/intellij/psi/JavaElementVisitor.java +++ b/openapi/src/com/intellij/psi/JavaElementVisitor.java @@ -250,7 +250,9 @@ public abstract class JavaElementVisitor { visitElement(reference); } - public abstract void visitReferenceExpression(PsiReferenceExpression expression); + public void visitReferenceExpression(PsiReferenceExpression expression) { + visitReferenceElement(expression); + } public void visitReferenceList(PsiReferenceList list) { visitElement(list); diff --git a/openapi/src/com/intellij/psi/PsiRecursiveElementVisitor.java b/openapi/src/com/intellij/psi/PsiRecursiveElementVisitor.java index 46c7f5922d44..b8b00c525327 100644 --- a/openapi/src/com/intellij/psi/PsiRecursiveElementVisitor.java +++ b/openapi/src/com/intellij/psi/PsiRecursiveElementVisitor.java @@ -10,8 +10,4 @@ public abstract class PsiRecursiveElementVisitor extends PsiElementVisitor { public void visitElement(PsiElement element) { element.acceptChildren(this); } - - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitReferenceElement(expression); - } } diff --git a/plugins/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java b/plugins/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java index 19071703d19c..03a617599e1e 100644 --- a/plugins/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java +++ b/plugins/comparingReferences/source/com/intellij/codeInspection/ComparingReferencesInspection.java @@ -75,10 +75,6 @@ public class ComparingReferencesInspection extends BaseLocalInspectionTool { final ArrayList[] problemList = new ArrayList[]{null}; where.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - super.visitElement(expression); - } - public void visitMethod(PsiMethod method) {} public void visitClass(PsiClass aClass) {} diff --git a/resources/src/intentionDescriptions/Remove Redundant 'else'/after.java.template b/resources/src/intentionDescriptions/Remove Redundant 'else'/after.java.template new file mode 100644 index 000000000000..6bbd9d56135a --- /dev/null +++ b/resources/src/intentionDescriptions/Remove Redundant 'else'/after.java.template @@ -0,0 +1,8 @@ +public class X { + void f(int i) { + if (i==0) { + return; + } + int j = 0; + } +} \ No newline at end of file diff --git a/resources/src/intentionDescriptions/Remove Redundant 'else'/before.java.template b/resources/src/intentionDescriptions/Remove Redundant 'else'/before.java.template new file mode 100644 index 000000000000..edad99d14f45 --- /dev/null +++ b/resources/src/intentionDescriptions/Remove Redundant 'else'/before.java.template @@ -0,0 +1,10 @@ +public class X { + void f(int i) { + if (i==0) { + return; + } + else { + int j = 0; + } + } +} \ No newline at end of file diff --git a/resources/src/intentionDescriptions/Remove Redundant 'else'/description.html b/resources/src/intentionDescriptions/Remove Redundant 'else'/description.html new file mode 100644 index 000000000000..33e7281919b6 --- /dev/null +++ b/resources/src/intentionDescriptions/Remove Redundant 'else'/description.html @@ -0,0 +1,8 @@ + + +This intention detaches else clause from the if statement, + if corresponding then clause never completes normally. + + + + diff --git a/resources/src/intentionDescriptions/Simplify boolean expression/after.java.template b/resources/src/intentionDescriptions/Simplify boolean expression/after.java.template new file mode 100644 index 000000000000..1dfe7b2a3f76 --- /dev/null +++ b/resources/src/intentionDescriptions/Simplify boolean expression/after.java.template @@ -0,0 +1,5 @@ +public class X { + void f(int i) { + if (true) return; + } +} \ No newline at end of file diff --git a/resources/src/intentionDescriptions/Simplify boolean expression/before.java.template b/resources/src/intentionDescriptions/Simplify boolean expression/before.java.template new file mode 100644 index 000000000000..585c0894d518 --- /dev/null +++ b/resources/src/intentionDescriptions/Simplify boolean expression/before.java.template @@ -0,0 +1,5 @@ +public class X { + void f(int i) { + if (this == null || true || i == 0) return; + } +} \ No newline at end of file diff --git a/resources/src/intentionDescriptions/Simplify boolean expression/description.html b/resources/src/intentionDescriptions/Simplify boolean expression/description.html new file mode 100644 index 000000000000..89a36910c894 --- /dev/null +++ b/resources/src/intentionDescriptions/Simplify boolean expression/description.html @@ -0,0 +1,7 @@ + + +This intention simplifies expression with boolean literals. + + + + diff --git a/source/com/intellij/analysis/AnalysisScope.java b/source/com/intellij/analysis/AnalysisScope.java index ccdcc7288eee..8b078b94a03a 100644 --- a/source/com/intellij/analysis/AnalysisScope.java +++ b/source/com/intellij/analysis/AnalysisScope.java @@ -119,10 +119,6 @@ public class AnalysisScope { private PsiElementVisitor createFileSearcher() { PsiElementVisitor visitor = new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitFile(PsiFile file) { if (myFilter.accept(file)) { myFilesSet.add(file.getVirtualFile()); diff --git a/source/com/intellij/codeInsight/CodeInsightUtil.java b/source/com/intellij/codeInsight/CodeInsightUtil.java index e76f3fddf654..ad962f296c23 100644 --- a/source/com/intellij/codeInsight/CodeInsightUtil.java +++ b/source/com/intellij/codeInsight/CodeInsightUtil.java @@ -158,10 +158,6 @@ public class CodeInsightUtil { final PsiElementVisitor visitor = new PsiElementVisitor() { int offset = currentOffset; - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitElement(PsiElement element) { PsiElement child = element.getFirstChild(); if (child == null) { diff --git a/source/com/intellij/codeInsight/ExceptionUtil.java b/source/com/intellij/codeInsight/ExceptionUtil.java index 9e4b2926dd25..b59dfbae4f57 100644 --- a/source/com/intellij/codeInsight/ExceptionUtil.java +++ b/source/com/intellij/codeInsight/ExceptionUtil.java @@ -225,10 +225,6 @@ public class ExceptionUtil { public static PsiClassType[] getUnhandledExceptions(PsiElement[] elements) { final List array = new ArrayList(); PsiRecursiveElementVisitor visitor = new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitCallExpression(PsiCallExpression expression) { addExceptions(array, getUnhandledExceptions(expression, null)); visitElement(expression); diff --git a/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index 75d2973d097f..c1a4b46b7d41 100644 --- a/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -429,10 +429,6 @@ abstract class CodeCompletionHandlerBase implements CodeInsightActionHandler { protected PsiFile createCopy(final CompletionContext context) { final PsiElementVisitor visitor = new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitExpression(expression); - } - public void visitClass(PsiClass aClass) { aClass.putCopyableUserData(CompletionUtil.ORIGINAL_KEY, aClass); super.visitClass(aClass); diff --git a/source/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/source/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index 58a8b77cfa73..6e1da28f948c 100644 --- a/source/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/source/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -917,6 +917,7 @@ public class HighlightUtil { } else if (type instanceof PsiClassType) { PsiClass psiClass = ((PsiClassType)type).resolve(); + if (psiClass == null) return false; return psiClass != null && psiClass.isEnum(); } else { diff --git a/source/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java b/source/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java index f9d0db2ac32a..6474fc189460 100644 --- a/source/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java +++ b/source/com/intellij/codeInsight/daemon/impl/analysis/XmlHighlightVisitor.java @@ -56,9 +56,6 @@ public class XmlHighlightVisitor extends PsiElementVisitor implements Validator. myResult.clear(); } - public void visitReferenceExpression(PsiReferenceExpression expression) { - } - private static void addElementsForTag(XmlTag tag, String localizedMessage, List result, diff --git a/source/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java b/source/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java index 1148ca3e6931..8250492d4a36 100644 --- a/source/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java +++ b/source/com/intellij/codeInsight/daemon/impl/quickfix/RemoveRedundantElseAction.java @@ -19,7 +19,7 @@ public class RemoveRedundantElseAction implements IntentionAction { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.RemoveRedundantElseAction"); public String getText() { - return "Remove Redundant 'else'"; + return getFamilyName(); } public String getFamilyName() { diff --git a/source/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java b/source/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java new file mode 100644 index 000000000000..2648d919c918 --- /dev/null +++ b/source/com/intellij/codeInsight/daemon/impl/quickfix/SimplifyBooleanExpressionFix.java @@ -0,0 +1,144 @@ +/** + * @author cdr + */ +package com.intellij.codeInsight.daemon.impl.quickfix; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.*; +import com.intellij.psi.tree.IElementType; +import com.intellij.util.IncorrectOperationException; + +public class SimplifyBooleanExpressionFix implements IntentionAction { + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.daemon.impl.quickfix.SimplifyBooleanExpression"); + + private final PsiExpression mySubExpression; + private final boolean mySubExpressionValue; + private PsiExpression trueExpression; + private PsiExpression falseExpression; + + public SimplifyBooleanExpressionFix(PsiExpression subExpression, boolean subExpressionValue) { + mySubExpression = subExpression; + mySubExpressionValue = subExpressionValue; + } + + public String getText() { + return getFamilyName(); + } + + public String getFamilyName() { + return "Simplify boolean expression"; + } + + public boolean isAvailable(Project project, Editor editor, PsiFile file) { + return mySubExpression.isValid() + && mySubExpression.getManager().isInProject(mySubExpression); + } + + public void invoke(Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + PsiExpression constExpression = mySubExpression.getManager().getElementFactory().createExpressionFromText(Boolean.toString(mySubExpressionValue), mySubExpression); + PsiExpression expression = (PsiExpression)mySubExpression.replace(constExpression); + while (expression.getParent() instanceof PsiExpression) { + expression = (PsiExpression)expression.getParent(); + } + final PsiExpression newExpression = simplifyExpression(expression); + expression.replace(newExpression); + } + + public PsiExpression simplifyExpression(PsiExpression expression) throws IncorrectOperationException { + trueExpression = expression.getManager().getElementFactory().createExpressionFromText(Boolean.toString(true), null); + falseExpression = expression.getManager().getElementFactory().createExpressionFromText(Boolean.toString(false), null); + final PsiExpression[] copy = new PsiExpression[]{(PsiExpression)expression.copy()}; + copy[0].accept(new PsiRecursiveElementVisitor() { + public void visitElement(PsiElement element) { + final PsiElement[] children = element.getChildren(); + for (int i = 0; i < children.length; i++) { + PsiElement child = children[i]; + child.accept(this); + } + } + + public void visitExpression(PsiExpression expression) { + super.visitExpression(expression); + final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); + expression.accept(expressionVisitor); + if (expressionVisitor.resultExpression != null) { + LOG.assertTrue(expressionVisitor.resultExpression.isValid()); + try { + if (expression != copy[0]) { + expression.replace(expressionVisitor.resultExpression); + } + else { + copy[0] = expressionVisitor.resultExpression; + } + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } + } + }); + return copy[0]; + } + + private class ExpressionVisitor extends PsiElementVisitor { + private PsiExpression resultExpression; + + public void visitBinaryExpression(PsiBinaryExpression expression) { + final PsiExpression lOperand = expression.getLOperand(); + final PsiExpression rOperand = expression.getROperand(); + final PsiJavaToken operationSign = expression.getOperationSign(); + final IElementType tokenType = operationSign.getTokenType(); + final Boolean lConstBoolean = getConstBoolean(lOperand); + final Boolean rConstBoolean = getConstBoolean(rOperand); + + if (lConstBoolean != null) { + if (JavaTokenType.ANDAND == tokenType || JavaTokenType.AND == tokenType) { + resultExpression = lConstBoolean.booleanValue() ? rOperand : falseExpression; + } + else if (JavaTokenType.OROR == tokenType || JavaTokenType.OR == tokenType) { + resultExpression = lConstBoolean.booleanValue() ? trueExpression : rOperand; + } + } + else if (rConstBoolean != null) { + if (JavaTokenType.ANDAND == tokenType || JavaTokenType.AND == tokenType) { + resultExpression = rConstBoolean.booleanValue() ? lOperand : falseExpression; + } + else if (JavaTokenType.OROR == tokenType || JavaTokenType.OR == tokenType) { + resultExpression = rConstBoolean.booleanValue() ? trueExpression : lOperand; + } + } + } + + public void visitPrefixExpression(PsiPrefixExpression expression) { + final PsiExpression operand = expression.getOperand(); + final Boolean constBoolean = getConstBoolean(operand); + if (constBoolean == null) return; + final PsiJavaToken operationSign = expression.getOperationSign(); + final IElementType tokenType = operationSign.getTokenType(); + if (JavaTokenType.EXCL == tokenType) { + resultExpression = constBoolean.booleanValue() ? falseExpression : trueExpression; + } + } + + + public void visitParenthesizedExpression(PsiParenthesizedExpression expression) { + final PsiExpression subexpr = expression.getExpression(); + final Boolean constBoolean = getConstBoolean(subexpr); + if (constBoolean == null) return; + resultExpression = constBoolean.booleanValue() ? trueExpression : falseExpression; + } + } + + public static Boolean getConstBoolean(final PsiExpression operand) { + if (operand == null) return null; + final String text = operand.getText(); + return "true".equals(text) ? Boolean.TRUE : "false".equals(text) ? Boolean.FALSE : null; + } + + public boolean startInWriteAction() { + return true; + } +} \ No newline at end of file diff --git a/source/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java b/source/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java index bfc6be285348..594e55c369af 100644 --- a/source/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java +++ b/source/com/intellij/codeInsight/editorActions/smartEnter/AfterSemicolonEnterProcessor.java @@ -43,10 +43,6 @@ public class AfterSemicolonEnterProcessor implements EnterProcessor { private static int getErrorElementOffset(PsiElement elt) { final int[] offset = new int[] { -1 }; elt.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - if (offset[0] == -1) visitElement(expression); - } - public void visitErrorElement(PsiErrorElement element) { if (offset[0] == -1) offset[0] = element.getTextRange().getStartOffset(); } diff --git a/source/com/intellij/codeInsight/folding/impl/FoldingPolicy.java b/source/com/intellij/codeInsight/folding/impl/FoldingPolicy.java index 2bd0c8402f1a..2b9203f5f4cb 100644 --- a/source/com/intellij/codeInsight/folding/impl/FoldingPolicy.java +++ b/source/com/intellij/codeInsight/folding/impl/FoldingPolicy.java @@ -84,9 +84,6 @@ class FoldingPolicy { list.add(aClass); } - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } }; scope.accept(visitor); for (Iterator iterator = list.iterator(); iterator.hasNext();) { diff --git a/source/com/intellij/codeInsight/intention/impl/SimplifyBooleanExpressionAction.java b/source/com/intellij/codeInsight/intention/impl/SimplifyBooleanExpressionAction.java new file mode 100644 index 000000000000..36022746902f --- /dev/null +++ b/source/com/intellij/codeInsight/intention/impl/SimplifyBooleanExpressionAction.java @@ -0,0 +1,66 @@ +/** + * @author cdr + */ +package com.intellij.codeInsight.intention.impl; + +import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.codeInsight.daemon.impl.quickfix.SimplifyBooleanExpressionFix; +import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Comparing; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiExpression; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.util.IncorrectOperationException; + +public class SimplifyBooleanExpressionAction implements IntentionAction{ + private static final Logger LOG = Logger.getInstance("#com.intellij.codeInsight.intention.impl.SimplifyBooleanExpressionAction"); + + public String getText() { + return getFamilyName(); + } + + public String getFamilyName() { + return new SimplifyBooleanExpressionFix(null,false).getFamilyName(); + } + + public boolean isAvailable(Project project, Editor editor, PsiFile file) { + try { + final PsiExpression newExpression = simplifyExpression(editor, file, false); + return newExpression != null; + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + return false; + } + + private static PsiExpression simplifyExpression(final Editor editor, final PsiFile file, boolean replace) throws IncorrectOperationException { + int offset = editor.getCaretModel().getOffset(); + PsiElement element = file.findElementAt(offset); + if (element == null) return null; + PsiExpression expression = PsiTreeUtil.getParentOfType(element, PsiExpression.class); + if (expression == null) return null; + final Boolean constBoolean = SimplifyBooleanExpressionFix.getConstBoolean(expression); + if (constBoolean == null) return null; + PsiExpression topexpression = expression; + while (topexpression.getParent() instanceof PsiExpression) { + topexpression = (PsiExpression)topexpression.getParent(); + } + if (topexpression == expression) return null; + final SimplifyBooleanExpressionFix fix = new SimplifyBooleanExpressionFix(topexpression, constBoolean.booleanValue()); + final PsiExpression newExpression = fix.simplifyExpression(topexpression); + if (Comparing.strEqual(newExpression.getText(), topexpression.getText())) return null; + return replace ? (PsiExpression)topexpression.replace(newExpression) : newExpression; + } + + public void invoke(Project project, Editor editor, PsiFile file) throws IncorrectOperationException { + simplifyExpression(editor, file, true); + } + + public boolean startInWriteAction() { + return true; + } +} \ No newline at end of file diff --git a/source/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java b/source/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java index c0b20ce4fa8f..5dad8b0502b1 100644 --- a/source/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java +++ b/source/com/intellij/codeInsight/intention/impl/config/IntentionManagerImpl.java @@ -30,12 +30,13 @@ public class IntentionManagerImpl extends IntentionManager { registerIntentionAndMetaData(new SplitIfAction(), new String[]{"Control Flow"}); registerIntentionAndMetaData(new InvertIfConditionAction(), new String[]{"Control Flow"}); + registerIntentionAndMetaData(new RemoveRedundantElseAction(), new String[]{"Control Flow"}); registerIntentionAndMetaData(new ImplementAbstractClassAction(), new String[]{"Declaration"}); registerIntentionAndMetaData(new ImplementAbstractMethodAction(), new String[]{"Declaration"}); registerIntentionAndMetaData(new SplitDeclarationAction(), new String[]{"Declaration"}); - //TODO:add metadata! - addAction(new RemoveRedundantElseAction()); + + registerIntentionAndMetaData(new SimplifyBooleanExpressionAction(), new String[]{"Boolean"}); registerIntentionAndMetaData(new EJBImplementationAction(), new String[]{"EJB"}); registerIntentionAndMetaData(new EJBDeclarationAction(), new String[]{"EJB"}); diff --git a/source/com/intellij/codeInspection/dataFlow/DataFlowInspection.java b/source/com/intellij/codeInspection/dataFlow/DataFlowInspection.java index baa9f3121482..7c9b43c1561b 100644 --- a/source/com/intellij/codeInspection/dataFlow/DataFlowInspection.java +++ b/source/com/intellij/codeInspection/dataFlow/DataFlowInspection.java @@ -19,6 +19,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.util.IncorrectOperationException; +import com.intellij.codeInsight.daemon.impl.quickfix.SimplifyBooleanExpressionFix; import java.util.*; @@ -67,7 +68,7 @@ public class DataFlowInspection extends BaseLocalInspectionTool { return null; } - private LocalQuickFix createAssertNotNullFix(PsiExpression qualifier) { + private static LocalQuickFix createAssertNotNullFix(PsiExpression qualifier) { if (qualifier != null && qualifier.getManager().getEffectiveLanguageLevel().hasAssertKeyword() && !(qualifier instanceof PsiMethodCallExpression)) { try { @@ -179,10 +180,12 @@ public class DataFlowInspection extends BaseLocalInspectionTool { ProblemHighlightType.GENERIC_ERROR_OR_WARNING)); } else { + final LocalQuickFix localQuickFix = createSimplifyBooleanExpressionFix(true); descriptions.add(manager.createProblemDescriptor(psiAnchor, "Condition #ref #loc is always true", - null, + localQuickFix, ProblemHighlightType.GENERIC_ERROR_OR_WARNING)); + } } else if (psiAnchor instanceof PsiSwitchLabelStatement) { @@ -193,9 +196,10 @@ public class DataFlowInspection extends BaseLocalInspectionTool { } else if (psiAnchor != null) { if (!reportedAnchors.contains(psiAnchor)) { + final LocalQuickFix localQuickFix = createSimplifyBooleanExpressionFix(trueSet.contains(instruction)); descriptions.add(manager.createProblemDescriptor(psiAnchor, "Condition #ref #loc is always " + (trueSet.contains(instruction) ? "true" : "false") + - ".", null, + ".", localQuickFix, ProblemHighlightType.GENERIC_ERROR_OR_WARNING)); reportedAnchors.add(psiAnchor); } @@ -206,6 +210,26 @@ public class DataFlowInspection extends BaseLocalInspectionTool { return descriptions.toArray(new ProblemDescriptor[descriptions.size()]); } + private static LocalQuickFix createSimplifyBooleanExpressionFix(final boolean value) { + return new LocalQuickFix() { + public String getName() { + return new SimplifyBooleanExpressionFix(null,false).getText(); + } + + public void applyFix(Project project, ProblemDescriptor descriptor) { + final PsiElement psiElement = descriptor.getPsiElement(); + try { + final SimplifyBooleanExpressionFix action = new SimplifyBooleanExpressionFix((PsiExpression)psiElement, value); + LOG.assertTrue(psiElement.isValid()); + action.invoke(project, null, psiElement.getContainingFile()); + } + catch (IncorrectOperationException e) { + LOG.error(e); + } + } + }; + } + private static class RedundantInstanceofFix implements LocalQuickFix { public String getName() { return "Replace with != null"; diff --git a/source/com/intellij/codeInspection/defUse/DefUseInspection.java b/source/com/intellij/codeInspection/defUse/DefUseInspection.java index 716ac749f243..2203259534f4 100644 --- a/source/com/intellij/codeInspection/defUse/DefUseInspection.java +++ b/source/com/intellij/codeInspection/defUse/DefUseInspection.java @@ -115,10 +115,6 @@ public class DefUseInspection extends BaseLocalInspectionTool { } body.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitClass(PsiClass aClass) { } diff --git a/source/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcode.java b/source/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcode.java index 7e755d4e9af5..bfa84ad98ff4 100644 --- a/source/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcode.java +++ b/source/com/intellij/codeInspection/equalsAndHashcode/EqualsAndHashcode.java @@ -49,10 +49,6 @@ public class EqualsAndHashcode extends DescriptorProviderInspection { } } - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitElement(PsiElement element) { PsiElement[] children = element.getChildren(); for (int i = 0; i < children.length; i++) { diff --git a/source/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java b/source/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java index 858041ca4648..9a11ee6480c2 100644 --- a/source/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java +++ b/source/com/intellij/codeInspection/localCanBeFinal/LocalCanBeFinal.java @@ -123,9 +123,6 @@ public class LocalCanBeFinal extends BaseLocalInspectionTool { for (int i = 0; i < children.length; i++) { PsiElement child = children[i]; child.accept(new PsiElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - } - public void visitDeclarationStatement(PsiDeclarationStatement statement) { PsiElement[] declaredElements = statement.getDeclaredElements(); for (int i = 0; i < declaredElements.length; i++) { diff --git a/source/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java b/source/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java index 669f324c7599..34144768454b 100644 --- a/source/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java +++ b/source/com/intellij/codeInspection/miscGenerics/RedundantTypeArgsInspection.java @@ -49,8 +49,6 @@ public class RedundantTypeArgsInspection extends GenericsInspectionToolBase { public ProblemDescriptor[] getDescriptions(PsiElement place, final InspectionManager inspectionManager) { final List problems = new ArrayList(); place.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) {} - public void visitMethodCallExpression(PsiMethodCallExpression expression) { final PsiType[] typeArguments = expression.getTypeArguments(); if (typeArguments.length > 0) { diff --git a/source/com/intellij/cyclicDependencies/CyclicDependenciesBuilder.java b/source/com/intellij/cyclicDependencies/CyclicDependenciesBuilder.java index cc6c5ba00b61..015215046e44 100644 --- a/source/com/intellij/cyclicDependencies/CyclicDependenciesBuilder.java +++ b/source/com/intellij/cyclicDependencies/CyclicDependenciesBuilder.java @@ -75,9 +75,6 @@ public class CyclicDependenciesBuilder{ public void analyze() { final ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(getProject()).getFileIndex(); getScope().accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - - } public void visitFile(PsiFile file) { if (file != null && file instanceof PsiJavaFile) { @@ -331,9 +328,6 @@ public class CyclicDependenciesBuilder{ if (myPackages.isEmpty()) { final PsiManager psiManager = PsiManager.getInstance(getProject()); getScope().accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - } - public void visitFile(PsiFile file) { if (file != null && file instanceof PsiJavaFile) { PsiJavaFile psiJavaFile = (PsiJavaFile)file; diff --git a/source/com/intellij/debugger/engine/PositionManagerImpl.java b/source/com/intellij/debugger/engine/PositionManagerImpl.java index 9bb5a023a796..1f74cb74e1cf 100644 --- a/source/com/intellij/debugger/engine/PositionManagerImpl.java +++ b/source/com/intellij/debugger/engine/PositionManagerImpl.java @@ -128,10 +128,6 @@ public class PositionManagerImpl implements PositionManager { final PsiMethod[] compiledMethod = new PsiMethod[1]; PsiRecursiveElementVisitor visitor = new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - expression.acceptChildren(this); - } - public void visitClass(PsiClass aClass) { List allClasses = myDebugProcess.getPositionManager().getAllClasses(SourcePosition.createFromElement(aClass)); for (Iterator iterator = allClasses.iterator(); iterator.hasNext();) { diff --git a/source/com/intellij/ide/projectView/impl/nodes/ClassTreeNode.java b/source/com/intellij/ide/projectView/impl/nodes/ClassTreeNode.java index f33b6c342aaf..37a236ba6fc1 100644 --- a/source/com/intellij/ide/projectView/impl/nodes/ClassTreeNode.java +++ b/source/com/intellij/ide/projectView/impl/nodes/ClassTreeNode.java @@ -26,9 +26,6 @@ public class ClassTreeNode extends BasePsiNode{ for (Iterator iterator = result.iterator(); iterator.hasNext();) { PsiElement psiElement = iterator.next(); psiElement.accept(new PsiElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - } - public void visitClass(PsiClass aClass) { treeNodes.add(new ClassTreeNode(getProject(), aClass, getSettings())); } diff --git a/source/com/intellij/packageDependencies/BackwardDependenciesBuilder.java b/source/com/intellij/packageDependencies/BackwardDependenciesBuilder.java index f3a9a1c487a0..1dd04a9bc2ea 100644 --- a/source/com/intellij/packageDependencies/BackwardDependenciesBuilder.java +++ b/source/com/intellij/packageDependencies/BackwardDependenciesBuilder.java @@ -54,9 +54,6 @@ public class BackwardDependenciesBuilder extends DependenciesBuilder { psiManager.startBatchFilesProcessingMode(); try { getScope().accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - } - public void visitFile(final PsiFile file) { ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { diff --git a/source/com/intellij/packageDependencies/ForwardDependenciesBuilder.java b/source/com/intellij/packageDependencies/ForwardDependenciesBuilder.java index 8e04b91890f5..97f1b5545cfb 100644 --- a/source/com/intellij/packageDependencies/ForwardDependenciesBuilder.java +++ b/source/com/intellij/packageDependencies/ForwardDependenciesBuilder.java @@ -5,11 +5,13 @@ import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.impl.source.codeStyle.ImportHelper; -import com.intellij.util.ArrayUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiManager; +import com.intellij.psi.PsiRecursiveElementVisitor; -import java.util.*; +import java.util.HashSet; +import java.util.Set; public class ForwardDependenciesBuilder extends DependenciesBuilder { @@ -34,9 +36,6 @@ public class ForwardDependenciesBuilder extends DependenciesBuilder { psiManager.startBatchFilesProcessingMode(); try { getScope().accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - } - public void visitFile(final PsiFile file) { ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { diff --git a/source/com/intellij/psi/impl/cache/impl/repositoryCache/RecordUtil.java b/source/com/intellij/psi/impl/cache/impl/repositoryCache/RecordUtil.java index 09633a20063b..3f208484dc92 100644 --- a/source/com/intellij/psi/impl/cache/impl/repositoryCache/RecordUtil.java +++ b/source/com/intellij/psi/impl/cache/impl/repositoryCache/RecordUtil.java @@ -41,10 +41,6 @@ public class RecordUtil { if (psiElement != null && mayContainClassesInside(psiElement)) { psiElement.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitClass(PsiClass aClass) { if (ourList.isNull()) ourList.set(new ArrayList()); ourList.get().add(aClass); diff --git a/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java b/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java index e9e0fbfe004b..073d003d15f4 100644 --- a/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java +++ b/source/com/intellij/psi/impl/source/PsiTypeCodeFragmentImpl.java @@ -27,10 +27,6 @@ public class PsiTypeCodeFragmentImpl extends PsiCodeFragmentImpl implements PsiT public void visitErrorElement(PsiErrorElement element) { throw new SyntaxError(); } - - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitReferenceElement(expression); - } }); } catch(SyntaxError e) { diff --git a/source/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java b/source/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java index f917684e779c..6d11b8d9eb39 100644 --- a/source/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java +++ b/source/com/intellij/psi/impl/source/xml/XmlDocumentImpl.java @@ -6,15 +6,14 @@ import com.intellij.pom.PomModel; import com.intellij.pom.event.PomModelEvent; import com.intellij.pom.impl.PomTransactionBase; import com.intellij.pom.xml.XmlAspect; +import com.intellij.pom.xml.impl.events.XmlDocumentChangedImpl; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiRecursiveElementVisitor; -import com.intellij.psi.PsiReferenceExpression; import com.intellij.psi.impl.meta.MetaRegistry; import com.intellij.psi.impl.source.tree.ChildRole; import com.intellij.psi.impl.source.tree.TreeElement; import com.intellij.psi.meta.PsiMetaData; -import com.intellij.pom.xml.impl.events.XmlDocumentChangedImpl; import com.intellij.psi.tree.IElementType; import com.intellij.psi.xml.XmlDocument; import com.intellij.psi.xml.XmlProlog; @@ -87,10 +86,6 @@ public class XmlDocumentImpl extends XmlElementImpl implements XmlDocument { final TObjectIntHashMap map = new TObjectIntHashMap(); final PsiRecursiveElementVisitor psiRecursiveElementVisitor = new PsiRecursiveElementVisitor(){ - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitElement(expression); - } - public void visitXmlToken(XmlToken token) { inc("Tokens"); } diff --git a/source/com/intellij/psi/impl/source/xml/XmlTagImpl.java b/source/com/intellij/psi/impl/source/xml/XmlTagImpl.java index deb2a9798725..4e82e949d505 100644 --- a/source/com/intellij/psi/impl/source/xml/XmlTagImpl.java +++ b/source/com/intellij/psi/impl/source/xml/XmlTagImpl.java @@ -645,7 +645,6 @@ public class XmlTagImpl extends XmlElementImpl implements XmlTag/*, Modification } super.visitXmlTag(tag); } - public void visitReferenceExpression(PsiReferenceExpression expression) {} }); } } diff --git a/source/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java b/source/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java index 217ddd5891be..5fd7d2c3004f 100644 --- a/source/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java +++ b/source/com/intellij/refactoring/convertToInstanceMethod/ConvertToInstanceMethodProcessor.java @@ -254,10 +254,6 @@ public class ConvertToInstanceMethodProcessor extends BaseRefactoringProcessor { additionalReplacements = null; } newMethod.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitReferenceElement(expression); - } - public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { PsiTypeParameter typeParameterToBind = reference.getCopyableUserData(BIND_TO_TYPE_PARAMETER); if (typeParameterToBind != null) { diff --git a/source/com/intellij/refactoring/util/RefactoringUtil.java b/source/com/intellij/refactoring/util/RefactoringUtil.java index 92648f1ca3f1..3501b60038d0 100644 --- a/source/com/intellij/refactoring/util/RefactoringUtil.java +++ b/source/com/intellij/refactoring/util/RefactoringUtil.java @@ -1443,10 +1443,6 @@ public class RefactoringUtil { for (Iterator iterator = scopes.iterator(); iterator.hasNext();) { final PsiElement scope = iterator.next(); scope.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitReferenceElement(expression); - } - public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); final PsiElement resolved = reference.resolve(); diff --git a/source/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java b/source/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java index ef55c8056642..3381a1404424 100644 --- a/source/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java +++ b/source/com/intellij/refactoring/util/duplicates/DuplicatesFinder.java @@ -48,10 +48,6 @@ public class DuplicatesFinder { for (int i = 0; i < myPattern.length; i++) { final PsiElement patternComponent = myPattern[i]; patternComponent.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitReferenceElement(expression); - } - public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { final PsiElement element = reference.resolve(); if (myParameters.contains(element)) { @@ -73,10 +69,6 @@ public class DuplicatesFinder { for (int i = 0; i < myPattern.length; i++) { final PsiElement patternComponent = myPattern[i]; patternComponent.accept(new PsiRecursiveElementVisitor() { - public void visitReferenceExpression(PsiReferenceExpression expression) { - visitReferenceElement(expression); - } - public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { if (reference.getUserData(PARAMETER) != null) { reference.putUserData(PARAMETER, null);