open Ast
open Mapfold
let mk_eq e =
let id = Ident.fresh_ident "_l" in
let eq = (Evarpat id, e) in
let vd = mk_var_dec id e.e_ty in
Evar id, vd, eq
(* Put all the arguments in separate equations *)
let exp funs (eqs, vds) e = match e.e_desc with
| Econst _ | Evar _ -> e, (eqs, vds)
| _ ->
let e, (eqs, vds) = Mapfold.exp funs (eqs, vds) e in
let desc, vd, eq = mk_eq e in
{ e with e_desc = desc }, (eq::eqs, vd::vds)
let equation funs (eqs, vds) (pat, e) =
match e.e_desc with
| Econst _ | Evar _ -> (pat, e), (eqs, vds)
| _ ->
let _, ((_, e)::eqs, _::vds) = Mapfold.exp_it funs (eqs, vds) e in
(pat, e), (eqs, vds)
let block funs acc b = match b with
| BEqs(eqs, vds) ->
let eqs, (new_eqs, new_vds) = Misc.mapfold (Mapfold.equation_it funs) ([], []) eqs in
BEqs(new_eqs@eqs, new_vds@vds), acc
| BIf _ -> raise Mapfold.Fallback
let program p =
let funs = { Mapfold.defaults with exp = exp; equation = equation; block = block } in
let p, _ = Mapfold.program_it funs ([], []) p in
p
(* Used by Callgraph *)
let block b =
let funs = { Mapfold.defaults with exp = exp; equation = equation; block = block } in
let b, _ = Mapfold.block_it funs ([], []) b in
b