/** {@inheritDoc} */ public void rewriteAST(CompilationUnitRewrite cuRewrite, List textEditGroups) throws CoreException { TextEditGroup group = createTextEditGroup(FixMessages.ExpressionsFix_removeUnnecessaryParenthesis_description); textEditGroups.add(group); ASTRewrite rewrite = cuRewrite.getASTRewrite(); while (fExpressions.size() > 0) { ParenthesizedExpression parenthesizedExpression = (ParenthesizedExpression) fExpressions.iterator().next(); fExpressions.remove(parenthesizedExpression); ParenthesizedExpression down = parenthesizedExpression; while (fExpressions.contains(down.getExpression())) { down = (ParenthesizedExpression) down.getExpression(); fExpressions.remove(down); } ASTNode move = rewrite.createMoveTarget(down.getExpression()); ParenthesizedExpression top = parenthesizedExpression; while (fExpressions.contains(top.getParent())) { top = (ParenthesizedExpression) top.getParent(); fExpressions.remove(top); } rewrite.replace(top, move, group); } }
public void postVisit(ASTNode node) { if (!(node instanceof ParenthesizedExpression)) { return; } ParenthesizedExpression parenthesizedExpression = (ParenthesizedExpression) node; Expression expression = parenthesizedExpression.getExpression(); while (expression instanceof ParenthesizedExpression) { expression = ((ParenthesizedExpression) expression).getExpression(); } // if this is part of another expression, check for this and parent precedences if (parenthesizedExpression.getParent() instanceof Expression) { Expression parentExpression = (Expression) parenthesizedExpression.getParent(); int expressionPrecedence = getExpressionPrecedence(expression); int parentPrecedence = getExpressionPrecedence(parentExpression); if ((expressionPrecedence > parentPrecedence) && !(parenthesizedExpression.getParent() instanceof ParenthesizedExpression)) { return; } // check for case when precedences for expression and parent are same if ((expressionPrecedence == parentPrecedence) && (parentExpression instanceof InfixExpression)) { // we have expr infix (expr infix expr) removing the parenthesis is equal to (expr infix // expr) infix expr InfixExpression parentInfix = (InfixExpression) parentExpression; Operator parentOperator = parentInfix.getOperator(); if (parentInfix.getLeftOperand() == parenthesizedExpression) { fNodes.add(node); } else if (isAssoziative(parentOperator)) { if (parentOperator == InfixExpression.Operator.PLUS) { if (isStringExpression(parentInfix.getLeftOperand()) || isStringExpression(parentInfix.getRightOperand())) { return; } for (Iterator J = parentInfix.extendedOperands().iterator(); J.hasNext(); ) { Expression operand = (Expression) J.next(); if (isStringExpression(operand)) { return; } } } fNodes.add(node); } return; } else if (expressionPrecedence == parentPrecedence && parentExpression instanceof ConditionalExpression) { if (((ConditionalExpression) parentExpression).getElseExpression() != parenthesizedExpression) return; } } fNodes.add(node); }