method vfunc f =
    adding_statement_mode := true;
    assert (!pending_statements_at_beginning = []);
    assert (!pending_statements_at_end = []);
    let change c = fun f -> adding_statement_mode:=false; c f in
    match visitor#vfunc f with
      | SkipChildren -> ChangeToPost(f, change (fun x -> x))
      | JustCopy -> JustCopyPost (change (fun x -> x))
      | JustCopyPost f -> JustCopyPost (change f)
      | ChangeTo f' -> ChangeToPost (f', change (fun x -> x))
      | ChangeToPost(f',action) -> ChangeToPost(f', change action)
      | DoChildren ->
          let postaction_func f =
            insert_pending_statements f;
            adding_statement_mode := false;
            f
          in
          ChangeDoChildrenPost (f, postaction_func)
      | ChangeDoChildrenPost (f', action) ->
          let postaction_func f =
            let f = action f in
            insert_pending_statements f;
            adding_statement_mode := false;
            f
          in
          ChangeDoChildrenPost (f', postaction_func)