22 lines
926 B
OCaml
22 lines
926 B
OCaml
open Asttypes
|
|
open Parsetree
|
|
|
|
let expression mapper node =
|
|
let node = Ast_mapper.default_mapper.expr mapper node in
|
|
match node.pexp_desc with
|
|
| Pexp_extension ({ txt = ("continue" | "cps"); loc }, payload) ->
|
|
begin match payload with
|
|
| PStr [{ pstr_desc = Pstr_eval
|
|
({ pexp_desc = Pexp_let (Nonrecursive, [binding], body); _ }, _); _ }] ->
|
|
let callback = Ast_helper.Exp.fun_ ~loc:binding.pvb_loc
|
|
~attrs:binding.pvb_attributes Nolabel None binding.pvb_pat body in
|
|
Ast_helper.Exp.apply ~loc:node.pexp_loc ~attrs:node.pexp_attributes
|
|
binding.pvb_expr [Nolabel, callback]
|
|
| _ -> Location.raise_errorf ~loc
|
|
"continuum_ppx: expected let%%continue pattern = expression in body (one nonrecursive binding)"
|
|
end
|
|
| _ -> node
|
|
|
|
let () = Ast_mapper.register "continuum_ppx"
|
|
(fun _ -> { Ast_mapper.default_mapper with expr = expression })
|