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;
}
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;
}
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;
}
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;
}
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;
}
Aggregations