Search in sources :

Example 66 with SingleVariableDeclaration

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;
}
Also used : Variable(org.autorefactor.jdt.internal.corext.dom.Variable) SingleVariableDeclaration(org.eclipse.jdt.core.dom.SingleVariableDeclaration) ExpressionStatement(org.eclipse.jdt.core.dom.ExpressionStatement) SwitchStatement(org.eclipse.jdt.core.dom.SwitchStatement) Statement(org.eclipse.jdt.core.dom.Statement) IfStatement(org.eclipse.jdt.core.dom.IfStatement) ReturnStatement(org.eclipse.jdt.core.dom.ReturnStatement) VariableDeclarationStatement(org.eclipse.jdt.core.dom.VariableDeclarationStatement) MethodInvocation(org.eclipse.jdt.core.dom.MethodInvocation) IfStatement(org.eclipse.jdt.core.dom.IfStatement) ASTNodeFactory(org.autorefactor.jdt.internal.corext.dom.ASTNodeFactory) InfixExpression(org.eclipse.jdt.core.dom.InfixExpression) Block(org.eclipse.jdt.core.dom.Block) ASTRewrite(org.autorefactor.jdt.core.dom.ASTRewrite) TypeNameDecider(org.autorefactor.jdt.internal.corext.dom.TypeNameDecider) FieldAccess(org.eclipse.jdt.core.dom.FieldAccess) TextEditGroup(org.eclipse.text.edits.TextEditGroup)

Example 67 with SingleVariableDeclaration

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;
}
Also used : SingleVariableDeclaration(org.eclipse.jdt.core.dom.SingleVariableDeclaration) SimpleName(org.eclipse.jdt.core.dom.SimpleName)

Example 68 with SingleVariableDeclaration

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;
}
Also used : SingleVariableDeclaration(org.eclipse.jdt.core.dom.SingleVariableDeclaration)

Example 69 with SingleVariableDeclaration

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;
}
Also used : Expression(org.eclipse.jdt.core.dom.Expression) SingleVariableDeclaration(org.eclipse.jdt.core.dom.SingleVariableDeclaration) MethodInvocation(org.eclipse.jdt.core.dom.MethodInvocation)

Example 70 with SingleVariableDeclaration

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;
    }
}
Also used : UnionType(org.eclipse.jdt.core.dom.UnionType) Type(org.eclipse.jdt.core.dom.Type) UnionType(org.eclipse.jdt.core.dom.UnionType) SingleVariableDeclaration(org.eclipse.jdt.core.dom.SingleVariableDeclaration) ITypeBinding(org.eclipse.jdt.core.dom.ITypeBinding)

Aggregations

SingleVariableDeclaration (org.eclipse.jdt.core.dom.SingleVariableDeclaration)124 ITypeBinding (org.eclipse.jdt.core.dom.ITypeBinding)41 MethodDeclaration (org.eclipse.jdt.core.dom.MethodDeclaration)39 Type (org.eclipse.jdt.core.dom.Type)37 Block (org.eclipse.jdt.core.dom.Block)35 ASTNode (org.eclipse.jdt.core.dom.ASTNode)33 AST (org.eclipse.jdt.core.dom.AST)32 ArrayList (java.util.ArrayList)29 List (java.util.List)27 SimpleName (org.eclipse.jdt.core.dom.SimpleName)27 VariableDeclarationFragment (org.eclipse.jdt.core.dom.VariableDeclarationFragment)27 VariableDeclarationStatement (org.eclipse.jdt.core.dom.VariableDeclarationStatement)26 Expression (org.eclipse.jdt.core.dom.Expression)22 CompilationUnit (org.eclipse.jdt.core.dom.CompilationUnit)20 MethodInvocation (org.eclipse.jdt.core.dom.MethodInvocation)18 ImportRewriteContext (org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext)18 PrimitiveType (org.eclipse.jdt.core.dom.PrimitiveType)17 ICompilationUnit (org.eclipse.jdt.core.ICompilationUnit)16 ReturnStatement (org.eclipse.jdt.core.dom.ReturnStatement)16 ASTRewrite (org.eclipse.jdt.core.dom.rewrite.ASTRewrite)16