method expr =
function
| Ast.ExId (_, (Ast.IdLid (_, s))) |
Ast.ExLab (_, s, (Ast.ExNil _)) |
Ast.ExOlb (_, s, (Ast.ExNil _)) ->
if S.mem s env then o else {< free = f s free; >}
| Ast.ExLet (_, Ast.ReNil, bi, e) ->
(((o#add_binding bi)#expr e)#set_env env)#binding bi
| Ast.ExLet (_, Ast.ReRecursive, bi, e) ->
(((o#add_binding bi)#expr e)#binding bi)#set_env env
| Ast.ExFor (_, s, e1, e2, _, e3) ->
((((o#expr e1)#expr e2)#add_atom s)#expr e3)#set_env
env
| Ast.ExId (_, _) | Ast.ExNew (_, _) -> o
| Ast.ExObj (_, p, cst) ->
((o#add_patt p)#class_str_item cst)#set_env env
| e -> super#expr e