Helpers for build OCaml AST fragments
This module is similar to the Ast_helper
module distrubuted with OCaml but uses
different conventions.
Ast_helper
uses a global variable for the default locations, we found that to it
makes it quite easy to mess up locations. Instead this modules forces you to provide a
location argument.
For building fragment using the same location everywhere, a functor is provided.
The names match the Parsetree
names closely, which makes it easy to build AST
fragments by just knowing the Parsetree
.
For types of the form a wrapper record with a _desc
field, helpers are generated for
each constructor constructing the record directly. For instance for the type
Parsetree.expression
:
type expression =
{ pexp_desc : expression_desc
; pexp_loc : Location.t
; pexp_attributes : attributes
}
and expression_desc =
| Pexp_ident of Longident.t loc
| Pexp_constant of constant
| Pexp_let of rec_flag * value_binding list * expression
...
The following helpers are created:
val pexp_ident : loc:Location.t -> Longident.t Located.t -> expression
val pexp_constant : loc:Location.t -> constant -> expression
val pexp_let : loc:Location.t -> rec_flag -> value_binding list -> expression
...
For other record types, such as type_declaration, we have the following helper:
type type_declaration =
{ ptype_name : string Located.t
; ptype_params : (core_type * variance) list
; ptype_cstrs : (core_type * core_type * Location.t) list
; ptype_kind : type_kind
; ptype_private : private_flag
; ptype_manifest : core_type option
; ptype_attributes : attributes
; ptype_loc : Location.t
}
val type_declaration
: loc : Location.t
-> name : string Located.t
-> params : (core_type * variance) list
-> cstrs : (core_type * core_type * Location.t) list
-> kind : type_kind
-> private : private_flag
-> manifest : core_type option
-> type_declaration
Attributes are always set to the empty list. If you want to set them you have to
override the field with the { e with pexp_attributes = ... }
notation.
~loc
argument.