Module PpxlibSource
Standard library for ppx rewriters
ppxlib is meant to be opened globally in your PPX source files.
Opening it comes with two advantages. First, it will shadow the compiler-libs modules. The compiler-libs modules are unstable and aren't meant to be used, so shadowing them is a good protection mechanism. In case you don't want to open Ppxlib, you can open Ocaml_shadow to get the same protection. Second, it will bring several modules in scope, that are useful to have when writing a rewriter:
- The main
ppxlibmodules, such as modules to help manipulate the AST (Ast_builder,Ast_pattern), and a few functions. - Modules from other libraries, such as
Ast_helperorPprintast, - The whole AST types (by
includingtheAstmodule).
The core ppxlib entries
Manipulating the AST
Ast_builder is a module to generate OCaml AST fragments. It provides a shorter syntax than directly using the Parsetree constructors, as well as a better stability than the constructors.
This module implements first class AST patterns. It allows to destruct and extract values from AST fragments. This gives the same functionality as a pattern-match, but with simpler syntax and more stability than directly pattern-matching on the Parsetree constructors.
This module provides AST traversal classes, such as maps, iterations, folds, etc. on the Parsetree types.
Context-free rewriting
Context free rewriting, to define local rewriting rules that will all be applied at once by the driver.
The context given to rewriting rules when expanding.
This module contains type and functions for representing and manipulating path to AST nodes.
Other helpers
Various helpers for expansion, such as quoting expressions in their context, or mangling names.
Some helpers to annotate the AST so merlin can decide which branches to look at and which branches to ignore.
Helpers to provide hints to PPX users for typos or spellchecks.
Driver-related modules
Interaction with the driver, such as getting/seeting cookies, adding arguments.
Checks
This module provides hygiene for attributes. The goal is to report misuses of attributes to the user as soon as possible so that no mistyped attribute get silently ignored.
Small module to reserve namespaces in attribute names.
Common helper functions
val core_type_of_type_declaration :
Astlib.Ast_500.Parsetree.type_declaration ->
Astlib.Ast_500.Parsetree.core_typeval name_type_params_in_td_res :
Astlib.Ast_500.Parsetree.type_declaration ->
(Astlib.Ast_500.Parsetree.type_declaration,
Ppxlib.Location.Error.t Stdppx.NonEmptyList.t)
Stdlib.resultval name_type_params_in_td :
Astlib.Ast_500.Parsetree.type_declaration ->
Astlib.Ast_500.Parsetree.type_declarationval combinator_type_of_type_declaration :
Astlib.Ast_500.Parsetree.type_declaration ->
f:
(loc:Ppxlib.Location.t ->
Astlib.Ast_500.Parsetree.core_type ->
Astlib.Ast_500.Parsetree.core_type) ->
Astlib.Ast_500.Parsetree.core_typegen_symbol ?prefix () generates a fresh variable name with prefix.
val attributes_errors :
Astlib.Ast_500.Parsetree.attribute list ->
Ppxlib.Location.Error.t listval get_type_param_name_res :
(Astlib.Ast_500.Parsetree.core_type
* (Astlib.Ast_500.Asttypes.variance * Astlib.Ast_500.Asttypes.injectivity)) ->
(string Ppxlib.Loc.t, Ppxlib.Location.Error.t Stdppx.NonEmptyList.t)
Stdlib.resultget_type_param_name_res tp returns the string identifier associated with tp if it is a type parameter, as a result.
val get_type_param_name :
(Astlib.Ast_500.Parsetree.core_type
* (Astlib.Ast_500.Asttypes.variance * Astlib.Ast_500.Asttypes.injectivity)) ->
string Ppxlib.Loc.tSee get_type_param_name_res. Raises a located error in case of failure.
class type_is_recursive : Astlib.Ast_500.Asttypes.rec_flag -> Astlib.Ast_500.Parsetree.type_declaration
list -> object ... end(new type_is_recursive rec_flag tds)#go () returns whether rec_flag, tds is really a recursive type. We disregard recursive occurrences appearing in arrow types. You can override the search for certain type expressions by inheriting from this class.
val really_recursive :
Astlib.Ast_500.Asttypes.rec_flag ->
Astlib.Ast_500.Parsetree.type_declaration list ->
Astlib.Ast_500.Asttypes.rec_flagreally_recursive rec_flag tds = (new type_is_recursive rec_flag tds)#go ()
val loc_of_extension :
(string Astlib.Location.loc * Astlib.Ast_500.Parsetree.payload) ->
Ppxlib.Location.tval curry_applications :
Astlib.Ast_500.Parsetree.expression ->
Astlib.Ast_500.Parsetree.expressionconvert multi-arg function applications into a cascade of 1-arg applications
Encode a warning message into an 'ocaml.ppwarning' attribute which can be inserted in a generated Parsetree. The compiler will be responsible for reporting the warning.
val is_polymorphic_variant :
Astlib.Ast_500.Parsetree.type_declaration ->
sig_:bool ->
[> `Definitely | `Maybe | `Surely_not ]val mk_named_sig :
loc:Ppxlib.Location.t ->
sg_name:string ->
handle_polymorphic_variant:bool ->
Astlib.Ast_500.Parsetree.type_declaration list ->
Astlib.Ast_500.Parsetree.module_type Astlib.Ast_500.Parsetree.include_infos
optionmk_named_sig ~loc ~sg_name:"Foo" ~handle_polymorphic_variant tds will generate
include Foo (* or Foo1, Foo2, Foo3 *)
with type (* ('a, 'b, 'c) *) t := (* ('a, 'b, 'c) *) twhen:
- there is only one type declaration
- the type is named t
- there are less than 4 type parameters
- there are no constraints on the type parameters
It will take care of giving fresh names to unnamed type parameters.
valid_string_constant_delimiter x finds a delimiter y such that Pconst_string (x, loc, Some y) is valid.
Modules from other libraries
Expose some modules from Ppxlib_ast.
module Ast = Ppxlib_ast.Astmodule Ast_helper = Ppxlib_ast.Ast_helpermodule Asttypes = Ppxlib_ast.Asttypesmodule Parse = Ppxlib_ast.Parsemodule Parsetree = Ppxlib_ast.Parsetreemodule Selected_ast = Ppxlib_ast.Selected_astThe whole AST types
Include all the Ast definitions since we need them in every single ppx
include module type of struct include Ast end
and location = Astlib.Location.t = {loc_start : Ppxlib.position;loc_end : Ppxlib.position;loc_ghost : bool;
}and location_stack = Ppxlib.location listand modalities = Ppxlib.modality Ppxlib.loc listand modes = Ppxlib.mode Ppxlib.loc listand longident = Astlib.Longident.t = | Lident of string| Ldot of Ppxlib.longident * string| Lapply of Ppxlib.longident * Ppxlib.longident
and longident_loc = Ppxlib.longident Ppxlib.locAuxiliary AST types used by parsetree and typedtree.
and arg_label = Astlib.Ast_500.Asttypes.arg_label = and index_kind = Astlib.Ast_500.Asttypes.index_kind = Abstract syntax tree produced by parsing
and constant = Astlib.Ast_500.Parsetree.constant = | Pconst_integer of string * char option(*Integer constants such as
33l3L3n.Suffixes
*)[g-z][G-Z]are accepted by the parser. Suffixes except'l','L'and'n'are rejected by the typechecker| Pconst_unboxed_integer of string * char(*Integer constants such as
#3#3l#3L#3n.A suffix
*)[g-z][G-Z]is required by the parser. Suffixes except'l','L'and'n'are rejected by the typechecker| Pconst_char of char(*Character such as
*)'c'.| Pconst_untagged_char of char(*Untagged character such as
*)#'c'.| Pconst_string of string * Ppxlib.location * string option(*Constant string such as
"constant"or{delim|other constant|delim}.The location span the content of the string, without the delimiters.
*)| Pconst_float of string * char option(*Float constant such as
3.4,2e5or1.4e-4.Suffixes
*)[g-z][G-Z]are accepted by the parser. Suffixes are rejected by the typechecker.| Pconst_unboxed_float of string * char option(*Float constant such as
#3.4,#2e5or#1.4e-4.Suffixes
*)[g-z][G-Z]are accepted by the parser. Suffixes except's'are rejected by the typechecker.
Extension points
and attribute = Astlib.Ast_500.Parsetree.attribute = {attr_name : string Ppxlib.loc;attr_payload : Ppxlib.payload;attr_loc : Ppxlib.location;
}Attributes such as [@id ARG] and [@@id ARG].
Metadata containers passed around within the AST. The compiler ignores unknown attributes.
and extension = string Ppxlib.loc * Ppxlib.payloadExtension points such as [%id ARG] and [%%id ARG].
Sub-language placeholder -- rejected by the typechecker.
and attributes = Ppxlib.attribute listand payload = Astlib.Ast_500.Parsetree.payload = | PStr of Ppxlib.structure| PSig of Ppxlib.signature(*
*): SIGin an attribute or an extension point| PTyp of Ppxlib.core_type(*
*): Tin an attribute or an extension point| PPat of Ppxlib.pattern * Ppxlib.expression option(*
*)? Por? P when E, in an attribute or an extension point
Core language
Type expressions
and core_type = Astlib.Ast_500.Parsetree.core_type = {ptyp_desc : Ppxlib.core_type_desc;ptyp_loc : Ppxlib.location;ptyp_loc_stack : Ppxlib.location_stack;ptyp_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and core_type_desc = Astlib.Ast_500.Parsetree.core_type_desc = | Ptyp_any of Ppxlib.jkind_annotation option(*
*)_or_ : k| Ptyp_var of string * Ppxlib.jkind_annotation option(*A type variable such as
*)'aor'a : k| Ptyp_arrow of Ppxlib.arg_label * Ppxlib.core_type * Ppxlib.core_type * Ppxlib.modes * Ppxlib.modes| Ptyp_tuple of (string option * Ppxlib.core_type) list(*Ptyp_tuple(tl)represents a product type:T1 * ... * Tnwhentlis(None,T1);...;(None,Tn)L1:T1 * ... * Ln:Tnwhentlis(Some L1,T1);...;(Some Ln,Tn)- A mix, e.g.
L1:T1 * T2whentlis(Some L1,T1);(None,T2)
Invariant:
*)n >= 2.| Ptyp_unboxed_tuple of (string option * Ppxlib.core_type) list(*Unboxed tuple types:
Ptyp_unboxed_tuple([(Some l1,P1);...;(Some l2,Pn)]represents a product type#(l1:T1 * ... * l2:Tn), and the labels are optional.Invariant:
*)n >= 2.| Ptyp_constr of Ppxlib.longident_loc * Ppxlib.core_type list(*Ptyp_constr(lident, l)represents:tconstrwhenl=[],T tconstrwhenl=[T],(T1, ..., Tn) tconstrwhenl=[T1 ; ... ; Tn].
| Ptyp_object of Ppxlib.object_field list * Ppxlib.closed_flag| Ptyp_class of Ppxlib.longident_loc * Ppxlib.core_type list(*Ptyp_class(tconstr, l)represents:#tconstrwhenl=[],T #tconstrwhenl=[T],(T1, ..., Tn) #tconstrwhenl=[T1 ; ... ; Tn].
| Ptyp_alias of Ppxlib.core_type * string Ppxlib.loc option * Ppxlib.jkind_annotation option(*T as 'aorT as ('a : k)orT as (_ : k).Invariant: the name or jkind annotation is non-None.
*)| Ptyp_variant of Ppxlib.row_field list * Ppxlib.closed_flag * Ppxlib.label list option| Ptyp_poly of (string Ppxlib.loc * Ppxlib.jkind_annotation option) list * Ppxlib.core_type(*'a1 ... 'an. T('a1 : k1) ... ('an : kn). TCan only appear in the following context:
- As the
core_typeof aPpat_constraintnode corresponding to a constraint on a let-binding:
let x : 'a1 ... 'an. T = e ...- Under
Cfk_virtualfor methods (not values).
- As the
core_typeof aPctf_methodnode.
- As the
pld_typefield of alabel_declaration.
- As a
core_typeof aPtyp_objectnode.
- As the
pval_typefield of avalue_description.
- As the
| Ptyp_package of Ppxlib.package_type(*
*)(module S).| Ptyp_quote of Ppxlib.core_type(*
*)<[T]>| Ptyp_splice of Ppxlib.core_type(*
*)$T| Ptyp_of_kind of Ppxlib.jkind_annotation(*
*)(type : k)| Ptyp_extension of Ppxlib.extension(*
*)[%id].
and package_type =
Ppxlib.longident_loc * (Ppxlib.longident_loc * Ppxlib.core_type) listAs package_type typed values:
(S, [])represents(module S),(S, [(t1, T1) ; ... ; (tn, Tn)])represents(module S with type t1 = T1 and ... and tn = Tn).
and row_field = Astlib.Ast_500.Parsetree.row_field = {prf_desc : Ppxlib.row_field_desc;prf_loc : Ppxlib.location;prf_attributes : Ppxlib.attributes;
}and row_field_desc = Astlib.Ast_500.Parsetree.row_field_desc = | Rtag of Ppxlib.label Ppxlib.loc * bool * Ppxlib.core_type list(*Rtag(`A, b, l)represents:`Awhenbistrueandlis[],`A of Twhenbisfalseandlis[T],`A of T1 & .. & Tnwhenbisfalseandlis[T1;...Tn],`A of & T1 & .. & Tnwhenbistrueandlis[T1;...Tn].
- The
boolfield is true if the tag contains a constant (empty) constructor. &occurs when several types are used for the same constructor (see 4.2 in the manual)
| Rinherit of Ppxlib.core_type(*
*)[ | t ]
and object_field = Astlib.Ast_500.Parsetree.object_field = {pof_desc : Ppxlib.object_field_desc;pof_loc : Ppxlib.location;pof_attributes : Ppxlib.attributes;
}and object_field_desc = Astlib.Ast_500.Parsetree.object_field_desc = | Otag of Ppxlib.label Ppxlib.loc * Ppxlib.core_type| Oinherit of Ppxlib.core_type
Patterns
and pattern = Astlib.Ast_500.Parsetree.pattern = {ppat_desc : Ppxlib.pattern_desc;ppat_loc : Ppxlib.location;ppat_loc_stack : Ppxlib.location_stack;ppat_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and pattern_desc = Astlib.Ast_500.Parsetree.pattern_desc = | Ppat_any(*The pattern
*)_.| Ppat_var of string Ppxlib.loc(*A variable pattern such as
*)x| Ppat_alias of Ppxlib.pattern * string Ppxlib.loc(*An alias pattern such as
*)P as 'a| Ppat_constant of Ppxlib.constant(*Patterns such as
*)1,'a',"true",1.0,1l,1L,1n| Ppat_interval of Ppxlib.constant * Ppxlib.constant(*Patterns such as
'a'..'z'.Other forms of interval are recognized by the parser but rejected by the type-checker.
*)| Ppat_tuple of (string option * Ppxlib.pattern) list * Ppxlib.closed_flag(*Ppat_tuple(pl, Closed)represents(P1, ..., Pn)whenplis(None, P1);...;(None, Pn)(~L1:P1, ..., ~Ln:Pn)whenplis(Some L1, P1);...;(Some Ln, Pn)- A mix, e.g.
(~L1:P1, P2)whenplis(Some L1, P1);(None, P2) - If pattern is open, then it also ends in a
..
Invariant:
- If Closed,
n >= 2. - If Open,
n >= 1.
| Ppat_unboxed_tuple of (string option * Ppxlib.pattern) list * Ppxlib.closed_flag(*Unboxed tuple patterns:
#(l1:P1, ..., ln:Pn)is([(Some l1,P1);...;(Some l2,Pn)], Closed), and the labels are optional. AnOpenpattern ends in...Invariant:
- If Closed,
n >= 2 - If Open,
n >= 1
- If Closed,
| Ppat_construct of Ppxlib.longident_loc * ((string Ppxlib.loc * Ppxlib.jkind_annotation option) list * Ppxlib.pattern) option(*Ppat_construct(C, args)represents:CwhenargsisNone,C PwhenargsisSome ([], P)C (P1, ..., Pn)whenargsisSome ([], Ppat_tuple [P1; ...; Pn])C (type a b) PwhenargsisSome ([a, None; b, None], P)C (type (a : k) b) PwhenargsisSome ([a, Some k; b, None], P)
| Ppat_variant of Ppxlib.label * Ppxlib.pattern option(*Ppat_variant(`A, pat)represents:`AwhenpatisNone,`A PwhenpatisSome P
| Ppat_record of (Ppxlib.longident_loc * Ppxlib.pattern) list * Ppxlib.closed_flag| Ppat_record_unboxed_product of (Ppxlib.longident_loc * Ppxlib.pattern) list * Ppxlib.closed_flag| Ppat_array of Ppxlib.mutable_flag * Ppxlib.pattern list(*Pattern
*)[| P1; ...; Pn |]or[: P1; ...; Pn :]| Ppat_or of Ppxlib.pattern * Ppxlib.pattern(*Pattern
*)P1 | P2| Ppat_constraint of Ppxlib.pattern * Ppxlib.core_type option * Ppxlib.modes(*Ppat_constraint(tyopt, modes)represents:(P : ty @@ modes)whentyoptisSome ty(P @ modes)whentyoptisNone
| Ppat_type of Ppxlib.longident_loc(*Pattern
*)#tconst| Ppat_lazy of Ppxlib.pattern(*Pattern
*)lazy P| Ppat_unpack of string option Ppxlib.loc(*Ppat_unpack(s)represents:(module P)whensisSome "P"(module _)whensisNone
Note:
*)(module P : S)is represented asPpat_constraint(Ppat_unpack(Some "P"), Ptyp_package S)| Ppat_exception of Ppxlib.pattern(*Pattern
*)exception P| Ppat_extension of Ppxlib.extension(*Pattern
*)[%id]| Ppat_open of Ppxlib.longident_loc * Ppxlib.pattern(*Pattern
*)M.(P)
Value expressions
and expression = Astlib.Ast_500.Parsetree.expression = {pexp_desc : Ppxlib.expression_desc;pexp_loc : Ppxlib.location;pexp_loc_stack : Ppxlib.location_stack;pexp_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and expression_desc = Astlib.Ast_500.Parsetree.expression_desc = | Pexp_ident of Ppxlib.longident_loc(*Identifiers such as
*)xandM.x| Pexp_constant of Ppxlib.constant(*Expressions constant such as
*)1,'a',"true",1.0,1l,1L,1n| Pexp_let of Ppxlib.mutable_flag * Ppxlib.rec_flag * Ppxlib.value_binding list * Ppxlib.expression(*Pexp_let(mut, rec, [(P1,E1) ; ... ; (Pn,En)], E)represents:let P1 = E1 and ... and Pn = EN in EwhenrecisNonrecursiveandmut=Immutable.let rec P1 = E1 and ... and Pn = EN in EwhenrecisRecursiveandmut=Immutable.let mutable P1 = E1 in EwhenrecisNonrecursiveandmut=Mutable. Invariant: Ifmut = Mutablethenn = 1andrec = Nonrecursive
| Pexp_function of Ppxlib.function_param list * Ppxlib.function_constraint * Ppxlib.function_body(*Pexp_function ([P1; ...; Pn], C, body)represents any construct involvingfunorfunction, including:fun P1 ... Pn -> Ewhenbody = Pfunction_body Efun P1 ... Pn -> function p1 -> e1 | ... | pm -> emwhenbody = Pfunction_cases [ p1 -> e1; ...; pm -> em ]
Crepresents a type constraint or coercion placed immediately before the arrow, e.g.fun P1 ... Pn : ty -> ...whenC = Some (Pconstraint ty).A function must have parameters.
*)Pexp_function (params, _, body)must have non-emptyparamsor aPfunction_cases _body.| Pexp_apply of Ppxlib.expression * (Ppxlib.arg_label * Ppxlib.expression) list| Pexp_match of Ppxlib.expression * Ppxlib.cases(*
*)match E0 with P1 -> E1 | ... | Pn -> En| Pexp_try of Ppxlib.expression * Ppxlib.cases(*
*)try E0 with P1 -> E1 | ... | Pn -> En| Pexp_tuple of (string option * Ppxlib.expression) list(*Pexp_tuple(el)represents(E1, ..., En)whenelis(None, E1);...;(None, En)(~L1:E1, ..., ~Ln:En)whenelis(Some L1, E1);...;(Some Ln, En)- A mix, e.g.:
(~L1:E1, E2)whenelis(Some L1, E1); (None, E2)
Invariant:
*)n >= 2| Pexp_unboxed_tuple of (string option * Ppxlib.expression) list(*Unboxed tuple expressions:
Pexp_unboxed_tuple([(Some l1,P1);...;(Some l2,Pn)])represents#(l1:E1, ..., ln:En), and the labels are optional.Invariant:
*)n >= 2| Pexp_construct of Ppxlib.longident_loc * Ppxlib.expression option(*Pexp_construct(C, exp)represents:CwhenexpisNone,C EwhenexpisSome E,C (E1, ..., En)whenexpisSome (Pexp_tuple[E1;...;En])
| Pexp_variant of Ppxlib.label * Ppxlib.expression option(*Pexp_variant(`A, exp)represents`AwhenexpisNone`A EwhenexpisSome E
| Pexp_record of (Ppxlib.longident_loc * Ppxlib.expression) list * Ppxlib.expression option(*Pexp_record([(l1,P1) ; ... ; (ln,Pn)], exp0)represents{ l1=P1; ...; ln=Pn }whenexp0isNone{ E0 with l1=P1; ...; ln=Pn }whenexp0isSome E0
Invariant:
*)n > 0| Pexp_record_unboxed_product of (Ppxlib.longident_loc * Ppxlib.expression) list * Ppxlib.expression option(*Pexp_record_unboxed_product([(l1,P1) ; ... ; (ln,Pn)], exp0)represents#{ l1=P1; ...; ln=Pn }whenexp0isNone#{ E0 with l1=P1; ...; ln=Pn }whenexp0isSome E0
Invariant:
*)n > 0| Pexp_field of Ppxlib.expression * Ppxlib.longident_loc(*
*)E.l| Pexp_unboxed_field of Ppxlib.expression * Ppxlib.longident_loc(*
*)E.#l| Pexp_setfield of Ppxlib.expression * Ppxlib.longident_loc * Ppxlib.expression(*
*)E1.l <- E2| Pexp_array of Ppxlib.mutable_flag * Ppxlib.expression list(*
*)[| E1; ...; En |]or[: E1; ...; En :]| Pexp_idx of Ppxlib.block_access * Ppxlib.unboxed_access list(*
*)(BA1 UA1 UA2 ...)e.g.(.foo.#bar.#baz)Above, BA1=.foo, UA1=.#bar, and UA2=#.baz| Pexp_ifthenelse of Ppxlib.expression * Ppxlib.expression * Ppxlib.expression option(*
*)if E1 then E2 else E3| Pexp_sequence of Ppxlib.expression * Ppxlib.expression(*
*)E1; E2| Pexp_while of Ppxlib.expression * Ppxlib.expression(*
*)while E1 do E2 done| Pexp_for of Ppxlib.pattern * Ppxlib.expression * Ppxlib.expression * Ppxlib.direction_flag * Ppxlib.expression| Pexp_constraint of Ppxlib.expression * Ppxlib.core_type option * Ppxlib.modes(*
*)(E : T @@ modes)| Pexp_coerce of Ppxlib.expression * Ppxlib.core_type option * Ppxlib.core_type(*Pexp_coerce(E, from, T)represents(E :> T)whenfromisNone,(E : T0 :> T)whenfromisSome T0.
| Pexp_send of Ppxlib.expression * Ppxlib.label Ppxlib.loc(*
*)E # m| Pexp_new of Ppxlib.longident_loc(*
*)new M.c| Pexp_setvar of Ppxlib.label Ppxlib.loc * Ppxlib.expression(*
*)x <- 2| Pexp_override of (Ppxlib.label Ppxlib.loc * Ppxlib.expression) list(*
*){< x1 = E1; ...; xn = En >}| Pexp_letmodule of string option Ppxlib.loc * Ppxlib.module_expr * Ppxlib.expression(*
*)let module M = ME in E| Pexp_letexception of Ppxlib.extension_constructor * Ppxlib.expression(*
*)let exception C in E| Pexp_assert of Ppxlib.expression(*assert E.Note:
*)assert falseis treated in a special way by the type-checker.| Pexp_lazy of Ppxlib.expression(*
*)lazy E| Pexp_poly of Ppxlib.expression * Ppxlib.core_type option(*Used for method bodies.
Can only be used as the expression under
*)Cfk_concretefor methods (not values).| Pexp_object of Ppxlib.class_structure(*
*)object ... end| Pexp_newtype of string Ppxlib.loc * Ppxlib.jkind_annotation option * Ppxlib.expression(*
*)fun (type t) -> Eorfun (type t : k) -> E| Pexp_pack of Ppxlib.module_expr(*(module ME).
*)(module ME : S)is represented asPexp_constraint(Pexp_pack ME, Ptyp_package S)| Pexp_open of Ppxlib.open_declaration * Ppxlib.expression(*M.(E)let open M in Elet open! M in E
| Pexp_letop of Ppxlib.letop(*let* P = E0 in E1let* P0 = E00 and* P1 = E01 in E1
| Pexp_extension of Ppxlib.extension(*
*)[%id]| Pexp_unreachable(*
*).| Pexp_stack of Ppxlib.expression| Pexp_comprehension of Ppxlib.comprehension_expression(*[? BODY ...CLAUSES... ?], where:?is either""(list),:(immutable array), or|(array).BODYis an expression.CLAUSESis a series ofcomprehension_clause.
| Pexp_overwrite of Ppxlib.expression * Ppxlib.expression| Pexp_quote of Ppxlib.expression(*runtime metaprogramming quotations <
*)E>| Pexp_splice of Ppxlib.expression(*runtime metaprogramming splicing $(E)
*)| Pexp_hole
and case = Astlib.Ast_500.Parsetree.case = {pc_lhs : Ppxlib.pattern;pc_guard : Ppxlib.expression option;pc_rhs : Ppxlib.expression;
}Values of type case represents (P -> E) or (P when E0 -> E)
and letop = Astlib.Ast_500.Parsetree.letop = {let_ : Ppxlib.binding_op;ands : Ppxlib.binding_op list;body : Ppxlib.expression;
}and binding_op = Astlib.Ast_500.Parsetree.binding_op = {pbop_op : string Ppxlib.loc;pbop_pat : Ppxlib.pattern;pbop_exp : Ppxlib.expression;pbop_loc : Ppxlib.location;
}and function_param_desc = Astlib.Ast_500.Parsetree.function_param_desc = | Pparam_val of Ppxlib.arg_label * Ppxlib.expression option * Ppxlib.pattern(*Pparam_val (lbl, exp0, P)represents the parameter:PwhenlblisNolabelandexp0isNone~l:PwhenlblisLabelled landexp0isNone?l:PwhenlblisOptional landexp0isNone?l:(P = E0)whenlblisOptional landexp0isSome E0
Note: If
*)E0is provided, onlyOptionalis allowed.| Pparam_newtype of string Ppxlib.loc * Ppxlib.jkind_annotation option(*Pparam_newtype xrepresents the parameter(type x).xcarries the location of the identifier, whereas thepparam_locon the enclosingfunction_paramnode is the location of the(type x)as a whole.Multiple parameters
(type a b c)are represented as multiplePparam_newtypenodes, let's say:[ { pparam_kind = Pparam_newtype a; pparam_loc = loc1 }; { pparam_kind = Pparam_newtype b; pparam_loc = loc2 }; { pparam_kind = Pparam_newtype c; pparam_loc = loc3 }; ]Here, the first loc
*)loc1is the location of(type a b c), and the subsequent locsloc2andloc3are the same asloc1, except marked as ghost locations. The locations ona,b,c, correspond to the variablesa,b, andcin the source code.
and function_param = Astlib.Ast_500.Parsetree.function_param = {pparam_loc : Ppxlib.location;pparam_desc : Ppxlib.function_param_desc;
}and function_body = Astlib.Ast_500.Parsetree.function_body = | Pfunction_body of Ppxlib.expression| Pfunction_cases of Ppxlib.case list * Ppxlib.location * Ppxlib.attributes(*In
*)Pfunction_cases (_, loc, attrs), the location extends from the start of thefunctionkeyword to the end of the last case. The compiler will only use typechecking-related attributes fromattrs, e.g. enabling or disabling a warning.
See the comment on Pexp_function.
and type_constraint = Astlib.Ast_500.Parsetree.type_constraint = | Pconstraint of Ppxlib.core_type| Pcoerce of Ppxlib.core_type option * Ppxlib.core_type
and function_constraint = Astlib.Ast_500.Parsetree.function_constraint = {mode_annotations : Ppxlib.modes;(*The mode annotation placed on a function let-binding, e.g.
*)let local_ f x : int -> int = .... Thelocal_syntax is parsed into two nodes: the field here, andpvb_modes. This field only affects the interpretation ofret_type_constraint, while the latter is translated intypecoretoPexp_constraintto contrain the mode of the function.ret_mode_annotations : Ppxlib.modes;(*The mode annotation placed on a function's body, e.g.
*)let f x : int -> int @@ local = .... This field constrains the mode of function's body.ret_type_constraint : Ppxlib.type_constraint option;(*The type constraint placed on a function's body.
*)
}See the comment on Pexp_function.
and block_access = Astlib.Ast_500.Parsetree.block_access = | Baccess_field of Ppxlib.longident_loc(*
*).foo| Baccess_array of Ppxlib.mutable_flag * Ppxlib.index_kind * Ppxlib.expression(*Mutable array accesses:
.(E),.L(E),.l(E),.n(E)Immutable array accesses:.:(E),.:L(E),.:l(E),.:n(E)Indexed by
*)int,int64#,int32#, ornativeint#, respectively.| Baccess_block of Ppxlib.mutable_flag * Ppxlib.expression(*Access using another block index:
*).idx_imm(E),.idx_mut(E)(usually followed by unboxed accesses, to deepen the index).
and unboxed_access = Astlib.Ast_500.Parsetree.unboxed_access = | Uaccess_unboxed_field of Ppxlib.longident_loc(*
*).#foo
and comprehension_iterator = Astlib.Ast_500.Parsetree.comprehension_iterator = | Pcomp_range of {start : Ppxlib.expression;stop : Ppxlib.expression;direction : Ppxlib.direction_flag;
}(*"= START to STOP" (direction = Upto) "= START downto STOP" (direction = Downto)
*)| Pcomp_in of Ppxlib.expression(*"in EXPR"
*)
and comprehension_clause_binding =
Astlib.Ast_500.Parsetree.comprehension_clause_binding =
{pcomp_cb_pattern : Ppxlib.pattern;pcomp_cb_iterator : Ppxlib.comprehension_iterator;pcomp_cb_attributes : Ppxlib.attributes;
}@... PAT (in/=) ...
and comprehension_clause = Astlib.Ast_500.Parsetree.comprehension_clause = | Pcomp_for of Ppxlib.comprehension_clause_binding list(*"for PAT (in/=) ... and PAT (in/=) ... and ..."; must be nonempty
*)| Pcomp_when of Ppxlib.expression(*"when EXPR"
*)
and comprehension = Astlib.Ast_500.Parsetree.comprehension = {pcomp_body : Ppxlib.expression;(*The body/generator of the comprehension
*)pcomp_clauses : Ppxlib.comprehension_clause list;(*The clauses of the comprehension; must be nonempty
*)
}and comprehension_expression =
Astlib.Ast_500.Parsetree.comprehension_expression =
| Pcomp_list_comprehension of Ppxlib.comprehension(*
*)[BODY ...CLAUSES...]| Pcomp_array_comprehension of Ppxlib.mutable_flag * Ppxlib.comprehension(*
*)[|BODY ...CLAUSES...|](flag = Mutable)[:BODY ...CLAUSES...:](flag = Immutable) (only allowed with-extension immutable_arrays)
Value descriptions
and value_description = Astlib.Ast_500.Parsetree.value_description = {pval_name : string Ppxlib.loc;pval_type : Ppxlib.core_type;pval_modalities : Ppxlib.modalities;pval_prim : string list;pval_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]pval_loc : Ppxlib.location;
}Values of type value_description represents:
Type declarations
and type_declaration = Astlib.Ast_500.Parsetree.type_declaration = {ptype_name : string Ppxlib.loc;ptype_params : (Ppxlib.core_type * (Ppxlib.variance * Ppxlib.injectivity)) list;(*
*)('a1,...'an) tptype_cstrs : (Ppxlib.core_type * Ppxlib.core_type * Ppxlib.location) list;(*
*)... constraint T1=T1' ... constraint Tn=Tn'ptype_kind : Ppxlib.type_kind;ptype_private : Ppxlib.private_flag;(*for
*)= private ...ptype_manifest : Ppxlib.core_type option;(*represents
*)= Tptype_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]ptype_jkind_annotation : Ppxlib.jkind_annotation option;(*for
*): jkindptype_loc : Ppxlib.location;
}Here are type declarations and their representation, for various ptype_kind and ptype_manifest values:
type twhentype_kindisPtype_abstract, andmanifestisNone,type t = T0whentype_kindisPtype_abstract, andmanifestisSome T0,type t = C of T | ...whentype_kindisPtype_variant, andmanifestisNone,type t = T0 = C of T | ...whentype_kindisPtype_variant, andmanifestisSome T0,type t = {l: T; ...}whentype_kindisPtype_record, andmanifestisNone,type t = T0 = {l : T; ...}whentype_kindisPtype_record, andmanifestisSome T0,type t = ..whentype_kindisPtype_open, andmanifestisNone.
and type_kind = Astlib.Ast_500.Parsetree.type_kind = | Ptype_abstract| Ptype_variant of Ppxlib.constructor_declaration list| Ptype_record of Ppxlib.label_declaration list(*Invariant: non-empty list
*)| Ptype_record_unboxed_product of Ppxlib.label_declaration list(*Invariant: non-empty list
*)| Ptype_open
and label_declaration = Astlib.Ast_500.Parsetree.label_declaration = {pld_name : string Ppxlib.loc;pld_mutable : Ppxlib.mutable_flag;pld_modalities : Ppxlib.modalities;pld_type : Ppxlib.core_type;pld_loc : Ppxlib.location;pld_attributes : Ppxlib.attributes;(*
*)l : T [@id1] [@id2]
}{ ...; l: T; ... }whenpld_mutableisImmutable,{ ...; mutable l: T; ... }whenpld_mutableisMutable.
Note: T can be a Ptyp_poly.
and constructor_declaration = Astlib.Ast_500.Parsetree.constructor_declaration =
{pcd_name : string Ppxlib.loc;pcd_vars : (string Ppxlib.loc * Ppxlib.jkind_annotation option) list;(*jkind annotations are
*)C : ('a : kind1) ('a2 : kind2). ...pcd_args : Ppxlib.constructor_arguments;pcd_res : Ppxlib.core_type option;pcd_loc : Ppxlib.location;pcd_attributes : Ppxlib.attributes;(*
*)C of ... [@id1] [@id2]
}and constructor_argument = Astlib.Ast_500.Parsetree.constructor_argument = {pca_modalities : Ppxlib.modalities;pca_type : Ppxlib.core_type;pca_loc : Ppxlib.location;
}and constructor_arguments = Astlib.Ast_500.Parsetree.constructor_arguments = | Pcstr_tuple of Ppxlib.constructor_argument list| Pcstr_record of Ppxlib.label_declaration list(*Values of type
constructor_declarationrepresents the constructor arguments of:C of T1 * ... * Tnwhenres = None, andargs = Pcstr_tuple [T1; ... ; Tn],C: T0whenres = Some T0, andargs = Pcstr_tuple [],C: T1 * ... * Tn -> T0whenres = Some T0, andargs = Pcstr_tuple [T1; ... ; Tn],C of {...}whenres = None, andargs = Pcstr_record [...],C: {...} -> T0whenres = Some T0, andargs = Pcstr_record [...].
and type_extension = Astlib.Ast_500.Parsetree.type_extension = {ptyext_path : Ppxlib.longident_loc;ptyext_params : (Ppxlib.core_type * (Ppxlib.variance * Ppxlib.injectivity)) list;ptyext_constructors : Ppxlib.extension_constructor list;ptyext_private : Ppxlib.private_flag;ptyext_loc : Ppxlib.location;ptyext_attributes : Ppxlib.attributes;(*...
*)@@id1@@id2
}Definition of new extensions constructors for the extensive sum type t (type t += ...).
and extension_constructor = Astlib.Ast_500.Parsetree.extension_constructor = {pext_name : string Ppxlib.loc;pext_kind : Ppxlib.extension_constructor_kind;pext_loc : Ppxlib.location;pext_attributes : Ppxlib.attributes;(*
*)C of ... [@id1] [@id2]
}and type_exception = Astlib.Ast_500.Parsetree.type_exception = {ptyexn_constructor : Ppxlib.extension_constructor;ptyexn_loc : Ppxlib.location;ptyexn_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]
}Definition of a new exception (exception E).
and extension_constructor_kind =
Astlib.Ast_500.Parsetree.extension_constructor_kind =
| Pext_decl of (string Ppxlib.loc * Ppxlib.jkind_annotation option) list * Ppxlib.constructor_arguments * Ppxlib.core_type option(*Pext_decl(existentials, c_args, t_opt)describes a new extension constructor. It can be:C of T1 * ... * Tnwhen:existentialsis[],c_argsis[T1; ...; Tn],t_optisNone.
C: T0whenexistentialsis[],c_argsis[],t_optisSome T0.
C: T1 * ... * Tn -> T0whenexistentialsis[],c_argsis[T1; ...; Tn],t_optisSome T0.
C: ('a : k)... . T1 * ... * Tn -> T0whenexistentialsis['a;...],c_argsis[T1; ... ; Tn],t_optisSome T0.
| Pext_rebind of Ppxlib.longident_loc(*
*)Pext_rebind(D)re-export the constructorDwith the new nameC
Class language
Type expressions for the class language
and class_type = Astlib.Ast_500.Parsetree.class_type = {pcty_desc : Ppxlib.class_type_desc;pcty_loc : Ppxlib.location;pcty_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and class_type_desc = Astlib.Ast_500.Parsetree.class_type_desc = | Pcty_constr of Ppxlib.longident_loc * Ppxlib.core_type list(*c['a1, ..., 'an] c
| Pcty_signature of Ppxlib.class_signature(*
*)object ... end| Pcty_arrow of Ppxlib.arg_label * Ppxlib.core_type * Ppxlib.class_type(*Pcty_arrow(lbl, T, CT)represents:T -> CTwhenlblisNolabel,~l:T -> CTwhenlblisLabelled l,?l:T -> CTwhenlblisOptional l.
| Pcty_extension of Ppxlib.extension(*
*)%id| Pcty_open of Ppxlib.open_description * Ppxlib.class_type(*
*)let open M in CT
and class_signature = Astlib.Ast_500.Parsetree.class_signature = {pcsig_self : Ppxlib.core_type;pcsig_fields : Ppxlib.class_type_field list;
}Values of type class_signature represents:
object('selfpat) ... endobject ... endwhenpcsig_selfisPtyp_any
and class_type_field = Astlib.Ast_500.Parsetree.class_type_field = {pctf_desc : Ppxlib.class_type_field_desc;pctf_loc : Ppxlib.location;pctf_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]
}and class_type_field_desc = Astlib.Ast_500.Parsetree.class_type_field_desc = | Pctf_inherit of Ppxlib.class_type(*
*)inherit CT| Pctf_val of Ppxlib.label Ppxlib.loc * Ppxlib.mutable_flag * Ppxlib.virtual_flag * Ppxlib.core_type(*
*)val x: T| Pctf_method of Ppxlib.label Ppxlib.loc * Ppxlib.private_flag * Ppxlib.virtual_flag * Ppxlib.core_type| Pctf_constraint of Ppxlib.core_type * Ppxlib.core_type(*
*)constraint T1 = T2| Pctf_attribute of Ppxlib.attribute(*
*)[@@@id]| Pctf_extension of Ppxlib.extension(*
*)[%%id]
and 'a class_infos = 'a Astlib.Ast_500.Parsetree.class_infos = {pci_virt : Ppxlib.virtual_flag;pci_params : (Ppxlib.core_type * (Ppxlib.variance * Ppxlib.injectivity)) list;pci_name : string Ppxlib.loc;pci_expr : 'a;pci_loc : Ppxlib.location;pci_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]
}Values of type class_expr class_infos represents:
class c = ...class ['a1,...,'an] c = ...class virtual c = ...
They are also used for "class type" declaration.
and class_description = Ppxlib.class_type Ppxlib.class_infosand class_type_declaration = Ppxlib.class_type Ppxlib.class_infosValue expressions for the class language
and class_expr = Astlib.Ast_500.Parsetree.class_expr = {pcl_desc : Ppxlib.class_expr_desc;pcl_loc : Ppxlib.location;pcl_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and class_expr_desc = Astlib.Ast_500.Parsetree.class_expr_desc = | Pcl_constr of Ppxlib.longident_loc * Ppxlib.core_type list(*
*)cand['a1, ..., 'an] c| Pcl_structure of Ppxlib.class_structure(*
*)object ... end| Pcl_fun of Ppxlib.arg_label * Ppxlib.expression option * Ppxlib.pattern * Ppxlib.class_expr(*Pcl_fun(lbl, exp0, P, CE)represents:fun P -> CEwhenlblisNolabelandexp0isNone,fun ~l:P -> CEwhenlblisLabelled landexp0isNone,fun ?l:P -> CEwhenlblisOptional landexp0isNone,fun ?l:(P = E0) -> CEwhenlblisOptional landexp0isSome E0.
| Pcl_apply of Ppxlib.class_expr * (Ppxlib.arg_label * Ppxlib.expression) list(*Pcl_apply(CE, [(l1,E1) ; ... ; (ln,En)])representsCE ~l1:E1 ... ~ln:En.lican be empty (non labeled argument) or start with?(optional argument).Invariant:
*)n > 0| Pcl_let of Ppxlib.rec_flag * Ppxlib.value_binding list * Ppxlib.class_expr(*Pcl_let(rec, [(P1, E1); ... ; (Pn, En)], CE)represents:let P1 = E1 and ... and Pn = EN in CEwhenrecisNonrecursive,let rec P1 = E1 and ... and Pn = EN in CEwhenrecisRecursive.
| Pcl_constraint of Ppxlib.class_expr * Ppxlib.class_type(*
*)(CE : CT)| Pcl_extension of Ppxlib.extension(*
*)[%id]| Pcl_open of Ppxlib.open_description * Ppxlib.class_expr(*
*)let open M in CE
and class_structure = Astlib.Ast_500.Parsetree.class_structure = {pcstr_self : Ppxlib.pattern;pcstr_fields : Ppxlib.class_field list;
}Values of type class_structure represents:
object(selfpat) ... endobject ... endwhenpcstr_selfisPpat_any
and class_field = Astlib.Ast_500.Parsetree.class_field = {pcf_desc : Ppxlib.class_field_desc;pcf_loc : Ppxlib.location;pcf_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]
}and class_field_desc = Astlib.Ast_500.Parsetree.class_field_desc = | Pcf_inherit of Ppxlib.override_flag * Ppxlib.class_expr * string Ppxlib.loc option| Pcf_val of Ppxlib.label Ppxlib.loc * Ppxlib.mutable_flag * Ppxlib.class_field_kind(*Pcf_val(x,flag, kind)represents:val x = EwhenflagisImmutableandkindisCfk_concrete(Fresh, E)val virtual x: TwhenflagisImmutableandkindisCfk_virtual(T)val mutable x = EwhenflagisMutableandkindisCfk_concrete(Fresh, E)val mutable virtual x: TwhenflagisMutableandkindisCfk_virtual(T)
| Pcf_method of Ppxlib.label Ppxlib.loc * Ppxlib.private_flag * Ppxlib.class_field_kind| Pcf_constraint of Ppxlib.core_type * Ppxlib.core_type(*
*)constraint T1 = T2| Pcf_initializer of Ppxlib.expression(*
*)initializer E| Pcf_attribute of Ppxlib.attribute(*
*)[@@@id]| Pcf_extension of Ppxlib.extension(*
*)[%%id]
and class_field_kind = Astlib.Ast_500.Parsetree.class_field_kind = | Cfk_virtual of Ppxlib.core_type| Cfk_concrete of Ppxlib.override_flag * Ppxlib.expression
and class_declaration = Ppxlib.class_expr Ppxlib.class_infosModule language
Type expressions for the module language
and module_type = Astlib.Ast_500.Parsetree.module_type = {pmty_desc : Ppxlib.module_type_desc;pmty_loc : Ppxlib.location;pmty_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and module_type_desc = Astlib.Ast_500.Parsetree.module_type_desc = | Pmty_ident of Ppxlib.longident_loc(*
*)Pmty_ident(S)representsS| Pmty_signature of Ppxlib.signature(*
*)sig ... end| Pmty_functor of Ppxlib.functor_parameter * Ppxlib.module_type * Ppxlib.modes(*
*)functor(X : MT1) -> MT2| Pmty_with of Ppxlib.module_type * Ppxlib.with_constraint list(*
*)MT with ...| Pmty_typeof of Ppxlib.module_expr(*
*)module type of ME| Pmty_extension of Ppxlib.extension(*
*)[%id]| Pmty_alias of Ppxlib.longident_loc(*
*)(module M)| Pmty_strengthen of Ppxlib.module_type * Ppxlib.longident_loc(*
*)MT with S
and functor_parameter = Astlib.Ast_500.Parsetree.functor_parameter = | Unit(*
*)()| Named of string option Ppxlib.loc * Ppxlib.module_type * Ppxlib.modes(*Named(name, MT)represents:(X : MT)whennameisSome X,(_ : MT)whennameisNone
and signature = Astlib.Ast_500.Parsetree.signature = {psg_modalities : Ppxlib.modalities;psg_items : Ppxlib.signature_items;psg_loc : Ppxlib.location;
}and signature_items = Ppxlib.signature_item listand signature_item = Astlib.Ast_500.Parsetree.signature_item = {psig_desc : Ppxlib.signature_item_desc;psig_loc : Ppxlib.location;
}and signature_item_desc = Astlib.Ast_500.Parsetree.signature_item_desc = | Psig_value of Ppxlib.value_description(*val x: Texternal x: T = "s1" ... "sn"
| Psig_type of Ppxlib.rec_flag * Ppxlib.type_declaration list(*
*)type t1 = ... and ... and tn = ...| Psig_typesubst of Ppxlib.type_declaration list(*
*)type t1 := ... and ... and tn := ...| Psig_typext of Ppxlib.type_extension(*
*)type t1 += ...| Psig_exception of Ppxlib.type_exception(*
*)exception C of T| Psig_module of Ppxlib.module_declaration(*
*)module X = Mandmodule X : MT| Psig_modsubst of Ppxlib.module_substitution(*
*)module X := M| Psig_recmodule of Ppxlib.module_declaration list(*
*)module rec X1 : MT1 and ... and Xn : MTn| Psig_modtype of Ppxlib.module_type_declaration(*
*)module type S = MTandmodule type S| Psig_modtypesubst of Ppxlib.module_type_declaration(*
*)module type S := ...| Psig_open of Ppxlib.open_description(*
*)open X| Psig_include of Ppxlib.include_description * Ppxlib.modalities(*
*)include MT| Psig_class of Ppxlib.class_description list(*
*)class c1 : ... and ... and cn : ...| Psig_class_type of Ppxlib.class_type_declaration list(*
*)class type ct1 = ... and ... and ctn = ...| Psig_attribute of Ppxlib.attribute(*
*)[@@@id]| Psig_extension of Ppxlib.extension * Ppxlib.attributes(*
*)[%%id]| Psig_kind_abbrev of string Ppxlib.loc * Ppxlib.jkind_annotation(*
*)kind_abbrev_ name = k
and module_declaration = Astlib.Ast_500.Parsetree.module_declaration = {pmd_name : string option Ppxlib.loc;pmd_type : Ppxlib.module_type;pmd_modalities : Ppxlib.modalities;pmd_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]pmd_loc : Ppxlib.location;
}Values of type module_declaration represents S : MT
and module_substitution = Astlib.Ast_500.Parsetree.module_substitution = {pms_name : string Ppxlib.loc;pms_manifest : Ppxlib.longident_loc;pms_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]pms_loc : Ppxlib.location;
}Values of type module_substitution represents S := M
and module_type_declaration = Astlib.Ast_500.Parsetree.module_type_declaration =
{pmtd_name : string Ppxlib.loc;pmtd_type : Ppxlib.module_type option;pmtd_attributes : Ppxlib.attributes;(*
*)... [@@id1] [@@id2]pmtd_loc : Ppxlib.location;
}Values of type module_type_declaration represents:
S = MT,Sfor abstract module type declaration, whenpmtd_typeisNone.
and 'a open_infos = 'a Astlib.Ast_500.Parsetree.open_infos = {popen_expr : 'a;popen_override : Ppxlib.override_flag;popen_loc : Ppxlib.location;popen_attributes : Ppxlib.attributes;
}Values of type 'a open_infos represents:
open! Xwhenpopen_overrideisOverride(silences the "used identifier shadowing" warning)open Xwhenpopen_overrideisFresh
and open_description = Ppxlib.longident_loc Ppxlib.open_infosValues of type open_description represents:
open M.Nopen M(N).O
and open_declaration = Ppxlib.module_expr Ppxlib.open_infosValues of type open_declaration represents:
open M.Nopen M(N).Oopen struct ... end
and 'a include_infos = 'a Astlib.Ast_500.Parsetree.include_infos = {pincl_kind : Ppxlib.include_kind;pincl_mod : 'a;pincl_loc : Ppxlib.location;pincl_attributes : Ppxlib.attributes;
}and include_description = Ppxlib.module_type Ppxlib.include_infosValues of type include_description represents include MT
and include_declaration = Ppxlib.module_expr Ppxlib.include_infosValues of type include_declaration represents include ME
and with_constraint = Astlib.Ast_500.Parsetree.with_constraint = | Pwith_type of Ppxlib.longident_loc * Ppxlib.type_declaration(*with type X.t = ...Note: the last component of the longident must match the name of the type_declaration.
*)| Pwith_module of Ppxlib.longident_loc * Ppxlib.longident_loc(*
*)with module X.Y = Z| Pwith_modtype of Ppxlib.longident_loc * Ppxlib.module_type(*
*)with module type X.Y = Z| Pwith_modtypesubst of Ppxlib.longident_loc * Ppxlib.module_type(*
*)with module type X.Y := sig end| Pwith_typesubst of Ppxlib.longident_loc * Ppxlib.type_declaration(*
*)with type X.t := ..., same format as [Pwith_type]| Pwith_modsubst of Ppxlib.longident_loc * Ppxlib.longident_loc(*
*)with module X.Y := Z
Value expressions for the module language
and module_expr = Astlib.Ast_500.Parsetree.module_expr = {pmod_desc : Ppxlib.module_expr_desc;pmod_loc : Ppxlib.location;pmod_attributes : Ppxlib.attributes;(*
*)... [@id1] [@id2]
}and module_expr_desc = Astlib.Ast_500.Parsetree.module_expr_desc = | Pmod_ident of Ppxlib.longident_loc(*
*)X| Pmod_structure of Ppxlib.structure(*
*)struct ... end| Pmod_functor of Ppxlib.functor_parameter * Ppxlib.module_expr(*
*)functor(X : MT1) -> ME| Pmod_apply of Ppxlib.module_expr * Ppxlib.module_expr(*
*)ME1(ME2)| Pmod_constraint of Ppxlib.module_expr * Ppxlib.module_type option * Ppxlib.modes(*
*)(ME : MT)| Pmod_unpack of Ppxlib.expression(*
*)(val E)| Pmod_extension of Ppxlib.extension(*
*)[%id]| Pmod_instance of Ppxlib.module_instance(*
*)Foo(Param1)(Arg1(Param2)(Arg2)) [@jane.non_erasable.instances]
and module_instance = Astlib.Ast_500.Parsetree.module_instance = {pmod_instance_head : string;pmod_instance_args : (string * Ppxlib.module_instance) list;
}M(P1)(MI1)...(Pn)(MIn)
and structure = Ppxlib.structure_item listand structure_item = Astlib.Ast_500.Parsetree.structure_item = {pstr_desc : Ppxlib.structure_item_desc;pstr_loc : Ppxlib.location;
}and structure_item_desc = Astlib.Ast_500.Parsetree.structure_item_desc = | Pstr_eval of Ppxlib.expression * Ppxlib.attributes(*
*)E| Pstr_value of Ppxlib.rec_flag * Ppxlib.value_binding list(*Pstr_value(rec, [(P1, E1 ; ... ; (Pn, En))])represents:let P1 = E1 and ... and Pn = ENwhenrecisNonrecursive,let rec P1 = E1 and ... and Pn = ENwhenrecisRecursive.
| Pstr_primitive of Ppxlib.value_description(*val x: Texternal x: T = "s1" ... "sn"
| Pstr_type of Ppxlib.rec_flag * Ppxlib.type_declaration list(*
*)type t1 = ... and ... and tn = ...| Pstr_typext of Ppxlib.type_extension(*
*)type t1 += ...| Pstr_exception of Ppxlib.type_exception(*exception C of Texception C = M.X
| Pstr_module of Ppxlib.module_binding(*
*)module X = ME| Pstr_recmodule of Ppxlib.module_binding list(*
*)module rec X1 = ME1 and ... and Xn = MEn| Pstr_modtype of Ppxlib.module_type_declaration(*
*)module type S = MT| Pstr_open of Ppxlib.open_declaration(*
*)open X| Pstr_class of Ppxlib.class_declaration list(*
*)class c1 = ... and ... and cn = ...| Pstr_class_type of Ppxlib.class_type_declaration list(*
*)class type ct1 = ... and ... and ctn = ...| Pstr_include of Ppxlib.include_declaration(*
*)include ME| Pstr_attribute of Ppxlib.attribute(*
*)[@@@id]| Pstr_extension of Ppxlib.extension * Ppxlib.attributes(*
*)[%%id]| Pstr_kind_abbrev of string Ppxlib.loc * Ppxlib.jkind_annotation(*
*)kind_abbrev_ name = k
and value_binding = Astlib.Ast_500.Parsetree.value_binding = {pvb_pat : Ppxlib.pattern;pvb_expr : Ppxlib.expression;pvb_modes : Ppxlib.modes;pvb_attributes : Ppxlib.attributes;pvb_loc : Ppxlib.location;
}and module_binding = Astlib.Ast_500.Parsetree.module_binding = {pmb_name : string option Ppxlib.loc;pmb_expr : Ppxlib.module_expr;pmb_attributes : Ppxlib.attributes;pmb_loc : Ppxlib.location;
}Values of type module_binding represents module X = ME
and jkind_annotation_desc = Astlib.Ast_500.Parsetree.jkind_annotation_desc = | Pjk_default| Pjk_abbreviation of string| Pjk_mod of Ppxlib.jkind_annotation * Ppxlib.modes| Pjk_with of Ppxlib.jkind_annotation * Ppxlib.core_type * Ppxlib.modalities| Pjk_kind_of of Ppxlib.core_type| Pjk_product of Ppxlib.jkind_annotation list
and jkind_annotation = Astlib.Ast_500.Parsetree.jkind_annotation = {pjkind_loc : Ppxlib.location;pjkind_desc : Ppxlib.jkind_annotation_desc;
}Toplevel
Toplevel phrases
and toplevel_phrase = Astlib.Ast_500.Parsetree.toplevel_phrase = | Ptop_def of Ppxlib.structure| Ptop_dir of Ppxlib.toplevel_directive(*
*)#use,#load...
and toplevel_directive = Astlib.Ast_500.Parsetree.toplevel_directive = {pdir_name : string Ppxlib.loc;pdir_arg : Ppxlib.directive_argument option;pdir_loc : Ppxlib.location;
}and directive_argument = Astlib.Ast_500.Parsetree.directive_argument = {pdira_desc : Ppxlib.directive_argument_desc;pdira_loc : Ppxlib.location;
}and directive_argument_desc = Astlib.Ast_500.Parsetree.directive_argument_desc =
| Pdir_string of string| Pdir_int of string * char option| Pdir_ident of Ppxlib.longident| Pdir_bool of bool
and cases = Ppxlib.case listclass virtual map : object ... endclass virtual iter : object ... endclass virtual 'acc fold : object ... endclass virtual 'acc fold_map : object ... endclass virtual 'ctx map_with_context : object ... endclass virtual 'res lift : object ... endclass virtual ['ctx, 'res] lift_map_with_context : object ... endMake sure code using Ppxlib doesn't refer to compiler-libs without being explicit about it: