Search in sources :

Example 1 with Variable

use of org.autorefactor.jdt.internal.corext.dom.Variable 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)

Aggregations

ASTRewrite (org.autorefactor.jdt.core.dom.ASTRewrite)1 ASTNodeFactory (org.autorefactor.jdt.internal.corext.dom.ASTNodeFactory)1 TypeNameDecider (org.autorefactor.jdt.internal.corext.dom.TypeNameDecider)1 Variable (org.autorefactor.jdt.internal.corext.dom.Variable)1 Block (org.eclipse.jdt.core.dom.Block)1 ExpressionStatement (org.eclipse.jdt.core.dom.ExpressionStatement)1 FieldAccess (org.eclipse.jdt.core.dom.FieldAccess)1 IfStatement (org.eclipse.jdt.core.dom.IfStatement)1 InfixExpression (org.eclipse.jdt.core.dom.InfixExpression)1 MethodInvocation (org.eclipse.jdt.core.dom.MethodInvocation)1 ReturnStatement (org.eclipse.jdt.core.dom.ReturnStatement)1 SingleVariableDeclaration (org.eclipse.jdt.core.dom.SingleVariableDeclaration)1 Statement (org.eclipse.jdt.core.dom.Statement)1 SwitchStatement (org.eclipse.jdt.core.dom.SwitchStatement)1 VariableDeclarationStatement (org.eclipse.jdt.core.dom.VariableDeclarationStatement)1 TextEditGroup (org.eclipse.text.edits.TextEditGroup)1