diff options
Diffstat (limited to 'bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/ui/text/correction/AdvancedQuickAssistProcessor.java')
-rw-r--r-- | bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/ui/text/correction/AdvancedQuickAssistProcessor.java | 2172 |
1 files changed, 0 insertions, 2172 deletions
diff --git a/bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/ui/text/correction/AdvancedQuickAssistProcessor.java b/bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/ui/text/correction/AdvancedQuickAssistProcessor.java deleted file mode 100644 index cf9bbcf5..00000000 --- a/bundles/org.eclipse.wst.jsdt.ui/src/org/eclipse/wst/jsdt/internal/ui/text/correction/AdvancedQuickAssistProcessor.java +++ /dev/null @@ -1,2172 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2009 IBM Corporation and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Konstantin Scheglov (scheglov_ke@nlmk.ru) - initial API and implementation - * (reports 71244 & 74746: New Quick Assist's [quick assist]) - *******************************************************************************/ -package org.eclipse.wst.jsdt.internal.ui.text.correction; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.swt.graphics.Image; -import org.eclipse.wst.jsdt.core.dom.AST; -import org.eclipse.wst.jsdt.core.dom.ASTNode; -import org.eclipse.wst.jsdt.core.dom.Assignment; -import org.eclipse.wst.jsdt.core.dom.Block; -import org.eclipse.wst.jsdt.core.dom.BooleanLiteral; -import org.eclipse.wst.jsdt.core.dom.BreakStatement; -import org.eclipse.wst.jsdt.core.dom.ChildListPropertyDescriptor; -import org.eclipse.wst.jsdt.core.dom.ClassInstanceCreation; -import org.eclipse.wst.jsdt.core.dom.ConditionalExpression; -import org.eclipse.wst.jsdt.core.dom.ConstructorInvocation; -import org.eclipse.wst.jsdt.core.dom.ContinueStatement; -import org.eclipse.wst.jsdt.core.dom.DoStatement; -import org.eclipse.wst.jsdt.core.dom.Expression; -import org.eclipse.wst.jsdt.core.dom.ExpressionStatement; -import org.eclipse.wst.jsdt.core.dom.ForInStatement; -import org.eclipse.wst.jsdt.core.dom.ForStatement; -import org.eclipse.wst.jsdt.core.dom.FunctionDeclaration; -import org.eclipse.wst.jsdt.core.dom.FunctionInvocation; -import org.eclipse.wst.jsdt.core.dom.IBinding; -import org.eclipse.wst.jsdt.core.dom.ITypeBinding; -import org.eclipse.wst.jsdt.core.dom.IVariableBinding; -import org.eclipse.wst.jsdt.core.dom.IfStatement; -import org.eclipse.wst.jsdt.core.dom.InfixExpression; -import org.eclipse.wst.jsdt.core.dom.InstanceofExpression; -import org.eclipse.wst.jsdt.core.dom.Name; -import org.eclipse.wst.jsdt.core.dom.ParenthesizedExpression; -import org.eclipse.wst.jsdt.core.dom.PostfixExpression; -import org.eclipse.wst.jsdt.core.dom.PrefixExpression; -import org.eclipse.wst.jsdt.core.dom.PrimitiveType; -import org.eclipse.wst.jsdt.core.dom.QualifiedName; -import org.eclipse.wst.jsdt.core.dom.ReturnStatement; -import org.eclipse.wst.jsdt.core.dom.SimpleName; -import org.eclipse.wst.jsdt.core.dom.SingleVariableDeclaration; -import org.eclipse.wst.jsdt.core.dom.Statement; -import org.eclipse.wst.jsdt.core.dom.StringLiteral; -import org.eclipse.wst.jsdt.core.dom.StructuralPropertyDescriptor; -import org.eclipse.wst.jsdt.core.dom.SuperConstructorInvocation; -import org.eclipse.wst.jsdt.core.dom.SuperMethodInvocation; -import org.eclipse.wst.jsdt.core.dom.SwitchCase; -import org.eclipse.wst.jsdt.core.dom.SwitchStatement; -import org.eclipse.wst.jsdt.core.dom.Type; -import org.eclipse.wst.jsdt.core.dom.VariableDeclarationFragment; -import org.eclipse.wst.jsdt.core.dom.VariableDeclarationStatement; -import org.eclipse.wst.jsdt.core.dom.WhileStatement; -import org.eclipse.wst.jsdt.core.dom.InfixExpression.Operator; -import org.eclipse.wst.jsdt.core.dom.rewrite.ASTRewrite; -import org.eclipse.wst.jsdt.core.dom.rewrite.ImportRewrite; -import org.eclipse.wst.jsdt.core.dom.rewrite.ListRewrite; -import org.eclipse.wst.jsdt.internal.corext.dom.ASTNodes; -import org.eclipse.wst.jsdt.internal.corext.dom.GenericVisitor; -import org.eclipse.wst.jsdt.internal.corext.dom.LinkedNodeFinder; -import org.eclipse.wst.jsdt.internal.corext.fix.CleanUpConstants; -import org.eclipse.wst.jsdt.internal.corext.fix.ExpressionsFix; -import org.eclipse.wst.jsdt.internal.corext.fix.IFix; -import org.eclipse.wst.jsdt.internal.corext.util.JavaModelUtil; -import org.eclipse.wst.jsdt.internal.corext.util.Messages; -import org.eclipse.wst.jsdt.internal.ui.JavaPluginImages; -import org.eclipse.wst.jsdt.internal.ui.fix.ExpressionsCleanUp; -import org.eclipse.wst.jsdt.ui.CodeStyleConfiguration; -import org.eclipse.wst.jsdt.ui.text.java.IInvocationContext; -import org.eclipse.wst.jsdt.ui.text.java.IJavaCompletionProposal; -import org.eclipse.wst.jsdt.ui.text.java.IProblemLocation; -import org.eclipse.wst.jsdt.ui.text.java.IQuickAssistProcessor; - -/** - */ -public class AdvancedQuickAssistProcessor implements IQuickAssistProcessor { - public AdvancedQuickAssistProcessor() { - super(); - } - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.internal.ui.text.correction.IAssistProcessor#hasAssists(org.eclipse.wst.jsdt.internal.ui.text.correction.IAssistContext) - */ - public boolean hasAssists(IInvocationContext context) throws CoreException { - ASTNode coveringNode = context.getCoveringNode(); - if (coveringNode != null) { - ArrayList coveredNodes= getFullyCoveredNodes(context, coveringNode); - return getInverseIfProposals(context, coveringNode, null) - || getIfReturnIntoIfElseAtEndOfVoidMethodProposals(context, coveringNode, null) - || getInverseIfContinueIntoIfThenInLoopsProposals(context, coveringNode, null) - || getInverseIfIntoContinueInLoopsProposals(context, coveringNode, null) - || getInverseConditionProposals(context, coveringNode, coveredNodes, null) - || getRemoveExtraParenthesisProposals(context, coveringNode, coveredNodes, null) - || getAddParanoidalParenthesisProposals(context, coveringNode, coveredNodes, null) - || getJoinAndIfStatementsProposals(context, coveringNode, null) - || getSplitAndConditionProposals(context, coveringNode, null) - || getJoinOrIfStatementsProposals(context, coveringNode, coveredNodes, null) - || getSplitOrConditionProposals(context, coveringNode, null) - || getInverseConditionalExpressionProposals(context, coveringNode, null) - || getExchangeInnerAndOuterIfConditionsProposals(context, coveringNode, null) - || getExchangeOperandsProposals(context, coveringNode, null) - || getPickOutStringProposals(context, coveringNode, null) - || getReplaceIfElseWithConditionalProposals(context, coveringNode, null) - || getReplaceConditionalWithIfElseProposals(context, coveringNode, null) - || getInverseLocalVariableProposals(context, coveringNode, null) - || getPushNegationDownProposals(context, coveringNode, null) - || getPullNegationUpProposals(context, coveringNode, coveredNodes, null) - || getJoinIfListInIfElseIfProposals(context, coveringNode, coveredNodes, null) - || getConvertSwitchToIfProposals(context, coveringNode, null); - } - return false; - } - /* (non-Javadoc) - * @see org.eclipse.wst.jsdt.internal.ui.text.correction.IAssistProcessor#getAssists(org.eclipse.wst.jsdt.internal.ui.text.correction.IAssistContext, org.eclipse.wst.jsdt.internal.ui.text.correction.IProblemLocation[]) - */ - public IJavaCompletionProposal[] getAssists(IInvocationContext context, IProblemLocation[] locations) - throws CoreException { - ASTNode coveringNode = context.getCoveringNode(); - if (coveringNode != null) { - ArrayList coveredNodes = getFullyCoveredNodes(context, coveringNode); - ArrayList resultingCollections = new ArrayList(); - if (noErrorsAtLocation(locations)) { - getInverseIfProposals(context, coveringNode, resultingCollections); - getIfReturnIntoIfElseAtEndOfVoidMethodProposals(context, coveringNode, resultingCollections); - getInverseIfContinueIntoIfThenInLoopsProposals(context, coveringNode, resultingCollections); - getInverseIfIntoContinueInLoopsProposals(context, coveringNode, resultingCollections); - getInverseConditionProposals(context, coveringNode, coveredNodes, resultingCollections); - getRemoveExtraParenthesisProposals(context, coveringNode, coveredNodes, resultingCollections); - getAddParanoidalParenthesisProposals(context, coveringNode, coveredNodes, resultingCollections); - getJoinAndIfStatementsProposals(context, coveringNode, resultingCollections); - getSplitAndConditionProposals(context, coveringNode, resultingCollections); - getJoinOrIfStatementsProposals(context, coveringNode, coveredNodes, resultingCollections); - getSplitOrConditionProposals(context, coveringNode, resultingCollections); - getInverseConditionalExpressionProposals(context, coveringNode, resultingCollections); - getExchangeInnerAndOuterIfConditionsProposals(context, coveringNode, resultingCollections); - getExchangeOperandsProposals(context, coveringNode, resultingCollections); - getPickOutStringProposals(context, coveringNode, resultingCollections); - getReplaceIfElseWithConditionalProposals(context, coveringNode, resultingCollections); - getReplaceConditionalWithIfElseProposals(context, coveringNode, resultingCollections); - getInverseLocalVariableProposals(context, coveringNode, resultingCollections); - getPushNegationDownProposals(context, coveringNode, resultingCollections); - getPullNegationUpProposals(context, coveringNode, coveredNodes, resultingCollections); - getJoinIfListInIfElseIfProposals(context, coveringNode, coveredNodes, resultingCollections); - getConvertSwitchToIfProposals(context, coveringNode, resultingCollections); - } - return (IJavaCompletionProposal[]) resultingCollections.toArray(new IJavaCompletionProposal[resultingCollections.size()]); - } - return null; - } - private static boolean noErrorsAtLocation(IProblemLocation[] locations) { - if (locations != null) { - for (int i = 0; i < locations.length; i++) { - if (locations[i].isError()) { - return false; - } - } - } - return true; - } - private static boolean getIfReturnIntoIfElseAtEndOfVoidMethodProposals(IInvocationContext context, ASTNode covering, - Collection resultingCollections) { - Statement coveringStatement = ASTResolving.findParentStatement(covering); - if (!(coveringStatement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) coveringStatement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // 'then' block should have 'return' as last statement - Statement thenStatement = ifStatement.getThenStatement(); - if (!(thenStatement instanceof Block)) { - return false; - } - Block thenBlock = (Block) thenStatement; - List thenStatements = thenBlock.statements(); - if (thenStatements.isEmpty() || !(thenStatements.get(thenStatements.size() - 1) instanceof ReturnStatement)) { - return false; - } - // method should return 'void' - FunctionDeclaration coveringMetod = ASTResolving.findParentMethodDeclaration(covering); - if (coveringMetod == null) { - return false; - } - Type returnType = coveringMetod.getReturnType2(); - if (!(returnType instanceof PrimitiveType) - || ((PrimitiveType) returnType).getPrimitiveTypeCode() != PrimitiveType.VOID) - return false; - // - List statements = coveringMetod.getBody().statements(); - int ifIndex = statements.indexOf(ifStatement); - if (ifIndex == -1) { - return false; - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast = coveringStatement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // remove last 'return' in 'then' block - ListRewrite listRewriter = rewrite.getListRewrite(thenBlock, - (ChildListPropertyDescriptor) ifStatement.getLocationInParent()); - listRewriter.remove((ASTNode) thenStatements.get(thenStatements.size() - 1), null); - // prepare original nodes - Expression conditionPlaceholder = (Expression) rewrite.createMoveTarget(ifStatement.getExpression()); - Statement thenPlaceholder = (Statement) rewrite.createMoveTarget(ifStatement.getThenStatement()); - // prepare 'else' block - Block elseBlock = ast.newBlock(); - for (int i = ifIndex + 1; i < statements.size(); i++) { - Statement statement = (Statement) statements.get(i); - elseBlock.statements().add(rewrite.createMoveTarget(statement)); - } - // prepare new 'if' statement - IfStatement newIf = ast.newIfStatement(); - newIf.setExpression(conditionPlaceholder); - newIf.setThenStatement(thenPlaceholder); - newIf.setElseStatement(elseBlock); - rewrite.replace(ifStatement, newIf, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_convertToIfElse_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getInverseIfProposals(IInvocationContext context, ASTNode covering, Collection resultingCollections) { - Statement coveringStatement = ASTResolving.findParentStatement(covering); - if (!(coveringStatement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) coveringStatement; - if (ifStatement.getElseStatement() == null) { - return false; - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast = coveringStatement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - Statement thenStatement= ifStatement.getThenStatement(); - Statement elseStatement= ifStatement.getElseStatement(); - - // prepare original nodes - Expression inversedExpression = getInversedBooleanExpression(rewrite, ifStatement.getExpression()); - - Statement newElseStatement = (Statement) rewrite.createMoveTarget(thenStatement); - Statement newThenStatement = (Statement) rewrite.createMoveTarget(elseStatement); - // set new nodes - rewrite.set(ifStatement, IfStatement.EXPRESSION_PROPERTY, inversedExpression, null); - - if (elseStatement instanceof IfStatement) {// bug 79507 && bug 74580 - Block elseBlock = ast.newBlock(); - elseBlock.statements().add(newThenStatement); - newThenStatement= elseBlock; - } - rewrite.set(ifStatement, IfStatement.THEN_STATEMENT_PROPERTY, newThenStatement, null); - rewrite.set(ifStatement, IfStatement.ELSE_STATEMENT_PROPERTY, newElseStatement, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_inverseIf_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getInverseIfContinueIntoIfThenInLoopsProposals(IInvocationContext context, ASTNode covering, - Collection resultingCollections) { - Statement coveringStatement = ASTResolving.findParentStatement(covering); - if (!(coveringStatement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) coveringStatement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // check that 'then' is 'continue' - if (!(ifStatement.getThenStatement() instanceof ContinueStatement)) { - return false; - } - // check that 'if' statement is statement in block that is body of loop - Block loopBlock = null; - if ((ifStatement.getParent() instanceof Block) && (ifStatement.getParent().getParent() instanceof ForStatement)) { - loopBlock = (Block) ifStatement.getParent(); - } else if ((ifStatement.getParent() instanceof Block) - && (ifStatement.getParent().getParent() instanceof WhileStatement)) { - loopBlock = (Block) ifStatement.getParent(); - } else { - return false; - } - if (resultingCollections == null) { - return true; - } - // - AST ast = coveringStatement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // create inverted 'if' statement - Expression inversedExpression = getInversedBooleanExpression(rewrite, ifStatement.getExpression()); - IfStatement newIf = ast.newIfStatement(); - newIf.setExpression(inversedExpression); - // prepare 'then' for new 'if' - Block thenBlock = ast.newBlock(); - int ifIndex = loopBlock.statements().indexOf(ifStatement); - for (int i = ifIndex + 1; i < loopBlock.statements().size(); i++) { - Statement statement = (Statement) loopBlock.statements().get(i); - thenBlock.statements().add(rewrite.createMoveTarget(statement)); - } - newIf.setThenStatement(thenBlock); - // replace 'if' statement in loop - rewrite.replace(ifStatement, newIf, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_inverseIfContinue_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getInverseIfIntoContinueInLoopsProposals(IInvocationContext context, ASTNode covering, Collection resultingCollections) { - Statement coveringStatement = ASTResolving.findParentStatement(covering); - if (!(coveringStatement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) coveringStatement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // prepare outer control structure and block that contains 'if' statement - ASTNode ifParent = ifStatement.getParent(); - Block ifParentBlock = null; - ASTNode ifParentStructure = ifParent; - if (ifParentStructure instanceof Block) { - ifParentBlock = (Block) ifParent; - ifParentStructure = ifParentStructure.getParent(); - } - // check that control structure is loop and 'if' statement if last statement - if (!(ifParentStructure instanceof ForStatement) && !(ifParentStructure instanceof WhileStatement)&& !(ifParentStructure instanceof ForInStatement)) { - return false; - } - if ((ifParentBlock != null) && (ifParentBlock.statements().indexOf(ifStatement) != ifParentBlock.statements().size() - 1)) { - return false; - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast = coveringStatement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // create inverted 'if' statement - Expression inversedExpression = getInversedBooleanExpression(rewrite, ifStatement.getExpression()); - IfStatement newIf = ast.newIfStatement(); - newIf.setExpression(inversedExpression); - newIf.setThenStatement(ast.newContinueStatement()); - // - if (ifParentBlock == null) { - // if there is no block, create it - ifParentBlock = ast.newBlock(); - ifParentBlock.statements().add(newIf); - for (Iterator iter = getUnwrappedStatements(ifStatement.getThenStatement()).iterator(); iter.hasNext();) { - Statement statement = (Statement) iter.next(); - ifParentBlock.statements().add(rewrite.createMoveTarget(statement)); - } - // replace 'if' statement as body with new block - if (ifParentStructure instanceof ForStatement) { - rewrite.set(ifParentStructure, ForStatement.BODY_PROPERTY, ifParentBlock, null); - } else if (ifParentStructure instanceof WhileStatement) { - rewrite.set(ifParentStructure, WhileStatement.BODY_PROPERTY, ifParentBlock, null); - } - } else { - // if there was block, replace - ListRewrite listRewriter = rewrite.getListRewrite(ifParentBlock, - (ChildListPropertyDescriptor) ifStatement.getLocationInParent()); - listRewriter.replace(ifStatement, newIf, null); - // add statements from 'then' to the end of block - for (Iterator iter = getUnwrappedStatements(ifStatement.getThenStatement()).iterator(); iter.hasNext();) { - Statement statement = (Statement) iter.next(); - listRewriter.insertLast(rewrite.createMoveTarget(statement), null); - } - } - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_inverseIfToContinue_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static ArrayList getUnwrappedStatements(Statement body) { - ArrayList statements = new ArrayList(); - if (body instanceof Block) { - for (Iterator iter = ((Block) body).statements().iterator(); iter.hasNext();) { - Statement statement = (Statement) iter.next(); - statements.add(statement); - } - } else { - statements.add(body); - } - return statements; - } - private static boolean getInverseConditionProposals(IInvocationContext context, ASTNode covering, ArrayList coveredNodes, Collection resultingCollections) { - if (coveredNodes.isEmpty()) { - return false; - } - // - final AST ast = covering.getAST(); - final ASTRewrite rewrite = ASTRewrite.create(ast); - // check sub-expressions in fully covered nodes - boolean hasChanges = false; - for (Iterator iter = coveredNodes.iterator(); iter.hasNext();) { - ASTNode covered = (ASTNode) iter.next(); - Expression coveredExpression= getBooleanExpression(covered); - if (coveredExpression != null) { - Expression inversedExpression = getInversedBooleanExpression(rewrite, coveredExpression); - rewrite.replace(coveredExpression, inversedExpression, null); - hasChanges = true; - } - } - // - if (!hasChanges) { - return false; - } - if (resultingCollections == null) { - return true; - } - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_inverseConditions_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static Expression getInversedBooleanExpression(ASTRewrite rewrite, Expression expression) { - return getInversedBooleanExpression(rewrite, expression, null); - } - private interface SimpleNameRenameProvider { - SimpleName getRenamed(SimpleName name); - } - private static Expression getRenamedNameCopy(SimpleNameRenameProvider provider, - ASTRewrite rewrite, - Expression expression) { - if (provider != null) { - if (expression instanceof SimpleName) { - SimpleName name= (SimpleName) expression; - SimpleName newName= provider.getRenamed(name); - if (newName != null) { - return newName; - } - } - } - return (Expression) rewrite.createCopyTarget(expression); - } - private static Expression getInversedBooleanExpression(ASTRewrite rewrite, Expression expression, SimpleNameRenameProvider provider) { - if (!isBoolean(expression)) { - return (Expression) rewrite.createCopyTarget(expression); - } - AST ast= rewrite.getAST(); - // - if (expression instanceof BooleanLiteral) { - return ast.newBooleanLiteral(!((BooleanLiteral) expression).booleanValue()); - } - if (expression instanceof InfixExpression) { - InfixExpression infixExpression= (InfixExpression) expression; - InfixExpression.Operator operator= infixExpression.getOperator(); - if (operator == InfixExpression.Operator.LESS) { - return getInversedInfixBooleanExpression(rewrite, infixExpression, InfixExpression.Operator.GREATER_EQUALS, provider); - } - if (operator == InfixExpression.Operator.GREATER) { - return getInversedInfixBooleanExpression(rewrite, infixExpression, InfixExpression.Operator.LESS_EQUALS, provider); - } - if (operator == InfixExpression.Operator.LESS_EQUALS) { - return getInversedInfixBooleanExpression(rewrite, infixExpression, InfixExpression.Operator.GREATER, provider); - } - if (operator == InfixExpression.Operator.GREATER_EQUALS) { - return getInversedInfixBooleanExpression(rewrite, infixExpression, InfixExpression.Operator.LESS, provider); - } - if (operator == InfixExpression.Operator.EQUALS) { - return getInversedInfixBooleanExpression(rewrite, infixExpression, InfixExpression.Operator.NOT_EQUALS, provider); - } - if (operator == InfixExpression.Operator.NOT_EQUALS) { - return getInversedInfixBooleanExpression(rewrite, infixExpression, InfixExpression.Operator.EQUALS, provider); - } - if (operator == InfixExpression.Operator.CONDITIONAL_AND) { - return getInversedAndOrExpression(rewrite, infixExpression, InfixExpression.Operator.CONDITIONAL_OR, provider); - } - if (operator == InfixExpression.Operator.CONDITIONAL_OR) { - return getInversedAndOrExpression(rewrite, infixExpression, InfixExpression.Operator.CONDITIONAL_AND, provider); - } - if (operator == InfixExpression.Operator.AND) { - return getInversedAndOrExpression(rewrite, infixExpression, InfixExpression.Operator.OR, provider); - } - if (operator == InfixExpression.Operator.OR) { - return getInversedAndOrExpression(rewrite, infixExpression, InfixExpression.Operator.AND, provider); - } - } - if (expression instanceof PrefixExpression) { - PrefixExpression prefixExpression= (PrefixExpression) expression; - if (prefixExpression.getOperator() == PrefixExpression.Operator.NOT) { - return getRenamedNameCopy(provider, rewrite, prefixExpression.getOperand()); - } - } - if (expression instanceof InstanceofExpression) { - PrefixExpression prefixExpression= ast.newPrefixExpression(); - prefixExpression.setOperator(PrefixExpression.Operator.NOT); - ParenthesizedExpression parenthesizedExpression= ast.newParenthesizedExpression(); - parenthesizedExpression.setExpression((Expression) rewrite.createCopyTarget(expression)); - prefixExpression.setOperand(parenthesizedExpression); - return prefixExpression; - } - if (expression instanceof ParenthesizedExpression) { - ParenthesizedExpression parenthesizedExpression= (ParenthesizedExpression) expression; - Expression innerExpression= parenthesizedExpression.getExpression(); - while (innerExpression instanceof ParenthesizedExpression) { - innerExpression= ((ParenthesizedExpression) innerExpression).getExpression(); - } - if (innerExpression instanceof InstanceofExpression) { - return getInversedBooleanExpression(rewrite, innerExpression, provider); - } - parenthesizedExpression= ast.newParenthesizedExpression(); - parenthesizedExpression.setExpression(getInversedBooleanExpression(rewrite, innerExpression, provider)); - return parenthesizedExpression; - } - // - PrefixExpression prefixExpression= ast.newPrefixExpression(); - prefixExpression.setOperator(PrefixExpression.Operator.NOT); - prefixExpression.setOperand(getRenamedNameCopy(provider, rewrite, expression)); - return prefixExpression; - } - private static boolean isBoolean(Expression expression) { - return expression.resolveTypeBinding() == expression.getAST().resolveWellKnownType("boolean"); //$NON-NLS-1$ - } - private static Expression getInversedInfixBooleanExpression(ASTRewrite rewrite, InfixExpression expression, InfixExpression.Operator newOperator, SimpleNameRenameProvider provider) { - InfixExpression newExpression = rewrite.getAST().newInfixExpression(); - newExpression.setOperator(newOperator); - newExpression.setLeftOperand(getInversedBooleanExpression(rewrite, expression.getLeftOperand(), provider)); - newExpression.setRightOperand(getInversedBooleanExpression(rewrite, expression.getRightOperand(), provider)); - return newExpression; - } - - private static Expression parenthesizeIfRequired(Expression operand, int newOperatorPrecedence) { - if (newOperatorPrecedence < getExpressionPrecedence(operand)) { - return getParenthesizedExpression(operand.getAST(), operand); - } - return operand; - } - - private static Expression getInversedAndOrExpression(ASTRewrite rewrite, InfixExpression infixExpression, Operator newOperator, SimpleNameRenameProvider provider) { - InfixExpression newExpression = rewrite.getAST().newInfixExpression(); - newExpression.setOperator(newOperator); - - int newOperatorPrecedence = getInfixOperatorPrecedence(newOperator); - // - Expression leftOperand = getInversedBooleanExpression(rewrite, infixExpression.getLeftOperand(), provider); - newExpression.setLeftOperand(parenthesizeIfRequired(leftOperand, newOperatorPrecedence)); - - Expression rightOperand = getInversedBooleanExpression(rewrite, infixExpression.getRightOperand(), provider); - newExpression.setRightOperand(parenthesizeIfRequired(rightOperand, newOperatorPrecedence)); - - List extraOperands= infixExpression.extendedOperands(); - List newExtraOperands= newExpression.extendedOperands(); - for (int i= 0; i < extraOperands.size(); i++) { - Expression extraOperand = getInversedBooleanExpression(rewrite, (Expression) extraOperands.get(i), provider); - newExtraOperands.add(parenthesizeIfRequired(extraOperand, newOperatorPrecedence)); - } - return newExpression; - } - private static boolean getRemoveExtraParenthesisProposals(IInvocationContext context, ASTNode covering, ArrayList coveredNodes, - Collection resultingCollections) { - ArrayList nodes; - if ((context.getSelectionLength() == 0) && (covering instanceof ParenthesizedExpression)) { - nodes = new ArrayList(); - nodes.add(covering); - } else { - nodes= coveredNodes; - } - if (nodes.isEmpty()) - return false; - - IFix fix= ExpressionsFix.createRemoveUnnecessaryParenthesisFix(context.getASTRoot(), (ASTNode[])nodes.toArray(new ASTNode[nodes.size()])); - if (fix == null) - return false; - - if (resultingCollections == null) - return true; - - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_REMOVE); - Map options= new Hashtable(); - options.put(CleanUpConstants.EXPRESSIONS_USE_PARENTHESES, CleanUpConstants.TRUE); - options.put(CleanUpConstants.EXPRESSIONS_USE_PARENTHESES_NEVER, CleanUpConstants.TRUE); - FixCorrectionProposal proposal= new FixCorrectionProposal(fix, new ExpressionsCleanUp(options), 1, image, context); - resultingCollections.add(proposal); - return true; - } - private static int getExpressionPrecedence(Expression expression) { - if (expression instanceof PostfixExpression) { - return 0; - } - if (expression instanceof PrefixExpression) { - return 1; - } - if (expression instanceof ClassInstanceCreation) { - return 2; - } - if (expression instanceof InfixExpression) { - InfixExpression infixExpression = (InfixExpression) expression; - InfixExpression.Operator operator = infixExpression.getOperator(); - return getInfixOperatorPrecedence(operator); - } - if (expression instanceof InstanceofExpression) { - return 6; - } - if (expression instanceof ConditionalExpression) { - return 13; - } - if (expression instanceof Assignment) { - return 14; - } - if (expression instanceof FunctionInvocation) { - return 2; - } - return -1; - } - private static int getInfixOperatorPrecedence(InfixExpression.Operator operator) { - if ((operator == InfixExpression.Operator.TIMES) || (operator == InfixExpression.Operator.DIVIDE) - || (operator == InfixExpression.Operator.REMAINDER)) { - return 3; - } - if ((operator == InfixExpression.Operator.PLUS) || (operator == InfixExpression.Operator.MINUS)) { - return 4; - } - if ((operator == InfixExpression.Operator.LEFT_SHIFT) - || (operator == InfixExpression.Operator.RIGHT_SHIFT_SIGNED) - || (operator == InfixExpression.Operator.RIGHT_SHIFT_UNSIGNED)) { - return 5; - } - if ((operator == InfixExpression.Operator.LESS) || (operator == InfixExpression.Operator.GREATER) - || (operator == InfixExpression.Operator.LESS_EQUALS) - || (operator == InfixExpression.Operator.GREATER_EQUALS)) { - return 6; - } - if ((operator == InfixExpression.Operator.EQUALS) || (operator == InfixExpression.Operator.NOT_EQUALS) - ||(operator == InfixExpression.Operator.EQUAL_EQUAL_EQUAL) || (operator == InfixExpression.Operator.NOT_EQUAL_EQUAL) - ||(operator == InfixExpression.Operator.INSTANCEOF)) { return 7; - } - if (operator == InfixExpression.Operator.AND) { - return 8; - } - if (operator == InfixExpression.Operator.XOR) { - return 9; - } - if (operator == InfixExpression.Operator.OR) { - return 10; - } - if (operator == InfixExpression.Operator.CONDITIONAL_AND) { - return 11; - } - if (operator == InfixExpression.Operator.CONDITIONAL_OR) { - return 12; - } - return -1; - } - - private static boolean getAddParanoidalParenthesisProposals(IInvocationContext context, ASTNode covering, ArrayList coveredNodes, - Collection resultingCollections) throws CoreException { - - IFix fix= ExpressionsFix.createAddParanoidalParenthesisFix(context.getASTRoot(), (ASTNode[])coveredNodes.toArray(new ASTNode[coveredNodes.size()])); - if (fix == null) - return false; - - if (resultingCollections == null) - return true; - - // add correction proposal - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - Map options= new Hashtable(); - options.put(CleanUpConstants.EXPRESSIONS_USE_PARENTHESES, CleanUpConstants.TRUE); - options.put(CleanUpConstants.EXPRESSIONS_USE_PARENTHESES_ALWAYS, CleanUpConstants.TRUE); - FixCorrectionProposal proposal= new FixCorrectionProposal(fix, new ExpressionsCleanUp(options), 1, image, context); - resultingCollections.add(proposal); - return true; - } - - private static ArrayList getFullyCoveredNodes(IInvocationContext context, ASTNode coveringNode) { - final ArrayList coveredNodes = new ArrayList(); - final int selectionBegin = context.getSelectionOffset(); - final int selectionEnd = selectionBegin + context.getSelectionLength(); - coveringNode.accept(new GenericVisitor() { - protected boolean visitNode(ASTNode node) { - int nodeStart= node.getStartPosition(); - int nodeEnd= nodeStart + node.getLength(); - // if node does not intersects with selection, don't visit children - if (nodeEnd < selectionBegin || selectionEnd < nodeStart) { - return false; - } - // if node is fully covered, we don't need to visit children - if (isCovered(node)) { - ASTNode parent = node.getParent(); - if ((parent == null) || !isCovered(parent)) { - coveredNodes.add(node); - return false; - } - } - // if node only partly intersects with selection, we try to find fully covered children - return true; - } - private boolean isCovered(ASTNode node) { - int begin = node.getStartPosition(); - int end = begin + node.getLength(); - return (begin >= selectionBegin) && (end <= selectionEnd); - } - }); - return coveredNodes; - } - private static boolean getJoinAndIfStatementsProposals(IInvocationContext context, ASTNode node, - Collection resultingCollections) { - Operator andOperator = InfixExpression.Operator.CONDITIONAL_AND; - boolean result = false; - // - Statement statement = ASTResolving.findParentStatement(node); - if (!(statement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) statement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // case when current IfStatement is sole child of another IfStatement - { - IfStatement outerIf = null; - if (ifStatement.getParent() instanceof IfStatement) { - outerIf = (IfStatement) ifStatement.getParent(); - } else if (ifStatement.getParent() instanceof Block) { - Block block = (Block) ifStatement.getParent(); - if ((block.getParent() instanceof IfStatement) && (block.statements().size() == 1)) { - outerIf = (IfStatement) block.getParent(); - } - } - if ((outerIf != null) && (outerIf.getElseStatement() == null)) { - if (resultingCollections == null) { - return true; - } - // - AST ast = statement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare condition parts, add parenthesis if needed - Expression outerCondition = getParenthesizedForAndIfNeeded(ast, rewrite, outerIf.getExpression()); - Expression innerCondition = getParenthesizedForAndIfNeeded(ast, rewrite, ifStatement.getExpression()); - // create compound condition - InfixExpression condition = ast.newInfixExpression(); - condition.setOperator(andOperator); - condition.setLeftOperand(outerCondition); - condition.setRightOperand(innerCondition); - // create new IfStatement - IfStatement newIf = ast.newIfStatement(); - newIf.setExpression(condition); - Statement bodyPlaceholder = (Statement) rewrite.createCopyTarget(ifStatement.getThenStatement()); - newIf.setThenStatement(bodyPlaceholder); - rewrite.replace(outerIf, newIf, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_joinWithOuter_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, - context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - result = true; - } - } - // case when current IfStatement has another IfStatement as sole child - { - IfStatement innerIf = null; - if (ifStatement.getThenStatement() instanceof IfStatement) { - innerIf = (IfStatement) ifStatement.getThenStatement(); - } else if (ifStatement.getThenStatement() instanceof Block) { - Block block = (Block) ifStatement.getThenStatement(); - if ((block.statements().size() == 1) && (block.statements().get(0) instanceof IfStatement)) { - innerIf = (IfStatement) block.statements().get(0); - } - } - if ((innerIf != null) && (innerIf.getElseStatement() == null)) { - if (resultingCollections == null) { - return true; - } - // - AST ast = statement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare condition parts, add parenthesis if needed - Expression outerCondition = getParenthesizedForAndIfNeeded(ast, rewrite, ifStatement.getExpression()); - Expression innerCondition = getParenthesizedForAndIfNeeded(ast, rewrite, innerIf.getExpression()); - // create compound condition - InfixExpression condition = ast.newInfixExpression(); - condition.setOperator(andOperator); - condition.setLeftOperand(outerCondition); - condition.setRightOperand(innerCondition); - // create new IfStatement - IfStatement newIf = ast.newIfStatement(); - newIf.setExpression(condition); - Statement bodyPlaceholder = (Statement) rewrite.createCopyTarget(innerIf.getThenStatement()); - newIf.setThenStatement(bodyPlaceholder); - rewrite.replace(ifStatement, newIf, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_joinWithInner_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, - context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - result = true; - } - } - return result; - } - private static Expression getParenthesizedForAndIfNeeded(AST ast, ASTRewrite rewrite, Expression expression) { - boolean addParentheses = false; - int nodeType = expression.getNodeType(); - if (nodeType == ASTNode.INFIX_EXPRESSION) { - InfixExpression infixExpression = (InfixExpression) expression; - addParentheses = infixExpression.getOperator() == InfixExpression.Operator.CONDITIONAL_OR; - } else { - addParentheses = nodeType == ASTNode.CONDITIONAL_EXPRESSION || nodeType == ASTNode.ASSIGNMENT - || nodeType == ASTNode.INSTANCEOF_EXPRESSION; - } - expression = (Expression) rewrite.createCopyTarget(expression); - if (addParentheses) { - return getParenthesizedExpression(ast, expression); - } - return expression; - } - private static Expression getParenthesizedExpression(AST ast, Expression expression) { - ParenthesizedExpression parenthesizedExpression = ast.newParenthesizedExpression(); - parenthesizedExpression.setExpression(expression); - return parenthesizedExpression; - } - private static boolean getSplitAndConditionProposals(IInvocationContext context, ASTNode node, - Collection resultingCollections) { - Operator andOperator = InfixExpression.Operator.CONDITIONAL_AND; - // check that user invokes quick assist on infix expression - if (!(node instanceof InfixExpression)) { - return false; - } - InfixExpression infixExpression = (InfixExpression) node; - if (infixExpression.getOperator() != andOperator) { - return false; - } - int offset= isOperatorSelected(infixExpression, context.getSelectionOffset(), context.getSelectionLength()); - if (offset == -1) { - return false; - } - - // check that infix expression belongs to IfStatement - Statement statement = ASTResolving.findParentStatement(node); - if (!(statement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) statement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // check that infix expression is part of first level && condition of IfStatement - InfixExpression topInfixExpression = infixExpression; - while ((topInfixExpression.getParent() instanceof InfixExpression) - && ((InfixExpression) topInfixExpression.getParent()).getOperator() == andOperator) { - topInfixExpression = (InfixExpression) topInfixExpression.getParent(); - } - if (ifStatement.getExpression() != topInfixExpression) { - return false; - } - // - if (resultingCollections == null) { - return true; - } - AST ast = ifStatement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - - // prepare left and right conditions - Expression[] newOperands= { null, null }; - breakInfixOperationAtOperation(rewrite, topInfixExpression, andOperator, offset, true, newOperands); - - Expression leftCondition= newOperands[0]; - Expression rightCondition= newOperands[1]; - - // replace condition in inner IfStatement - rewrite.set(ifStatement, IfStatement.EXPRESSION_PROPERTY, rightCondition, null); - // prepare outer IfStatement - IfStatement outerIfStatement = ast.newIfStatement(); - outerIfStatement.setExpression(leftCondition); - Block outerBlock = ast.newBlock(); - outerIfStatement.setThenStatement(outerBlock); - ASTNode ifPlaceholder = rewrite.createMoveTarget(ifStatement); - outerBlock.statements().add(ifPlaceholder); - // replace ifStatement - rewrite.replace(ifStatement, outerIfStatement, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_splitAndCondition_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean isSelectingOperator(ASTNode n1, ASTNode n2, int offset, int length) { - // between the nodes - if (offset + length <= n2.getStartPosition() && offset >= ASTNodes.getExclusiveEnd(n1)) { - return true; - } - // or exactly select the node (but not with infix expressions) - if (n1.getStartPosition() == offset && ASTNodes.getExclusiveEnd(n2) == offset + length) { - if (n1 instanceof InfixExpression || n2 instanceof InfixExpression) { - return false; - } - return true; - } - return false; - } - - private static int isOperatorSelected(InfixExpression infixExpression, int offset, int length) { - ASTNode left= infixExpression.getLeftOperand(); - ASTNode right= infixExpression.getRightOperand(); - - if (isSelectingOperator(left, right, offset, length)) { - return ASTNodes.getExclusiveEnd(left); - } - List extended= infixExpression.extendedOperands(); - for (int i= 0; i < extended.size(); i++) { - left= right; - right= (ASTNode) extended.get(i); - if (isSelectingOperator(left, right, offset, length)) { - return ASTNodes.getExclusiveEnd(left); - } - } - return -1; - } - - private static boolean getJoinOrIfStatementsProposals(IInvocationContext context, ASTNode covering, ArrayList coveredNodes, - Collection resultingCollections) { - Operator orOperator = InfixExpression.Operator.CONDITIONAL_OR; - if (coveredNodes.size() < 2) - return false; - // check that all covered nodes are IfStatement's with same 'then' statement and without 'else' - String commonThenSource = null; - for (Iterator iter = coveredNodes.iterator(); iter.hasNext();) { - ASTNode node = (ASTNode) iter.next(); - if (!(node instanceof IfStatement)) - return false; - // - IfStatement ifStatement = (IfStatement) node; - if (ifStatement.getElseStatement() != null) - return false; - // - Statement thenStatement = ifStatement.getThenStatement(); - try { - String thenSource = context.getCompilationUnit().getBuffer().getText(thenStatement.getStartPosition(), - thenStatement.getLength()); - if (commonThenSource == null) { - commonThenSource = thenSource; - } else { - if (!commonThenSource.equals(thenSource)) - return false; - } - } catch (Throwable e) { - return false; - } - } - if (resultingCollections == null) { - return true; - } - // - final AST ast = covering.getAST(); - final ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare OR'ed condition - InfixExpression condition = null; - boolean hasRightOperand = false; - Statement thenStatement = null; - for (Iterator iter = coveredNodes.iterator(); iter.hasNext();) { - IfStatement ifStatement = (IfStatement) iter.next(); - if (thenStatement == null) - thenStatement = (Statement) rewrite.createCopyTarget(ifStatement.getThenStatement()); - Expression ifCondition = getParenthesizedForOrIfNeeded(ast, rewrite, ifStatement.getExpression()); - if (condition == null) { - condition = ast.newInfixExpression(); - condition.setOperator(orOperator); - condition.setLeftOperand(ifCondition); - } else if (!hasRightOperand) { - condition.setRightOperand(ifCondition); - hasRightOperand = true; - } else { - InfixExpression newCondition = ast.newInfixExpression(); - newCondition.setOperator(orOperator); - newCondition.setLeftOperand(condition); - newCondition.setRightOperand(ifCondition); - condition = newCondition; - } - } - // prepare new IfStatement with OR'ed condition - IfStatement newIf = ast.newIfStatement(); - newIf.setExpression(condition); - newIf.setThenStatement(thenStatement); - // - ListRewrite listRewriter = null; - for (Iterator iter = coveredNodes.iterator(); iter.hasNext();) { - IfStatement ifStatement = (IfStatement) iter.next(); - if (listRewriter == null) { - Block sourceBlock = (Block) ifStatement.getParent(); - //int insertIndex = sourceBlock.statements().indexOf(ifStatement); - listRewriter = rewrite.getListRewrite(sourceBlock, - (ChildListPropertyDescriptor) ifStatement.getLocationInParent()); - } - if (newIf != null) { - listRewriter.replace(ifStatement, newIf, null); - newIf = null; - } else { - listRewriter.remove(ifStatement, null); - } - } - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_joinWithOr_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static Expression getParenthesizedForOrIfNeeded(AST ast, ASTRewrite rewrite, Expression expression) { - boolean addParentheses = false; - int nodeType = expression.getNodeType(); - addParentheses = nodeType == ASTNode.CONDITIONAL_EXPRESSION || nodeType == ASTNode.ASSIGNMENT - || nodeType == ASTNode.INSTANCEOF_EXPRESSION; - expression = (Expression) rewrite.createCopyTarget(expression); - if (addParentheses) { - return getParenthesizedExpression(ast, expression); - } - return expression; - } - private static boolean getSplitOrConditionProposals(IInvocationContext context, ASTNode node, - Collection resultingCollections) { - Operator orOperator = InfixExpression.Operator.CONDITIONAL_OR; - // check that user invokes quick assist on infix expression - if (!(node instanceof InfixExpression)) { - return false; - } - InfixExpression infixExpression = (InfixExpression) node; - if (infixExpression.getOperator() != orOperator) { - return false; - } - int offset= isOperatorSelected(infixExpression, context.getSelectionOffset(), context.getSelectionLength()); - if (offset == -1) { - return false; - } - // check that infix expression belongs to IfStatement - Statement statement = ASTResolving.findParentStatement(node); - if (!(statement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) statement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // check that infix expression is part of first level || condition of IfStatement - InfixExpression topInfixExpression = infixExpression; - while ((topInfixExpression.getParent() instanceof InfixExpression) - && ((InfixExpression) topInfixExpression.getParent()).getOperator() == orOperator) { - topInfixExpression = (InfixExpression) topInfixExpression.getParent(); - } - if (ifStatement.getExpression() != topInfixExpression) { - return false; - } - // - if (resultingCollections == null) { - return true; - } - AST ast = ifStatement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - - // prepare left and right conditions - Expression[] newOperands= { null, null }; - breakInfixOperationAtOperation(rewrite, topInfixExpression, orOperator, offset, true, newOperands); - - Expression leftCondition= newOperands[0]; - Expression rightCondition= newOperands[1]; - - // prepare first statement - IfStatement firstIf = ast.newIfStatement(); - firstIf.setExpression(leftCondition); - firstIf.setThenStatement((Statement) rewrite.createCopyTarget(ifStatement.getThenStatement())); - // prepare second statement - IfStatement secondIf = ast.newIfStatement(); - secondIf.setExpression(rightCondition); - secondIf.setThenStatement((Statement) rewrite.createCopyTarget(ifStatement.getThenStatement())); - // add first and second IfStatement's - Block sourceBlock = (Block) ifStatement.getParent(); - int insertIndex = sourceBlock.statements().indexOf(ifStatement); - ListRewrite listRewriter = rewrite.getListRewrite(sourceBlock, - (ChildListPropertyDescriptor) statement.getLocationInParent()); - listRewriter.replace(ifStatement, firstIf, null); - listRewriter.insertAt(secondIf, insertIndex + 1, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_splitOrCondition_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getInverseConditionalExpressionProposals(IInvocationContext context, ASTNode covering, - Collection resultingCollections) { - // try to find conditional expression as parent - while (covering instanceof Expression) { - if (covering instanceof ConditionalExpression) - break; - covering = covering.getParent(); - } - if (!(covering instanceof ConditionalExpression)) { - return false; - } - ConditionalExpression expression = (ConditionalExpression) covering; - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast = covering.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare new conditional expression - ConditionalExpression newExpression = ast.newConditionalExpression(); - newExpression.setExpression(getInversedBooleanExpression(rewrite, expression.getExpression())); - newExpression.setThenExpression((Expression) rewrite.createCopyTarget(expression.getElseExpression())); - newExpression.setElseExpression((Expression) rewrite.createCopyTarget(expression.getThenExpression())); - // replace old expression with new - rewrite.replace(expression, newExpression, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_inverseConditionalExpression_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), - rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getExchangeInnerAndOuterIfConditionsProposals(IInvocationContext context, ASTNode node, - Collection resultingCollections) { - boolean result = false; - // - Statement statement = ASTResolving.findParentStatement(node); - if (!(statement instanceof IfStatement)) { - return false; - } - IfStatement ifStatement = (IfStatement) statement; - if (ifStatement.getElseStatement() != null) { - return false; - } - // case when current IfStatement is sole child of another IfStatement - { - IfStatement outerIf = null; - if (ifStatement.getParent() instanceof IfStatement) { - outerIf = (IfStatement) ifStatement.getParent(); - } else if (ifStatement.getParent() instanceof Block) { - Block block = (Block) ifStatement.getParent(); - if ((block.getParent() instanceof IfStatement) && (block.statements().size() == 1)) { - outerIf = (IfStatement) block.getParent(); - } - } - if ((outerIf != null) && (outerIf.getElseStatement() == null)) { - if (resultingCollections == null) { - return true; - } - // - AST ast = statement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare conditions - Expression outerCondition = (Expression) rewrite.createCopyTarget(outerIf.getExpression()); - Expression innerCondition = (Expression) rewrite.createCopyTarget(ifStatement.getExpression()); - // exchange conditions - rewrite.replace(outerIf.getExpression(), innerCondition, null); - rewrite.replace(ifStatement.getExpression(), outerCondition, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_exchangeInnerAndOuterIfConditions_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, - context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - result = true; - } - } - // case when current IfStatement has another IfStatement as sole child - { - IfStatement innerIf = null; - if (ifStatement.getThenStatement() instanceof IfStatement) { - innerIf = (IfStatement) ifStatement.getThenStatement(); - } else if (ifStatement.getThenStatement() instanceof Block) { - Block block = (Block) ifStatement.getThenStatement(); - if ((block.statements().size() == 1) && (block.statements().get(0) instanceof IfStatement)) { - innerIf = (IfStatement) block.statements().get(0); - } - } - if ((innerIf != null) && (innerIf.getElseStatement() == null)) { - if (resultingCollections == null) { - return true; - } - // - AST ast = statement.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare conditions - Expression innerCondition = (Expression) rewrite.createCopyTarget(innerIf.getExpression()); - Expression outerCondition = (Expression) rewrite.createCopyTarget(ifStatement.getExpression()); - // exchange conditions - rewrite.replace(innerIf.getExpression(), outerCondition, null); - rewrite.replace(ifStatement.getExpression(), innerCondition, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_exchangeInnerAndOuterIfConditions_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, - context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - result = true; - } - } - return result; - } - private static boolean getExchangeOperandsProposals(IInvocationContext context, ASTNode node, - Collection resultingCollections) { - // check that user invokes quick assist on infix expression - if (!(node instanceof InfixExpression)) { - return false; - } - InfixExpression infixExpression = (InfixExpression) node; - Operator operator = infixExpression.getOperator(); - if ((operator != InfixExpression.Operator.CONDITIONAL_AND) && (operator != InfixExpression.Operator.AND) - && (operator != InfixExpression.Operator.CONDITIONAL_OR) && (operator != InfixExpression.Operator.OR) - && (operator != InfixExpression.Operator.EQUALS) && (operator != InfixExpression.Operator.PLUS) - && (operator != InfixExpression.Operator.TIMES) && (operator != InfixExpression.Operator.XOR)) { - return false; - } - - int offset= isOperatorSelected(infixExpression, context.getSelectionOffset(), context.getSelectionLength()); - if (offset == -1) { - return false; - } - - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - AST ast = infixExpression.getAST(); - ASTRewrite rewrite = ASTRewrite.create(ast); - // prepare left and right expressions - Expression leftExpression = null; - Expression rightExpression = null; - InfixExpression currentExpression = infixExpression; - leftExpression= combineOperands(rewrite, leftExpression, infixExpression.getLeftOperand(), true, operator); - if (infixExpression.getRightOperand().getStartPosition() <= context.getSelectionOffset()) { - leftExpression= combineOperands(rewrite, leftExpression, infixExpression.getRightOperand(), true, operator); - } else { - rightExpression= combineOperands(rewrite, rightExpression, infixExpression.getRightOperand(), true, operator); - } - for (Iterator iter= currentExpression.extendedOperands().iterator(); iter.hasNext();) { - Expression extendedOperand= (Expression) iter.next(); - if (extendedOperand.getStartPosition() <= context.getSelectionOffset()) { - leftExpression= combineOperands(rewrite, leftExpression, extendedOperand, true, operator); - } else { - rightExpression= combineOperands(rewrite, rightExpression, extendedOperand, true, operator); - } - } - // create new infix expression - InfixExpression newInfix = ast.newInfixExpression(); - newInfix.setOperator(operator); - newInfix.setLeftOperand(rightExpression); - newInfix.setRightOperand(leftExpression); - rewrite.replace(infixExpression, newInfix, null); - // add correction proposal - String label = CorrectionMessages.AdvancedQuickAssistProcessor_exchangeOperands_description; - Image image = JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - - /** - * Breaks an infix operation with possible extended operators at the given operator and returns the new left and right operands. - * a & b & c -> [[a' & b' ] & c' ] (c' == copy of c) - * @param rewrite - * @param expression - * @param operator - * @param operatorOffset - */ - private static void breakInfixOperationAtOperation(ASTRewrite rewrite, Expression expression, Operator operator, int operatorOffset, boolean removeParenthesis, Expression[] res) { - if (expression.getStartPosition() + expression.getLength() <= operatorOffset) { - // add to the left - res[0]= combineOperands(rewrite, res[0], expression, removeParenthesis, operator); - return; - } - if (operatorOffset <= expression.getStartPosition()) { - // add to the right - res[1]= combineOperands(rewrite, res[1], expression, removeParenthesis, operator); - return; - } - if (!(expression instanceof InfixExpression)) { - throw new IllegalArgumentException("Cannot break up non-infix expression"); //$NON-NLS-1$ - } - InfixExpression infixExpression= (InfixExpression) expression; - if (infixExpression.getOperator() != operator) { - throw new IllegalArgumentException("Incompatible operator"); //$NON-NLS-1$ - } - breakInfixOperationAtOperation(rewrite, infixExpression.getLeftOperand(), operator, operatorOffset, removeParenthesis, res); - breakInfixOperationAtOperation(rewrite, infixExpression.getRightOperand(), operator, operatorOffset, removeParenthesis, res); - - List extended= infixExpression.extendedOperands(); - for (int i= 0; i < extended.size(); i++) { - breakInfixOperationAtOperation(rewrite, (Expression) extended.get(i), operator, operatorOffset, removeParenthesis, res); - } - } - - private static Expression combineOperands(ASTRewrite rewrite, Expression existing, Expression nodeToAdd, boolean removeParenthesis, Operator operator) { - if (existing == null && removeParenthesis) { - while (nodeToAdd instanceof ParenthesizedExpression) { - nodeToAdd= ((ParenthesizedExpression) nodeToAdd).getExpression(); - } - } - Expression newRight= (Expression) rewrite.createMoveTarget(nodeToAdd); - if (existing == null) { - return newRight; - } - AST ast= rewrite.getAST(); - InfixExpression infix= ast.newInfixExpression(); - infix.setOperator(operator); - infix.setLeftOperand(existing); - infix.setRightOperand(newRight); - return infix; - } - -// private static boolean isNegated(Expression expression) { -// if (!(expression.getParent() instanceof ParenthesizedExpression)) -// return false; -// -// ParenthesizedExpression parenthesis= (ParenthesizedExpression)expression.getParent(); -// if (!(parenthesis.getParent() instanceof PrefixExpression)) -// return false; -// -// PrefixExpression prefix= (PrefixExpression)parenthesis.getParent(); -// if (!(prefix.getOperator() == PrefixExpression.Operator.NOT)) -// return false; -// -// return true; -// } -// private static String[] suggestLocalVariableNames(IJavaScriptUnit cu, ITypeBinding binding) { -// return StubUtility.getVariableNameSuggestions(StubUtility.LOCAL, cu.getJavaScriptProject(), binding, null, null); -// } - - private static boolean getPickOutStringProposals(IInvocationContext context, ASTNode node, Collection resultingCollections) { - // we work with String's - if (!(node instanceof StringLiteral)) { - return false; - } - // user should select part of String - int selectionPos= context.getSelectionOffset(); - int selectionLen= context.getSelectionLength(); - if (selectionLen == 0) { - return false; - } - int valueStart= node.getStartPosition() + 1; - int valueEnd= node.getStartPosition() + node.getLength() - 1; - - // selection must be inside node and the quotes and not contain the full value - if ((selectionPos < valueStart) || (selectionPos + selectionLen > valueEnd) || (valueEnd - valueStart == selectionLen)) { - return false; - } - - // prepare string parts positions - StringLiteral stringLiteral= (StringLiteral) node; - String stringValue= stringLiteral.getEscapedValue(); - - int firstPos= selectionPos - node.getStartPosition(); - int secondPos= firstPos + selectionLen; - - - // prepare new string literals - - AST ast= node.getAST(); - StringLiteral leftLiteral= ast.newStringLiteral(); - StringLiteral centerLiteral= ast.newStringLiteral(); - StringLiteral rightLiteral= ast.newStringLiteral(); - try { - leftLiteral.setEscapedValue('"' + stringValue.substring(1, firstPos) + '"'); - centerLiteral.setEscapedValue('"' + stringValue.substring(firstPos, secondPos) + '"'); - rightLiteral.setEscapedValue('"' + stringValue.substring(secondPos, stringValue.length() - 1) + '"'); - } catch (IllegalArgumentException e) { - return false; - } - if (resultingCollections == null) { - return true; - } - - ASTRewrite rewrite= ASTRewrite.create(ast); - - // prepare new expression instead of StringLiteral - InfixExpression expression= ast.newInfixExpression(); - expression.setOperator(InfixExpression.Operator.PLUS); - if (firstPos != 1 ) { - expression.setLeftOperand(leftLiteral); - } - - - if (firstPos == 1) { - expression.setLeftOperand(centerLiteral); - } else { - expression.setRightOperand(centerLiteral); - } - - if (secondPos < stringValue.length() - 1) { - if (firstPos == 1) { - expression.setRightOperand(rightLiteral); - } else { - expression.extendedOperands().add(rightLiteral); - } - } - // use new expression instead of old StirngLiteral - rewrite.replace(stringLiteral, expression, null); - // add correction proposal - String label= CorrectionMessages.AdvancedQuickAssistProcessor_pickSelectedString; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - LinkedCorrectionProposal proposal= new LinkedCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - proposal.addLinkedPosition(rewrite.track(centerLiteral), true, "CENTER_STRING"); //$NON-NLS-1$ - resultingCollections.add(proposal); - return true; - } - - private static Statement getSingleStatement(Statement statement) { - if (statement instanceof Block) { - List blockStatements= ((Block) statement).statements(); - if (blockStatements.size() != 1) { - return null; - } - return (Statement) blockStatements.get(0); - } - return statement; - } - - private static boolean getReplaceIfElseWithConditionalProposals(IInvocationContext context, ASTNode node, Collection resultingCollections) { - if (!(node instanceof IfStatement)) { - return false; - } - IfStatement ifStatement= (IfStatement) node; - Statement thenStatement= getSingleStatement(ifStatement.getThenStatement()); - Statement elseStatement= getSingleStatement(ifStatement.getElseStatement()); - if (thenStatement == null || elseStatement == null) { - return false; - } - Expression assigned= null; - Expression thenExpression= null; - Expression elseExpression= null; - - ITypeBinding exprBinding= null; - if (thenStatement instanceof ReturnStatement && elseStatement instanceof ReturnStatement) { - thenExpression= ((ReturnStatement) thenStatement).getExpression(); - elseExpression= ((ReturnStatement) elseStatement).getExpression(); - FunctionDeclaration declaration= ASTResolving.findParentMethodDeclaration(node); - if (declaration == null || declaration.isConstructor()) { - return false; - } - exprBinding= declaration.getReturnType2().resolveBinding(); - } else if (thenStatement instanceof ExpressionStatement && elseStatement instanceof ExpressionStatement) { - Expression inner1= ((ExpressionStatement) thenStatement).getExpression(); - Expression inner2= ((ExpressionStatement) elseStatement).getExpression(); - if (inner1 instanceof Assignment && inner2 instanceof Assignment) { - Assignment assign1= (Assignment) inner1; - Assignment assign2= (Assignment) inner2; - Expression left1= assign1.getLeftHandSide(); - Expression left2= assign2.getLeftHandSide(); - if (left1 instanceof Name && left2 instanceof Name && assign1.getOperator() == assign2.getOperator()) { - IBinding bind1= ((Name) left1).resolveBinding(); - IBinding bind2= ((Name) left2).resolveBinding(); - if (bind1 == bind2 && bind1 instanceof IVariableBinding) { - assigned= left1; - exprBinding= ((IVariableBinding) bind1).getType(); - thenExpression= assign1.getRightHandSide(); - elseExpression= assign2.getRightHandSide(); - } - } - } - } - if (thenExpression == null || elseExpression == null) { - return false; - } - - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast= node.getAST(); - ASTRewrite rewrite= ASTRewrite.create(ast); - - String label= CorrectionMessages.AdvancedQuickAssistProcessor_replaceIfWithConditional; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - - - // prepare conditional expression - ConditionalExpression conditionalExpression = ast.newConditionalExpression(); - Expression conditionCopy= (Expression) rewrite.createCopyTarget(ifStatement.getExpression()); - conditionalExpression.setExpression(conditionCopy); - Expression thenCopy= (Expression) rewrite.createCopyTarget(thenExpression); - Expression elseCopy= (Expression) rewrite.createCopyTarget(elseExpression); - - - if (!JavaModelUtil.is50OrHigher(context.getCompilationUnit().getJavaScriptProject())) { - ITypeBinding thenBinding= thenExpression.resolveTypeBinding(); - ITypeBinding elseBinding= elseExpression.resolveTypeBinding(); - if (thenBinding != null && elseBinding != null && exprBinding != null && !elseBinding.isAssignmentCompatible(thenBinding)) { - proposal.createImportRewrite(context.getASTRoot()); - } - } - conditionalExpression.setThenExpression(thenCopy); - conditionalExpression.setElseExpression(elseCopy); - - // replace 'if' statement with conditional expression - if (assigned == null) { - ReturnStatement returnStatement = ast.newReturnStatement(); - returnStatement.setExpression(conditionalExpression); - rewrite.replace(ifStatement, returnStatement, null); - } else { - Assignment assignment= ast.newAssignment(); - assignment.setLeftHandSide((Expression) rewrite.createCopyTarget(assigned)); - assignment.setRightHandSide(conditionalExpression); - assignment.setOperator(((Assignment) assigned.getParent()).getOperator()); - - ExpressionStatement expressionStatement = ast.newExpressionStatement(assignment); - rewrite.replace(ifStatement, expressionStatement, null); - } - - // add correction proposal - resultingCollections.add(proposal); - return true; - } - - private static ReturnStatement createReturnExpression(ASTRewrite rewrite, Expression expression) { - AST ast= rewrite.getAST(); - ReturnStatement thenReturn = ast.newReturnStatement(); - thenReturn.setExpression((Expression) rewrite.createCopyTarget(expression)); - return thenReturn; - } - - private static Statement createAssignmentStatement(ASTRewrite rewrite, Assignment.Operator assignmentOperator, Expression origAssignee, Expression origAssigned) { - AST ast= rewrite.getAST(); - Assignment elseAssignment= ast.newAssignment(); - elseAssignment.setOperator(assignmentOperator); - elseAssignment.setLeftHandSide((Expression) rewrite.createCopyTarget(origAssignee)); - elseAssignment.setRightHandSide((Expression) rewrite.createCopyTarget(origAssigned)); - ExpressionStatement statement = ast.newExpressionStatement(elseAssignment); - return statement; - } - - private static boolean getReplaceConditionalWithIfElseProposals(IInvocationContext context, ASTNode covering, Collection resultingCollections) { - // check that parent statement is assignment - while (!(covering instanceof ConditionalExpression) && covering instanceof Expression) { - covering= covering.getParent(); - } - if (!(covering instanceof ConditionalExpression)) { - return false; - } - - StructuralPropertyDescriptor locationInParent= covering.getLocationInParent(); - if (locationInParent == Assignment.RIGHT_HAND_SIDE_PROPERTY) { - if (covering.getParent().getLocationInParent() != ExpressionStatement.EXPRESSION_PROPERTY) { - return false; - } - } else if (locationInParent == VariableDeclarationFragment.INITIALIZER_PROPERTY) { - ASTNode statement= covering.getParent().getParent(); - if (!(statement instanceof VariableDeclarationStatement) || statement.getLocationInParent() != Block.STATEMENTS_PROPERTY) { - return false; - } - } else if (locationInParent != ReturnStatement.EXPRESSION_PROPERTY) { - return false; - } - - ConditionalExpression conditional= (ConditionalExpression) covering; - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast= covering.getAST(); - ASTRewrite rewrite= ASTRewrite.create(ast); - // prepare new 'if' statement - Expression expression= conditional.getExpression(); - while (expression instanceof ParenthesizedExpression) { - expression= ((ParenthesizedExpression) expression).getExpression(); - } - IfStatement ifStatement= ast.newIfStatement(); - ifStatement.setExpression((Expression) rewrite.createCopyTarget(expression)); - if (locationInParent == Assignment.RIGHT_HAND_SIDE_PROPERTY) { - Assignment assignment= (Assignment) covering.getParent(); - Expression assignee= assignment.getLeftHandSide(); - Assignment.Operator op= assignment.getOperator(); - - ifStatement.setThenStatement(createAssignmentStatement(rewrite, op, assignee, conditional.getThenExpression())); - ifStatement.setElseStatement(createAssignmentStatement(rewrite, op, assignee, conditional.getElseExpression())); - - // replace return conditional expression with if/then/else/return - rewrite.replace(covering.getParent().getParent(), ifStatement, null); - - } else if (locationInParent == ReturnStatement.EXPRESSION_PROPERTY) { - ifStatement.setThenStatement(createReturnExpression(rewrite, conditional.getThenExpression())); - ifStatement.setElseStatement(createReturnExpression(rewrite, conditional.getElseExpression())); - // - // replace return conditional expression with if/then/else/return - rewrite.replace(conditional.getParent(), ifStatement, null); - } else if (locationInParent == VariableDeclarationFragment.INITIALIZER_PROPERTY) { - VariableDeclarationFragment frag= (VariableDeclarationFragment) covering.getParent(); - Assignment.Operator op= Assignment.Operator.ASSIGN; - - Expression assignee= frag.getName(); - ifStatement.setThenStatement(createAssignmentStatement(rewrite, op, assignee, conditional.getThenExpression())); - ifStatement.setElseStatement(createAssignmentStatement(rewrite, op, assignee, conditional.getElseExpression())); - - rewrite.set(frag, VariableDeclarationFragment.INITIALIZER_PROPERTY, null, null); // clear initializer - - ASTNode statement= frag.getParent(); - rewrite.getListRewrite(statement.getParent(), Block.STATEMENTS_PROPERTY).insertAfter(ifStatement, statement, null); - } - - // add correction proposal - String label= CorrectionMessages.AdvancedQuickAssistProcessor_replaceConditionalWithIf; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getInverseLocalVariableProposals(IInvocationContext context, - ASTNode covering, - Collection resultingCollections) { - final AST ast= covering.getAST(); - // cursor should be placed on variable name - if (!(covering instanceof SimpleName)) { - return false; - } - SimpleName coveringName= (SimpleName) covering; - if (!coveringName.isDeclaration()) { - return false; - } - // prepare bindings - final IBinding variableBinding= coveringName.resolveBinding(); - if (!(variableBinding instanceof IVariableBinding)) { - return false; - } - IVariableBinding binding= (IVariableBinding) variableBinding; - if (binding.isField()) { - return false; - } - // we operate only on boolean variable - if (!isBoolean(coveringName)) { - return false; - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // find linked nodes - final FunctionDeclaration method= ASTResolving.findParentMethodDeclaration(covering); - SimpleName[] linkedNodes= LinkedNodeFinder.findByBinding(method, variableBinding); - // - final ASTRewrite rewrite= ASTRewrite.create(ast); - // create proposal - String label= CorrectionMessages.AdvancedQuickAssistProcessor_inverseBooleanVariable; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - final String KEY_NAME= "name"; //$NON-NLS-1$ - final LinkedCorrectionProposal proposal= new LinkedCorrectionProposal(label, - context.getCompilationUnit(), - rewrite, - 1, - image); - // prepare new variable identifier - final String oldIdentifier= coveringName.getIdentifier(); - final String notString = Messages.format(CorrectionMessages.AdvancedQuickAssistProcessor_negatedVariableName, ""); //$NON-NLS-1$ - final String newIdentifier; - if (oldIdentifier.startsWith(notString)) { - int notLength= notString.length(); - if (oldIdentifier.length() > notLength) { - newIdentifier= Character.toLowerCase(oldIdentifier.charAt(notLength)) + oldIdentifier.substring(notLength + 1); - } else { - newIdentifier= oldIdentifier; - } - } else { - newIdentifier= Messages.format(CorrectionMessages.AdvancedQuickAssistProcessor_negatedVariableName, Character.toUpperCase(oldIdentifier.charAt(0)) + oldIdentifier.substring(1)); - } - // - proposal.addLinkedPositionProposal(KEY_NAME, newIdentifier, null); - proposal.addLinkedPositionProposal(KEY_NAME, oldIdentifier, null); - // iterate over linked nodes and replace variable references with negated reference - final HashSet renamedNames= new HashSet(); - for (int i= 0; i < linkedNodes.length; i++) { - SimpleName name= linkedNodes[i]; - if (renamedNames.contains(name)) { - continue; - } - // prepare new name with new identifier - SimpleName newName= ast.newSimpleName(newIdentifier); - proposal.addLinkedPosition(rewrite.track(newName), name == coveringName, KEY_NAME); - // - StructuralPropertyDescriptor location= name.getLocationInParent(); - if (location == SingleVariableDeclaration.NAME_PROPERTY) { - // set new name - rewrite.replace(name, newName, null); - } else if (location == Assignment.LEFT_HAND_SIDE_PROPERTY) { - Assignment assignment= (Assignment) name.getParent(); - Expression expression= assignment.getRightHandSide(); - int exStart= expression.getStartPosition(); - int exEnd= exStart + expression.getLength(); - // collect all names that are used in assignments - HashSet overlapNames= new HashSet(); - for (int j= 0; j < linkedNodes.length; j++) { - SimpleName name2= linkedNodes[j]; - if (name2 == null) { - continue; - } - int name2Start= name2.getStartPosition(); - if (exStart <= name2Start && name2Start < exEnd) { - overlapNames.add(name2); - } - } - // prepare inverted expression - SimpleNameRenameProvider provider= new SimpleNameRenameProvider() { - public SimpleName getRenamed(SimpleName simpleName) { - if (simpleName.resolveBinding() == variableBinding) { - renamedNames.add(simpleName); - return ast.newSimpleName(newIdentifier); - } - return null; - } - }; - Expression inversedExpression= getInversedBooleanExpression(rewrite, expression, provider); - // if any name was not renamed during expression inverting, we can not already rename it, so fail to create assist - for (Iterator iter= overlapNames.iterator(); iter.hasNext();) { - Object o= iter.next(); - if (!renamedNames.contains(o)) { - return false; - } - } - // check operator and replace if needed - Assignment.Operator operator= assignment.getOperator(); - if (operator == Assignment.Operator.BIT_AND_ASSIGN) { - Assignment newAssignment= ast.newAssignment(); - newAssignment.setLeftHandSide(newName); - newAssignment.setRightHandSide(inversedExpression); - newAssignment.setOperator(Assignment.Operator.BIT_OR_ASSIGN); - rewrite.replace(assignment, newAssignment, null); - } else if (operator == Assignment.Operator.BIT_OR_ASSIGN) { - Assignment newAssignment= ast.newAssignment(); - newAssignment.setLeftHandSide(newName); - newAssignment.setRightHandSide(inversedExpression); - newAssignment.setOperator(Assignment.Operator.BIT_AND_ASSIGN); - rewrite.replace(assignment, newAssignment, null); - } else { - rewrite.replace(expression, inversedExpression, null); - // set new name - rewrite.replace(name, newName, null); - } - } else if (location == VariableDeclarationFragment.NAME_PROPERTY) { - // replace initializer for variable - VariableDeclarationFragment vdf= (VariableDeclarationFragment) name.getParent(); - Expression expression= vdf.getInitializer(); - if (expression != null) { - rewrite.replace(expression, getInversedBooleanExpression(rewrite, expression), null); - } - // set new name - rewrite.replace(name, newName, null); - } else if ((name.getParent() instanceof PrefixExpression) - && (((PrefixExpression) name.getParent()).getOperator() == PrefixExpression.Operator.NOT)) { - rewrite.replace(name.getParent(), newName, null); - } else { - PrefixExpression expression= ast.newPrefixExpression(); - expression.setOperator(PrefixExpression.Operator.NOT); - expression.setOperand(newName); - rewrite.replace(name, expression, null); - } - } - // add correction proposal - resultingCollections.add(proposal); - return true; - } - private static boolean getPushNegationDownProposals(IInvocationContext context, - ASTNode covering, - Collection resultingCollections) { - PrefixExpression negationExpression= null; - ParenthesizedExpression parenthesizedExpression= null; - // check for case when cursor is on '!' before parentheses - if (covering instanceof PrefixExpression) { - PrefixExpression prefixExpression= (PrefixExpression) covering; - if ((prefixExpression.getOperator() == PrefixExpression.Operator.NOT) - && (prefixExpression.getOperand() instanceof ParenthesizedExpression)) { - negationExpression= prefixExpression; - parenthesizedExpression= (ParenthesizedExpression) prefixExpression.getOperand(); - } - } - // check for case when cursor is on parenthesized expression that is negated - if ((covering instanceof ParenthesizedExpression) - && (covering.getParent() instanceof PrefixExpression) - && (((PrefixExpression) covering.getParent()).getOperator() == PrefixExpression.Operator.NOT)) { - negationExpression= (PrefixExpression) covering.getParent(); - parenthesizedExpression= (ParenthesizedExpression) covering; - } - // - if (negationExpression == null) { - return false; - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - final AST ast= covering.getAST(); - final ASTRewrite rewrite= ASTRewrite.create(ast); - // prepared inverted expression - Expression inversedExpression= getInversedBooleanExpression(rewrite, parenthesizedExpression.getExpression()); - // check, may be we should keep parentheses - boolean keepParentheses= false; - if (negationExpression.getParent() instanceof Expression) { - int parentPrecedence= getExpressionPrecedence((Expression) negationExpression.getParent()); - int inversedExpressionPrecedence= getExpressionPrecedence(inversedExpression); - keepParentheses= parentPrecedence < inversedExpressionPrecedence; - } - // replace negated expression with inverted one - if (keepParentheses) { - ParenthesizedExpression pe= ast.newParenthesizedExpression(); - pe.setExpression(inversedExpression); - rewrite.replace(negationExpression, pe, null); - } else { - rewrite.replace(negationExpression, inversedExpression, null); - } - // add correction proposal - String label= CorrectionMessages.AdvancedQuickAssistProcessor_pushNegationDown; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - - private static Expression getBooleanExpression(ASTNode node) { - if (!(node instanceof Expression)) { - return null; - } - - // check if the node is a location where it can be negated - StructuralPropertyDescriptor locationInParent= node.getLocationInParent(); - if (locationInParent == QualifiedName.NAME_PROPERTY) { - node= node.getParent(); - locationInParent= node.getLocationInParent(); - } - while (locationInParent == ParenthesizedExpression.EXPRESSION_PROPERTY) { - node= node.getParent(); - locationInParent= node.getLocationInParent(); - } - Expression expression= (Expression) node; - if (!isBoolean(expression)) { - return null; - } - if (expression.getParent() instanceof InfixExpression) { - return expression; - } - if (locationInParent == Assignment.RIGHT_HAND_SIDE_PROPERTY - || locationInParent == IfStatement.EXPRESSION_PROPERTY - || locationInParent == WhileStatement.EXPRESSION_PROPERTY - || locationInParent == DoStatement.EXPRESSION_PROPERTY - || locationInParent == ReturnStatement.EXPRESSION_PROPERTY - || locationInParent == ForStatement.EXPRESSION_PROPERTY - || locationInParent == FunctionInvocation.ARGUMENTS_PROPERTY - || locationInParent == ConstructorInvocation.ARGUMENTS_PROPERTY - || locationInParent == SuperMethodInvocation.ARGUMENTS_PROPERTY - || locationInParent == SuperConstructorInvocation.ARGUMENTS_PROPERTY - || locationInParent == ClassInstanceCreation.ARGUMENTS_PROPERTY - || locationInParent == ConditionalExpression.EXPRESSION_PROPERTY - || locationInParent == PrefixExpression.OPERAND_PROPERTY) { - return expression; - } - return null; - } - - - - private static boolean getPullNegationUpProposals(IInvocationContext context, ASTNode covering, ArrayList coveredNodes, Collection resultingCollections) { - if (coveredNodes.size() != 1) { - return false; - } - // - ASTNode fullyCoveredNode= (ASTNode) coveredNodes.get(0); - - Expression expression= getBooleanExpression(fullyCoveredNode); - if (expression == null) { - return false; - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - AST ast= expression.getAST(); - final ASTRewrite rewrite= ASTRewrite.create(ast); - // prepared inverted expression - Expression inversedExpression= getInversedBooleanExpression(rewrite, expression); - // prepare ParenthesizedExpression - ParenthesizedExpression parenthesizedExpression = ast.newParenthesizedExpression(); - parenthesizedExpression.setExpression(inversedExpression); - // prepare NOT prefix expression - PrefixExpression prefixExpression = ast.newPrefixExpression(); - prefixExpression.setOperator(PrefixExpression.Operator.NOT); - prefixExpression.setOperand(parenthesizedExpression); - // replace old expression - rewrite.replace(expression, prefixExpression, null); - // add correction proposal - String label= CorrectionMessages.AdvancedQuickAssistProcessor_pullNegationUp; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getJoinIfListInIfElseIfProposals(IInvocationContext context, - ASTNode covering, - ArrayList coveredNodes, - Collection resultingCollections) { - if (coveredNodes.isEmpty()) { - return false; - } - // check that we have more than one covered statement - if (coveredNodes.size() < 2) { - return false; - } - // check that all selected nodes are 'if' statements with only 'then' statement - for (Iterator iter= coveredNodes.iterator(); iter.hasNext();) { - ASTNode node= (ASTNode) iter.next(); - if (!(node instanceof IfStatement)) { - return false; - } - IfStatement ifStatement= (IfStatement) node; - if (ifStatement.getElseStatement() != null) { - return false; - } - } - // we could produce quick assist - if (resultingCollections == null) { - return true; - } - // - final AST ast= covering.getAST(); - final ASTRewrite rewrite= ASTRewrite.create(ast); - // - IfStatement firstIfStatement= (IfStatement) coveredNodes.get(0); - IfStatement firstNewIfStatement= null; - // - IfStatement prevIfStatement= null; - for (Iterator iter= coveredNodes.iterator(); iter.hasNext();) { - IfStatement ifStatement= (IfStatement) iter.next(); - // prepare new 'if' statement - IfStatement newIfStatement= ast.newIfStatement(); - newIfStatement.setExpression((Expression) rewrite.createMoveTarget(ifStatement.getExpression())); - // prepare 'then' statement and convert into block if needed - Statement thenStatement= (Statement) rewrite.createMoveTarget(ifStatement.getThenStatement()); - if (ifStatement.getThenStatement() instanceof IfStatement) { - IfStatement ifBodyStatement= (IfStatement) ifStatement.getThenStatement(); - if (ifBodyStatement.getElseStatement() == null) { - Block thenBlock= ast.newBlock(); - thenBlock.statements().add(thenStatement); - thenStatement= thenBlock; - } - } - newIfStatement.setThenStatement(thenStatement); - // - if (prevIfStatement != null) { - prevIfStatement.setElseStatement(newIfStatement); - rewrite.remove(ifStatement, null); - } else { - firstNewIfStatement= newIfStatement; - } - prevIfStatement= newIfStatement; - } - rewrite.replace(firstIfStatement, firstNewIfStatement, null); - // add correction proposal - String label= CorrectionMessages.AdvancedQuickAssistProcessor_joinIfSequence; - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, 1, image); - resultingCollections.add(proposal); - return true; - } - private static boolean getConvertSwitchToIfProposals(IInvocationContext context, - ASTNode covering, - Collection resultingCollections) { - if (!(covering instanceof SwitchStatement)) { - return false; - } - // we could produce quick assist (if all 'case' statements end with 'break') - if (resultingCollections == null) { - return true; - } - // - final AST ast= covering.getAST(); - final ASTRewrite rewrite= ASTRewrite.create(ast); - final ImportRewrite importRewrite= CodeStyleConfiguration.createImportRewrite(context.getASTRoot(), true); - // - SwitchStatement switchStatement= (SwitchStatement) covering; - IfStatement firstIfStatement= null; - IfStatement currentIfStatement= null; - Block currentBlock= null; - boolean hasStopAsLastExecutableStatement = false; - Block defaultBlock= null; - InfixExpression currentCondition= null; - boolean defaultFound= false; - int caseCount = 0; - - ArrayList allBlocks= new ArrayList(); - // - for (Iterator iter= switchStatement.statements().iterator(); iter.hasNext();) { - Statement statement= (Statement) iter.next(); - if (statement instanceof SwitchCase) { - SwitchCase switchCase= (SwitchCase) statement; - caseCount++; - // special case: pass through - if (currentBlock != null) { - if (!hasStopAsLastExecutableStatement) { - return false; - } - currentBlock= null; - } - // for 'default' we just will not create condition - if (switchCase.isDefault()) { - defaultFound= true; - if (currentCondition != null) { - // we can not convert one or more 'case' statements and 'default' nor in conditional if, nor in 'else' without code duplication - return false; - } - continue; - } - if (defaultFound) { - return false; - } - // prepare condition - InfixExpression switchCaseCondition= createSwitchCaseCondition(ast, rewrite, importRewrite, switchStatement, switchCase); - if (currentCondition == null) { - currentCondition= switchCaseCondition; - } else { - InfixExpression condition= ast.newInfixExpression(); - condition.setOperator(InfixExpression.Operator.CONDITIONAL_OR); - condition.setLeftOperand(currentCondition); - condition.setRightOperand(switchCaseCondition); - currentCondition= condition; - } - } else if (statement instanceof BreakStatement) { - currentBlock= null; - } else { - // ensure that current block exists as 'then' statement of 'if' - if (currentBlock == null) { - defaultFound= false; - if (currentCondition != null) { - IfStatement ifStatement; - if (firstIfStatement == null) { - firstIfStatement= ast.newIfStatement(); - ifStatement= firstIfStatement; - } else { - ifStatement= ast.newIfStatement(); - currentIfStatement.setElseStatement(ifStatement); - } - currentIfStatement= ifStatement; - ifStatement.setExpression(currentCondition); - currentCondition= null; - currentBlock= ast.newBlock(); - ifStatement.setThenStatement(currentBlock); - allBlocks.add(currentBlock); - } else { - // case for default: - defaultBlock= ast.newBlock(); - currentBlock= defaultBlock; - allBlocks.add(currentBlock); - // delay adding of default block - } - } - // add current statement in current block - { - hasStopAsLastExecutableStatement = hasStopAsLastExecutableStatement(statement); - Statement copyStatement= copyStatementExceptBreak(ast, rewrite, statement); - - - currentBlock.statements().add(copyStatement); - } - } - } - // check, may be we have delayed default block - if (defaultBlock != null) { - currentIfStatement.setElseStatement(defaultBlock); - } - // remove unnecessary blocks in blocks - for (int i= 0; i < allBlocks.size(); i++) { - Block block= (Block) allBlocks.get(i); - List statements= block.statements(); - if (statements.size() == 1 && statements.get(0) instanceof Block) { - Block innerBlock= (Block) statements.remove(0); - block.getParent().setStructuralProperty(block.getLocationInParent(), innerBlock); - } - } - // replace 'switch' with single if-else-if statement - rewrite.replace(switchStatement, firstIfStatement, null); - // prepare label, specially for Daniel :-) - String label= CorrectionMessages.AdvancedQuickAssistProcessor_convertSwitchToIf; - - // add correction proposal - Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); - ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, - context.getCompilationUnit(), - rewrite, - 1, - image); - proposal.setImportRewrite(importRewrite); - resultingCollections.add(proposal); - return true; - } - private static InfixExpression createSwitchCaseCondition(AST ast, ASTRewrite rewrite, ImportRewrite importRewrite, - SwitchStatement switchStatement, SwitchCase switchCase) { - InfixExpression condition= ast.newInfixExpression(); - condition.setOperator(InfixExpression.Operator.EQUALS); - // - Expression leftExpression= (Expression) rewrite.createCopyTarget(switchStatement.getExpression()); - condition.setLeftOperand(leftExpression); - // - Expression rightExpression= null; - Expression expression= switchCase.getExpression(); - if (expression instanceof SimpleName && ((SimpleName) expression).resolveBinding() instanceof IVariableBinding) { - ((SimpleName) expression).resolveBinding(); - } - condition.setRightOperand(rightExpression); - // - return condition; - } - - - private static boolean hasStopAsLastExecutableStatement(Statement lastStatement) { - if ((lastStatement instanceof ReturnStatement) || (lastStatement instanceof BreakStatement)) { - return true; - } - if (lastStatement instanceof Block) { - Block block= (Block)lastStatement; - lastStatement = (Statement) block.statements().get(block.statements().size() - 1); - return hasStopAsLastExecutableStatement(lastStatement); - } - return false; - } - private static Statement copyStatementExceptBreak(AST ast, ASTRewrite rewrite, Statement source) { - if (source instanceof Block) { - Block block= (Block) source; - Block newBlock= ast.newBlock(); - for (Iterator iter= block.statements().iterator(); iter.hasNext();) { - Statement statement= (Statement) iter.next(); - if (statement instanceof BreakStatement) { - continue; - } - newBlock.statements().add(copyStatementExceptBreak(ast, rewrite, statement)); - } - return newBlock; - } - return (Statement) rewrite.createMoveTarget(source); - } -} |