use of org.eclipse.jdt.core.dom.SingleVariableDeclaration in project AutoRefactor by JnRouvignac.
the class AndroidViewHolderCleanUp method visit.
@Override
public boolean visit(final MethodDeclaration node) {
Block body = node.getBody();
if (body != null && // $NON-NLS-1$//$NON-NLS-2$
ASTNodes.usesGivenSignature(// $NON-NLS-1$//$NON-NLS-2$
node, // $NON-NLS-1$//$NON-NLS-2$
"android.widget.Adapter", // $NON-NLS-1$//$NON-NLS-2$
"getView", // $NON-NLS-1$
int.class.getSimpleName(), // $NON-NLS-1$
"android.view.View", "android.view.ViewGroup")) {
// $NON-NLS-1$
GetViewVariableVisitor visitor = new GetViewVariableVisitor();
body.accept(visitor);
if (visitor.canApplyRefactoring()) {
ASTRewrite rewrite = cuRewrite.getASTRewrite();
ASTNodeFactory ast = cuRewrite.getASTBuilder();
TextEditGroup group = new TextEditGroup(MultiFixMessages.AndroidViewHolderCleanUp_description);
TypeNameDecider typeNameDecider = new TypeNameDecider(visitor.viewVariableName);
// Transform tree
// Create If statement
SingleVariableDeclaration viewArg = (SingleVariableDeclaration) node.parameters().get(1);
Variable convertViewVar = new Variable(viewArg.getName().getIdentifier(), ast);
InfixExpression newInfixExpression = ast.newInfixExpression();
newInfixExpression.setLeftOperand(convertViewVar.varName());
newInfixExpression.setOperator(InfixExpression.Operator.EQUALS);
newInfixExpression.setRightOperand(ast.newNullLiteral());
InfixExpression condition = newInfixExpression;
Block thenBlock = ast.newBlock();
IfStatement newIfStatement = ast.newIfStatement();
newIfStatement.setExpression(condition);
newIfStatement.setThenStatement(thenBlock);
rewrite.insertBefore(newIfStatement, visitor.viewAssignmentStatement, group);
List<Statement> thenStatements = thenBlock.statements();
thenStatements.add(ast.newExpressionStatement(ast.newAssignment(convertViewVar.varName(), Assignment.Operator.ASSIGN, ast.createCopyTarget(visitor.getInflateExpression()))));
// Assign to local view variable when necessary
if (!"convertView".equals(visitor.viewVariableName.getIdentifier())) {
// $NON-NLS-1$
Statement assignConvertViewToView = null;
if (visitor.viewVariableDeclFragment != null) {
assignConvertViewToView = ast.declareStatement(ast.copyType(visitor.viewVariableName, typeNameDecider), ast.createCopyTarget(visitor.viewVariableName), convertViewVar.varName());
} else if (visitor.viewVariableAssignment != null) {
assignConvertViewToView = ast.newExpressionStatement(ast.newAssignment(ast.createCopyTarget(visitor.viewVariableName), Assignment.Operator.ASSIGN, convertViewVar.varName()));
}
if (assignConvertViewToView != null) {
rewrite.insertBefore(assignConvertViewToView, visitor.viewAssignmentStatement, group);
}
}
// Make sure method returns the view to be reused
if (visitor.returnStatement != null) {
rewrite.insertAfter(ast.newReturnStatement(ast.createCopyTarget(visitor.viewVariableName)), visitor.returnStatement, group);
rewrite.remove(visitor.returnStatement, group);
}
// Optimize findViewById calls
FindViewByIdVisitor findViewByIdVisitor = new FindViewByIdVisitor(visitor.viewVariableName);
body.accept(findViewByIdVisitor);
if (!findViewByIdVisitor.items.isEmpty()) {
// TODO JNR name conflict? Use VariableNameDecider
// $NON-NLS-1$ //$NON-NLS-2$
Variable viewHolderItemVar = new Variable("ViewHolderItem", "viewHolderItem", ast);
// Create ViewHolderItem class
rewrite.insertBefore(createViewHolderItemClass(findViewByIdVisitor, viewHolderItemVar.typeName(), typeNameDecider), node, group);
// Declare viewhHolderItem object
rewrite.insertFirst(body, Block.STATEMENTS_PROPERTY, viewHolderItemVar.declareStatement(), group);
// Initialize viewHolderItem
thenStatements.add(ast.newExpressionStatement(ast.newAssignment(viewHolderItemVar.varName(), Assignment.Operator.ASSIGN, ast.newClassInstanceCreation(viewHolderItemVar.type()))));
// Assign findViewById to ViewHolderItem
for (FindViewByIdVisitor.FindViewByIdItem item : findViewByIdVisitor.items) {
// Ensure we are accessing convertView object
FieldAccess fieldAccess = ast.newFieldAccess(viewHolderItemVar.varName(), ast.newSimpleName(item.variable.getIdentifier()));
// FIXME This does not work: not sure why??
// rewrite.set(item.findViewByIdInvocation,
// MethodInvocation.EXPRESSION_PROPERTY, convertViewVar.varName());
item.findViewByIdInvocation.setExpression(convertViewVar.varName());
// FIXME For some reason ast.copy() does not do what we would like
thenStatements.add(ast.newExpressionStatement(ast.newAssignment(fieldAccess, Assignment.Operator.ASSIGN, ast.copySubtree(item.findViewByIdExpression))));
// Replace previous findViewById with accesses to viewHolderItem
rewrite.replace(item.findViewByIdExpression, ast.createCopyTarget(fieldAccess), group);
}
MethodInvocation setTagMethod = ast.newMethodInvocation();
// $NON-NLS-1$
setTagMethod.setExpression(ASTNodeFactory.newName(ast, "convertView"));
// $NON-NLS-1$
setTagMethod.setName(ast.newSimpleName("setTag"));
setTagMethod.arguments().add(viewHolderItemVar.varName());
// Store viewHolderItem in convertView
thenStatements.add(ast.newExpressionStatement(setTagMethod));
Block newBlock = ast.newBlock();
MethodInvocation getTagMethod = ast.newMethodInvocation();
// $NON-NLS-1$
getTagMethod.setExpression(ASTNodeFactory.newName(ast, "convertView"));
// $NON-NLS-1$
getTagMethod.setName(ast.newSimpleName("getTag"));
newBlock.statements().add(ast.newExpressionStatement(ast.newAssignment(viewHolderItemVar.varName(), Assignment.Operator.ASSIGN, ast.newCastExpression(viewHolderItemVar.type(), getTagMethod))));
// Retrieve viewHolderItem from convertView
newIfStatement.setElseStatement(newBlock);
}
rewrite.remove(visitor.viewAssignmentStatement, group);
return false;
}
}
return true;
}
use of org.eclipse.jdt.core.dom.SingleVariableDeclaration in project AutoRefactor by JnRouvignac.
the class SuperCallRatherThanUselessOverridingCleanUp method haveSameParameters.
private boolean haveSameParameters(final MethodDeclaration visited, final SuperMethodInvocation bodyMi) {
List<?> parameters = visited.parameters();
for (int i = 0; i < visited.parameters().size(); i++) {
SingleVariableDeclaration paramName = (SingleVariableDeclaration) parameters.get(i);
SimpleName paramExpression = ASTNodes.as((Expression) bodyMi.arguments().get(i), SimpleName.class);
if (paramExpression == null || !ASTNodes.isSameVariable(paramName.getName(), paramExpression)) {
return false;
}
}
return true;
}
use of org.eclipse.jdt.core.dom.SingleVariableDeclaration in project AutoRefactor by JnRouvignac.
the class ASTNodeFactory method newSingleVariableDeclaration.
/**
* Builds a new {@link SingleVariableDeclaration} instance.
*
* @param varName the name of the variable being declared
* @param type the type of the variable being declared
* @return a new single variable declaration
*/
public SingleVariableDeclaration newSingleVariableDeclaration(final String varName, final Type type) {
SingleVariableDeclaration svd = ast.newSingleVariableDeclaration();
svd.setName(newSimpleName(varName));
svd.setType(type);
return svd;
}
use of org.eclipse.jdt.core.dom.SingleVariableDeclaration in project AutoRefactor by JnRouvignac.
the class EntrySetRatherThanKeySetAndValueSearchCleanUp method visit.
@Override
public boolean visit(final EnhancedForStatement enhancedFor) {
MethodInvocation foreachExpression = ASTNodes.as(enhancedFor.getExpression(), MethodInvocation.class);
if (isKeySetMethod(foreachExpression)) {
// From 'for (K key : map.keySet()) { }'
// -> mapExpression become 'map', parameter become 'K key'
Expression mapExpression = foreachExpression.getExpression();
if (mapExpression == null) {
// Not implemented
return true;
}
SingleVariableDeclaration parameter = enhancedFor.getParameter();
List<MethodInvocation> getValueMis = collectMapGetValueCalls(mapExpression, parameter, enhancedFor.getBody());
if (!getValueMis.isEmpty() && haveSameTypeBindings(getValueMis)) {
replaceEntryIterationByKeyIteration(enhancedFor, mapExpression, parameter, getValueMis);
return false;
}
}
return true;
}
use of org.eclipse.jdt.core.dom.SingleVariableDeclaration in project AutoRefactor by JnRouvignac.
the class ObsoleteUseMultiCatchCleanUp method resolveBinding.
private Binding resolveBinding(final CatchClause catchClause) {
SingleVariableDeclaration singleVariableDeclaration = catchClause.getException();
Type type = singleVariableDeclaration.getType();
switch(type.getNodeType()) {
case ASTNode.SIMPLE_TYPE:
return new SingleBinding(type.resolveBinding());
case ASTNode.UNION_TYPE:
List<Type> types = ((UnionType) type).types();
ITypeBinding[] typeBindings = new ITypeBinding[types.size()];
for (int i = 0; i < types.size(); i++) {
typeBindings[i] = types.get(i).resolveBinding();
}
return new MultiBinding(typeBindings);
default:
return null;
}
}
Aggregations