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)