let rec do_export f d =
export_depends_for_item f d.d_item ;
if not (Mset.mem d.d_name !exported_macros) then
( f d ; exported_macros := Mset.add d.d_name !exported_macros )
and export_depends_for_item f = function
| Type _ | Cons _ | Function _ | Predicate _ | Trecord _ | Axiom _ -> ()
| FunctionDef(_,_,exp) -> export_depends_for_term f exp
| PredicateDef(_,prop) -> export_depends_for_pred f prop
and export_depends_for_name f x =
try
let d = Hashtbl.find gindex x in
if is_macro d then do_export f d
with Not_found -> ()
and export_depends_for_term f = function
| Tconst _ | Tvar _ -> ()
| Tapp(x,ts) ->
export_depends_for_name f x ;
List.iter (export_depends_for_term f) ts
| Tgetfield(_,t) ->
export_depends_for_term f t
| Tsetfield(_,t,v) | Taccess(t,v) | Tlet(_,t,v) ->
export_depends_for_term f t ;
export_depends_for_term f v
| Tupdate(t,v,w) | Tif(t,v,w) ->
export_depends_for_term f t ;
export_depends_for_term f v ;
export_depends_for_term f w
and export_depends_for_pred f = function
| Papp(x,ts) ->
export_depends_for_name f x ;
List.iter (export_depends_for_term f) ts
| Ptrue | Pfalse -> ()
| Pimplies(p,q) | Pand(p,q) | Por(p,q) | Piff(p,q) ->
export_depends_for_pred f p ;
export_depends_for_pred f q
| Pif(c,p,q) ->
export_depends_for_term f c ;
export_depends_for_pred f p ;
export_depends_for_pred f q
| Pnot p | Pnamed(_,p) | Pexists(_,p) | Pforall(_,p) ->
export_depends_for_pred f p
| Plet(_,t,p) ->
export_depends_for_term f t ;
export_depends_for_pred f p