Search in sources :

Example 1 with Pair

use of org.autorefactor.util.Pair in project AutoRefactor by JnRouvignac.

the class StringBuilderRefactoring method visit.

@Override
public boolean visit(InfixExpression node) {
    if (isStringConcat(node)) {
        final LinkedList<Pair<ITypeBinding, Expression>> allOperands = new LinkedList<Pair<ITypeBinding, Expression>>();
        readSubExpressions(node, allOperands, new AtomicBoolean(false));
        boolean replaceNeeded = filterOutEmptyStringsFromStringConcat(allOperands);
        if (replaceNeeded) {
            this.ctx.getRefactorings().replace(node, createStringConcats(allOperands));
            return DO_NOT_VISIT_SUBTREE;
        }
    }
    return VISIT_SUBTREE;
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Expression(org.eclipse.jdt.core.dom.Expression) InfixExpression(org.eclipse.jdt.core.dom.InfixExpression) ITypeBinding(org.eclipse.jdt.core.dom.ITypeBinding) LinkedList(java.util.LinkedList) Pair(org.autorefactor.util.Pair)

Example 2 with Pair

use of org.autorefactor.util.Pair in project AutoRefactor by JnRouvignac.

the class StringBuilderRefactoring method maybeRefactorAppending.

private boolean maybeRefactorAppending(Expression node) {
    final LinkedList<Pair<ITypeBinding, Expression>> allAppendedStrings = new LinkedList<Pair<ITypeBinding, Expression>>();
    final AtomicBoolean isRefactoringNeeded = new AtomicBoolean(false);
    final AtomicBoolean isInstanceCreationToRewrite = new AtomicBoolean(false);
    final Expression lastExpr = readAppendMethod(node, allAppendedStrings, isRefactoringNeeded, isInstanceCreationToRewrite);
    if (lastExpr != null) {
        removeEmptyStrings(allAppendedStrings, isRefactoringNeeded);
        removeCallsToToString(allAppendedStrings, isRefactoringNeeded, isInstanceCreationToRewrite.get());
        if (isRefactoringNeeded.get()) {
            if (allAppendedStrings.isEmpty() && isVariable(lastExpr) && node.getParent() instanceof Statement) {
                ctx.getRefactorings().remove(node.getParent());
            } else {
                replaceWithNewStringAppends(node, allAppendedStrings, lastExpr, isInstanceCreationToRewrite.get());
            }
            return DO_NOT_VISIT_SUBTREE;
        }
    }
    return VISIT_SUBTREE;
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Expression(org.eclipse.jdt.core.dom.Expression) InfixExpression(org.eclipse.jdt.core.dom.InfixExpression) Statement(org.eclipse.jdt.core.dom.Statement) ITypeBinding(org.eclipse.jdt.core.dom.ITypeBinding) LinkedList(java.util.LinkedList) Pair(org.autorefactor.util.Pair)

Example 3 with Pair

use of org.autorefactor.util.Pair in project AutoRefactor by JnRouvignac.

the class ForLoopHelper method iterateOverContainer.

/**
 * Returns the {@link ForLoopContent} if this for loop iterates over a container.
 *
 * @param node the for statement
 * @return the {@link ForLoopContent} if this for loop iterates over a container, null otherwise
 */
public static ForLoopContent iterateOverContainer(ForStatement node) {
    final List<Expression> initializers = initializers(node);
    final Expression condition = node.getExpression();
    final List<Expression> updaters = updaters(node);
    if (initializers.size() == 1) {
        Expression firstInit = initializers.get(0);
        if (updaters.isEmpty()) {
            final Pair<Name, Expression> initPair = decomposeInitializer(firstInit);
            final Name init = initPair.getFirst();
            final MethodInvocation condMi = as(node.getExpression(), MethodInvocation.class);
            final MethodInvocation initMi = as(initPair.getSecond(), MethodInvocation.class);
            if (condMi != null && isSameVariable(init, condMi.getExpression()) && isMethod(initMi, "java.util.Collection", "iterator") && isMethod(condMi, "java.util.Iterator", "hasNext")) {
                return getIteratorOnCollection(initMi.getExpression(), condMi.getExpression());
            }
        } else if (updaters.size() == 1 && isPrimitive(firstInit, "int")) {
            final Pair<Name, Expression> initPair = decomposeInitializer(firstInit);
            final Name init = initPair.getFirst();
            final ForLoopContent forContent = getIndexOnIterable(condition, init);
            final Name updater = getUpdaterOperand(updaters.get(0));
            if (forContent != null && isZero(initPair.getSecond()) && isSameVariable(init, forContent.loopVariable) && isSameVariable(init, updater)) {
                return forContent;
            }
        }
    }
    return null;
}
Also used : PostfixExpression(org.eclipse.jdt.core.dom.PostfixExpression) InfixExpression(org.eclipse.jdt.core.dom.InfixExpression) VariableDeclarationExpression(org.eclipse.jdt.core.dom.VariableDeclarationExpression) Expression(org.eclipse.jdt.core.dom.Expression) PrefixExpression(org.eclipse.jdt.core.dom.PrefixExpression) MethodInvocation(org.eclipse.jdt.core.dom.MethodInvocation) QualifiedName(org.eclipse.jdt.core.dom.QualifiedName) Name(org.eclipse.jdt.core.dom.Name) Pair(org.autorefactor.util.Pair)

Example 4 with Pair

use of org.autorefactor.util.Pair in project AutoRefactor by JnRouvignac.

the class ObsoleteIfRatherThanTwoSwitchCasesCleanUp method visit.

@SuppressWarnings("deprecation")
@Override
public boolean visit(final SwitchStatement visited) {
    List<?> statements = visited.statements();
    if (statements.isEmpty()) {
        return true;
    }
    Set<SimpleName> previousVarIds = new HashSet<>();
    Set<SimpleName> caseVarIds = new HashSet<>();
    List<Pair<List<Expression>, List<Statement>>> switchStructure = new ArrayList<>();
    List<Expression> caseExprs = new ArrayList<>();
    List<Statement> caseStatements = new ArrayList<>();
    boolean isPreviousStmtACase = true;
    int caseIndexWithDefault = -1;
    for (Object object : statements) {
        Statement statement = (Statement) object;
        if (statement instanceof SwitchCase) {
            if (!isPreviousStmtACase) {
                if (switchStructure.size() > 2) {
                    return true;
                }
                previousVarIds.addAll(caseVarIds);
                caseVarIds.clear();
                switchStructure.add(Pair.<List<Expression>, List<Statement>>of(caseExprs, caseStatements));
                caseExprs = new ArrayList<>();
                caseStatements = new ArrayList<>();
            }
            if (((SwitchCase) statement).isDefault()) {
                caseIndexWithDefault = switchStructure.size();
            } else {
                caseExprs.add(((SwitchCase) statement).getExpression());
            }
            isPreviousStmtACase = true;
        } else {
            VarConflictVisitor varOccurrenceVisitor = new VarConflictVisitor(previousVarIds, false);
            varOccurrenceVisitor.traverseNodeInterruptibly(statement);
            if (varOccurrenceVisitor.isVarConflicting()) {
                return true;
            }
            caseVarIds.addAll(ASTNodes.getLocalVariableIdentifiers(statement, false));
            caseStatements.add(statement);
            isPreviousStmtACase = false;
        }
    }
    switchStructure.add(Pair.<List<Expression>, List<Statement>>of(caseExprs, caseStatements));
    if (caseIndexWithDefault != -1) {
        Pair<List<Expression>, List<Statement>> caseWithDefault = switchStructure.remove(caseIndexWithDefault);
        switchStructure.add(caseWithDefault);
    }
    if (switchStructure.size() > 2 || !switchStructure.get(switchStructure.size() - 1).getFirst().isEmpty() && !ASTNodes.isPassive(visited.getExpression())) {
        return true;
    }
    List<BreakStatement> overBreaks = new ArrayList<>();
    for (int i = 0; i < switchStructure.size(); i++) {
        Pair<List<Expression>, List<Statement>> caseStructure = switchStructure.get(i);
        if (!caseStructure.getSecond().isEmpty()) {
            Statement lastStatement = caseStructure.getSecond().get(caseStructure.getSecond().size() - 1);
            if (i < switchStructure.size() - 1 && !ASTNodes.fallsThrough(lastStatement)) {
                return true;
            }
            BreakStatement breakStatement = ASTNodes.as(lastStatement, BreakStatement.class);
            if (breakStatement != null && breakStatement.getLabel() == null) {
                caseStructure.getSecond().remove(caseStructure.getSecond().size() - 1);
            }
        } else if (i < switchStructure.size() - 1) {
            return true;
        }
    }
    for (Pair<List<Expression>, List<Statement>> caseStructure : switchStructure) {
        for (Statement oneStatement : caseStructure.getSecond()) {
            BreakVisitor breakVisitor = new BreakVisitor();
            breakVisitor.traverseNodeInterruptibly(oneStatement);
            if (!breakVisitor.canBeRefactored()) {
                return true;
            }
            overBreaks.addAll(breakVisitor.getBreaks());
        }
    }
    replaceBySwitch(visited, switchStructure, caseIndexWithDefault, overBreaks);
    return false;
}
Also used : DoStatement(org.eclipse.jdt.core.dom.DoStatement) SwitchStatement(org.eclipse.jdt.core.dom.SwitchStatement) Statement(org.eclipse.jdt.core.dom.Statement) IfStatement(org.eclipse.jdt.core.dom.IfStatement) WhileStatement(org.eclipse.jdt.core.dom.WhileStatement) BreakStatement(org.eclipse.jdt.core.dom.BreakStatement) ForStatement(org.eclipse.jdt.core.dom.ForStatement) EnhancedForStatement(org.eclipse.jdt.core.dom.EnhancedForStatement) SimpleName(org.eclipse.jdt.core.dom.SimpleName) ArrayList(java.util.ArrayList) BreakStatement(org.eclipse.jdt.core.dom.BreakStatement) VarConflictVisitor(org.autorefactor.jdt.internal.corext.dom.VarConflictVisitor) SwitchCase(org.eclipse.jdt.core.dom.SwitchCase) Expression(org.eclipse.jdt.core.dom.Expression) InfixExpression(org.eclipse.jdt.core.dom.InfixExpression) LambdaExpression(org.eclipse.jdt.core.dom.LambdaExpression) ArrayList(java.util.ArrayList) List(java.util.List) HashSet(java.util.HashSet) Pair(org.autorefactor.util.Pair)

Example 5 with Pair

use of org.autorefactor.util.Pair in project AutoRefactor by JnRouvignac.

the class StringBuilderCleanUp method maybeRefactorAppending.

private boolean maybeRefactorAppending(final Expression visited) {
    List<Pair<ITypeBinding, Expression>> allAppendedStrings = new LinkedList<>();
    AtomicBoolean isRefactoringNeeded = new AtomicBoolean(false);
    AtomicBoolean isInstanceCreationToRewrite = new AtomicBoolean(false);
    Expression lastExpression = readAppendMethod(visited, allAppendedStrings, isRefactoringNeeded, isInstanceCreationToRewrite);
    if (lastExpression != null) {
        removeEmptyStrings(allAppendedStrings, isRefactoringNeeded);
        removeCallsToToString(allAppendedStrings, isRefactoringNeeded);
        if (isRefactoringNeeded.get()) {
            if (!allAppendedStrings.isEmpty() || !isVariable(lastExpression) || !(visited.getParent() instanceof Statement)) {
                return maybeReplaceWithNewStringAppends(visited, allAppendedStrings, lastExpression, isInstanceCreationToRewrite.get());
            }
            refactorAppending(visited);
            return false;
        }
    }
    return true;
}
Also used : AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Expression(org.eclipse.jdt.core.dom.Expression) InfixExpression(org.eclipse.jdt.core.dom.InfixExpression) CastExpression(org.eclipse.jdt.core.dom.CastExpression) ExpressionStatement(org.eclipse.jdt.core.dom.ExpressionStatement) Statement(org.eclipse.jdt.core.dom.Statement) IfStatement(org.eclipse.jdt.core.dom.IfStatement) VariableDeclarationStatement(org.eclipse.jdt.core.dom.VariableDeclarationStatement) LinkedList(java.util.LinkedList) Pair(org.autorefactor.util.Pair)

Aggregations

Pair (org.autorefactor.util.Pair)10 LinkedList (java.util.LinkedList)6 Expression (org.eclipse.jdt.core.dom.Expression)6 InfixExpression (org.eclipse.jdt.core.dom.InfixExpression)6 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)5 Statement (org.eclipse.jdt.core.dom.Statement)4 IfStatement (org.eclipse.jdt.core.dom.IfStatement)3 ArrayList (java.util.ArrayList)2 List (java.util.List)2 ASTRewrite (org.autorefactor.jdt.core.dom.ASTRewrite)2 BlockComment (org.eclipse.jdt.core.dom.BlockComment)2 CastExpression (org.eclipse.jdt.core.dom.CastExpression)2 Comment (org.eclipse.jdt.core.dom.Comment)2 ITypeBinding (org.eclipse.jdt.core.dom.ITypeBinding)2 LineComment (org.eclipse.jdt.core.dom.LineComment)2 TextEditGroup (org.eclipse.text.edits.TextEditGroup)2 HashSet (java.util.HashSet)1 SourceLocation (org.autorefactor.jdt.internal.corext.dom.SourceLocation)1 VarConflictVisitor (org.autorefactor.jdt.internal.corext.dom.VarConflictVisitor)1 SourceLocation (org.autorefactor.refactoring.SourceLocation)1