@Override
  public void visitToken(DetailAST ast) {
    switch (ast.getType()) {
      case TokenTypes.OBJBLOCK:
      case TokenTypes.SLIST:
      case TokenTypes.LITERAL_FOR:
      case TokenTypes.METHOD_DEF:
      case TokenTypes.CTOR_DEF:
      case TokenTypes.STATIC_INIT:
      case TokenTypes.INSTANCE_INIT:
        scopeStack.push(new HashMap<String, DetailAST>());
        break;

      case TokenTypes.PARAMETER_DEF:
        if (!inLambda(ast)
            && !ast.branchContains(TokenTypes.FINAL)
            && !inAbstractOrNativeMethod(ast)
            && !ScopeUtils.inInterfaceBlock(ast)) {
          insertVariable(ast);
        }
        break;
      case TokenTypes.VARIABLE_DEF:
        if (ast.getParent().getType() != TokenTypes.OBJBLOCK
            && isVariableInForInit(ast)
            && shouldCheckEnhancedForLoopVariable(ast)
            && !ast.branchContains(TokenTypes.FINAL)) {
          insertVariable(ast);
        }
        break;

      case TokenTypes.IDENT:
        final int parentType = ast.getParent().getType();
        if (isAssignOperator(parentType) && ast.getParent().getFirstChild() == ast) {
          removeVariable(ast);
        }
        break;

      default:
    }
  }