/*
  * (non-Javadoc)
  *
  * @see
  * org.walkmod.javalang.visitors.VoidVisitorAdapter#visit(org.walkmod.javalang.ast.expr.VariableDeclarationExpr,
  * java.lang.Object)
  */
 @SuppressWarnings("unchecked")
 @Override
 public void visit(VariableDeclarationExpr n, VisitorContext arg) {
   Map<String, Object> m = variablesMap.get(classStack.peek());
   Object[] strings = methodStack.toArray();
   for (int i = 0; i < strings.length; i++) {
     m = (Map<String, Object>) m.get(strings[i]);
   }
   String type = getActualType(n.getType());
   List<VariableDeclarator> lDeclarators = n.getVars();
   for (VariableDeclarator declarator : lDeclarators) {
     m.put(declarator.getId().getName(), type);
   }
   super.visit(n, arg);
 }
 /*
  * (non-Javadoc)
  *
  * @see org.walkmod.javalang.visitors.VoidVisitorAdapter#visit(org.walkmod.javalang.ast.body.FieldDeclaration,
  * java.lang.Object)
  */
 @Override
 public void visit(FieldDeclaration n, VisitorContext arg) {
   Map<String, Object> m = variablesMap.get(classStack.peek());
   String type = getActualType(n.getType());
   List<VariableDeclarator> lDeclarators;
   // if(n instanceof VariableDeclarationExpr){
   // lDeclarators = ((VariableDeclarationExpr) n).getVars();
   // }
   // else{
   // }
   lDeclarators = n.getVariables();
   for (VariableDeclarator declarator : lDeclarators) {
     m.put(declarator.getId().getName(), type);
   }
   super.visit(n, arg);
 }
 /*
  * (non-Javadoc)
  *
  * @see org.walkmod.javalang.visitors.VoidVisitorAdapter#visit(org.walkmod.javalang .ast.stmt.BlockStmt,
  * java.lang.Object)
  */
 @Override
 public void visit(BlockStmt n, VisitorContext arg) {
   List<Statement> stmts = n.getStmts();
   if (stmts == null) {
     super.visit(n, arg);
     return;
   }
   int returnStmtIndex = -1;
   String variableName = null;
   for (int i = 0; i < stmts.size(); i++) {
     Statement statement = stmts.get(i);
     if (statement instanceof ReturnStmt) {
       Expression expr = ((ReturnStmt) statement).getExpr();
       if (expr instanceof NameExpr) {
         returnStmtIndex = i;
         variableName = ((NameExpr) expr).getName();
         break;
       }
     }
   }
   if (returnStmtIndex > 0) {
     Statement statement = stmts.get(returnStmtIndex - 1);
     boolean isEmpty = false;
     boolean isRemove = false;
     Expression init = null;
     if (statement instanceof ExpressionStmt) {
       Expression expression = ((ExpressionStmt) statement).getExpression();
       if (expression instanceof VariableDeclarationExpr) {
         List<VariableDeclarator> vars = ((VariableDeclarationExpr) expression).getVars();
         for (VariableDeclarator variableDeclarator : vars) {
           if (variableDeclarator.getId().getName().equals(variableName)) {
             init = variableDeclarator.getInit();
             vars.remove(variableDeclarator);
             isRemove = true;
             break;
           }
         }
         isEmpty = vars.isEmpty();
       } else if (expression instanceof AssignExpr) {
         AssignExpr assignExpr = (AssignExpr) expression;
         if (assignExpr.getOperator() == ASSIGN_OPERATOR) {
           Expression target = assignExpr.getTarget();
           if (target instanceof NameExpr) {
             NameExpr expr = (NameExpr) target;
             if (expr.getName().equals(variableName)) {
               init = assignExpr.getValue();
               isRemove = true;
               isEmpty = true;
             }
           }
         }
       }
       if (isRemove) {
         ReturnStmt returnStmt = (ReturnStmt) stmts.get(returnStmtIndex);
         returnStmt.setExpr(init);
         if (isEmpty) {
           stmts.remove(returnStmtIndex - 1);
         }
       }
     }
   }
   super.visit(n, arg);
 }