Ocamlformat_parser_extended.ParsetreeSourceAbstract syntax tree produced by parsing
Warning: this module is unstable and part of compiler-libs.
type constant = {pconst_desc : constant_desc;pconst_loc : Ocamlformat_ocaml_common.Location.t;}and constant_desc = | Pconst_integer of string * char optionInteger constants such as 3 3l 3L 3n.
Suffixes [g-z][G-Z] are accepted by the parser. Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
| Pconst_char of char * stringPconst_char (c, s) describes a character c and its literal string representation s.
e.g. the character '\n' is represented by the literal string "\\n".
| Pconst_string of string * Ocamlformat_ocaml_common.Location.t * string optionConstant 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 optionFloat constant such as 3.4, 2e5 or 1.4e-4.
Suffixes g-zG-Z are accepted by the parser. Suffixes are rejected by the typechecker.
type attribute = {attr_name : string Asttypes.loc;attr_payload : payload;attr_loc : Ocamlformat_ocaml_common.Location.t;}Attributes such as [\@id ARG] and [\@\@id ARG].
Metadata containers passed around within the AST. The compiler ignores unknown attributes.
Extension points such as [%id ARG] and [%%id ARG].
Sub-language placeholder -- rejected by the typechecker.
and ext_attrs = {attrs_extension : string Asttypes.loc option;Short extension syntax, eg. module%ext Foo ....
attrs_before : attributes;eg. module Foo [@attr] = ....
attrs_after : attributes;eg. module Foo = struct end [@@attr].
}and core_type = {ptyp_desc : core_type_desc;ptyp_loc : Ocamlformat_ocaml_common.Location.t;ptyp_loc_stack : location_stack;ptyp_attributes : attributes;... [\@id1] [\@id2]
}and arrow_param = {pap_label : Asttypes.arg_label;pap_loc : Ocamlformat_ocaml_common.Location.t;Location also including the codomain.
*)pap_type : core_type;}and core_type_desc = | Ptyp_any_
| Ptyp_var of stringA type variable such as 'a
| Ptyp_arrow of arrow_param list * core_type| Ptyp_tuple of core_type labeled_tuple_element listPtyp_tuple(tl) represents a product type:
T1 * ... * Tn when tl is (None, T1); ...; (None, Tn)L1:T1 * ... * Ln:Tn when tl is (Some L1, T1); ...; (Some Ln, Tn)L1:T1 * T2 when tl is (Some L1, T1); (None, T2)Invariant: n >= 2.
| Ptyp_constr of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* core_type listPtyp_constr(lident, l) represents:
tconstr when l=[],T tconstr when l=[T],(T1, ..., Tn) tconstr when l=[T1 ; ... ; Tn].| Ptyp_object of object_field list * Asttypes.obj_closed_flag| Ptyp_class of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* core_type listPtyp_class(tconstr, l) represents:
#tconstr when l=[],T #tconstr when l=[T],(T1, ..., Tn) #tconstr when l=[T1 ; ... ; Tn].| Ptyp_alias of core_type * string Asttypes.locT as 'a.
| Ptyp_variant of row_field list
* Asttypes.closed_flag
* Asttypes.variant_var list option| Ptyp_poly of string Asttypes.loc list * core_type'a1 ... 'an. T
Can only appear in the following context:
As the core_type of a Ppat_constraint node corresponding to a constraint on a let-binding:
let x : 'a1 ... 'an. T = e ...Cfk_virtual for methods (not values).core_type of a Pctf_method node.core_type of a Pexp_poly node.pld_type field of a label_declaration.core_type of a Ptyp_object node.pval_type field of a value_description.| Ptyp_package of package_type(module S).
| Ptyp_open of Ocamlformat_ocaml_common.Longident.t Asttypes.loc * core_typeM.(T)
| Ptyp_extension of extension[%id].
| Ptyp_functor of Asttypes.arg_label
* string Asttypes.loc
* package_type
* core_type(module M : S) -> ... : module-dependent arrow
and package_type = {ppt_path : Ocamlformat_ocaml_common.Longident.t Asttypes.loc;ppt_constraints : (Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* core_type)
list;ppt_loc : Ocamlformat_ocaml_common.Location.t;ppt_attrs : attributes;}As package_type typed values:
{ppt_path: S; ppt_constraints: []} represents (module S),{ppt_path: S; ppt_constraints: [(t1, T1) ; ... ; (tn, Tn)]} represents (module S with type t1 = T1 and ... and tn = Tn).and row_field = {prf_desc : row_field_desc;prf_loc : Ocamlformat_ocaml_common.Location.t;prf_attributes : attributes;}and row_field_desc = | Rtag of Asttypes.variant_var * bool * core_type listRtag(`A, b, l) represents:
`A when b is true and l is [],`A of T when b is false and l is [T],`A of T1 & .. & Tn when b is false and l is [T1;...Tn],`A of & T1 & .. & Tn when b is true and l is [T1;...Tn].bool field 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 core_type[ | t ]
and object_field = {pof_desc : object_field_desc;pof_loc : Ocamlformat_ocaml_common.Location.t;pof_attributes : attributes;}and object_field_desc = | Otag of Asttypes.label Asttypes.loc * core_type| Oinherit of core_typeand ('elt, 'c) labeled_tuple_element_with_pun = | Lte_pun of string Asttypes.loc| Lte_constrained_pun of {loc : Ocamlformat_ocaml_common.Location.t;label : string Asttypes.loc;type_constraint : 'c;}| Lte_simple of 'elt labeled_tuple_elementand pattern = {ppat_desc : pattern_desc;ppat_loc : Ocamlformat_ocaml_common.Location.t;ppat_loc_stack : location_stack;ppat_attributes : attributes;... [\@id1] [\@id2]
}and pattern_desc = | Ppat_anyThe pattern _.
| Ppat_var of string Asttypes.locA variable pattern such as x
| Ppat_alias of pattern * string Asttypes.locAn alias pattern such as P as 'a
| Ppat_constant of constantPatterns such as 1, 'a', "true", 1.0, 1l, 1L, 1n
| Ppat_interval of constant * constantPatterns such as 'a'..'z'.
Other forms of interval are recognized by the parser but rejected by the type-checker.
*)| Ppat_tuple of (pattern, core_type) labeled_tuple_element_with_pun list
* Asttypes.closed_flagPpat_tuple(pl, Closed) represents
(P1, ..., Pn) when pl is (None, P1); ...; (None, Pn)(~L1:P1, ..., ~Ln:Pn) when pl is (Some L1, P1); ...; (Some Ln, Pn)(~L1:P1, P2) when pl is (Some L1, P1); (None, P2)Ppat_tuple(pl, Open) is similar, but indicates the pattern additionally ends in a ...
Invariant:
n >= 2.n >= 1.| Ppat_construct of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* (string Asttypes.loc list * pattern) optionPpat_construct(C, args) represents:
C when args is None,C P when args is Some ([], P)C (P1, ..., Pn) when args is Some ([], Ppat_tuple [P1; ...; Pn])C (type a b) P when args is Some ([a; b], P)| Ppat_variant of Asttypes.variant_var * pattern optionPpat_variant(`A, pat) represents:
`A when pat is None,`A P when pat is Some P| Ppat_record of (Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* core_type option
* pattern option)
list
* Asttypes.obj_closed_flag| Ppat_array of pattern listPattern [| P1; ...; Pn |]
| Ppat_list of pattern listPattern [ P1; ...; Pn ]
| Ppat_or of pattern listPattern P1 | ... | Pn
| Ppat_constraint of pattern * core_typePattern (P : T)
| Ppat_type of Ocamlformat_ocaml_common.Longident.t Asttypes.locPattern #tconst
| Ppat_lazy of patternPattern lazy P
| Ppat_unpack of string option Asttypes.loc * package_type optionPpat_unpack(s, ptyp) represents:
(module P : S) when s is Some "P" and ptyp is Some "S"(module _ : S) when s is None and ptyp is Some "S"(module P) when s is Some "P" and ptyp is None(module _) when s is None and ptyp is None| Ppat_exception of patternPattern exception P
| Ppat_effect of pattern * pattern| Ppat_extension of extensionPattern [%id]
| Ppat_open of Ocamlformat_ocaml_common.Longident.t Asttypes.loc * patternPattern M.(P)
| Ppat_cons of pattern listPattern P1 :: ... :: Pn
and expression = {pexp_desc : expression_desc;pexp_loc : Ocamlformat_ocaml_common.Location.t;pexp_loc_stack : location_stack;pexp_attributes : attributes;... [\@id1] [\@id2]
}and expression_desc = | Pexp_ident of Ocamlformat_ocaml_common.Longident.t Asttypes.locIdentifiers such as x and M.x
| Pexp_constant of constantExpressions constant such as 1, 'a', "true", 1.0, 1l, 1L, 1n
| Pexp_let of value_bindings * expression * Ocamlformat_ocaml_common.Location.tPexp_let(flag, [(P1,E1) ; ... ; (Pn,En)], E, loc_in) represents:
let P1 = E1 and ... and Pn = EN in E when flag is Nonrecursive,let rec P1 = E1 and ... and Pn = EN in E when flag is Recursive.loc_in is the location of the in keyword.| Pexp_function of expr_function_param list
* type_constraint option
* function_body
* infix_ext_attrsPexp_function ([P1; ...; Pn], C, body) represents any construct involving fun or function, including:
fun P1 ... Pn -> E when body = Pfunction_body Efun P1 ... Pn -> function p1 -> e1 | ... | pm -> em when body = Pfunction_cases [ p1 -> e1; ...; pm -> em ]C represents a type constraint or coercion placed immediately before the arrow, e.g. fun P1 ... Pn : ty -> ... when C = Some (Pconstraint ty).
A function must have parameters: in Pexp_function (params, _, body), if params does not contain a Pparam_val _, body must be Pfunction_cases _.
| Pexp_apply of expression * (Asttypes.arg_label * expression) list| Pexp_match of expression * case list * infix_ext_attrsmatch E0 with P1 -> E1 | ... | Pn -> En
| Pexp_try of expression * case list * infix_ext_attrstry E0 with P1 -> E1 | ... | Pn -> En
| Pexp_tuple of (expression, type_constraint) labeled_tuple_element_with_pun listPexp_tuple(el) represents
(E1, ..., En) when el is (None, E1); ...; (None, En)(~L1:E1, ..., ~Ln:En) when el is (Some L1, E1); ...; (Some Ln, En)(~L1:E1, E2) when el is (Some L1, E1); (None, E2)Invariant: n >= 2
| Pexp_construct_unit_beginend of infix_ext_attrsRepresents begin end
| Pexp_construct of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* expression optionPexp_construct(C, exp) represents:
C when exp is None,C E when exp is Some E,C (E1, ..., En) when exp is Some (Pexp_tuple[E1;...;En])| Pexp_variant of Asttypes.variant_var * expression optionPexp_variant(`A, exp) represents
`A when exp is None`A E when exp is Some E| Pexp_record of (Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* type_constraint option
* expression option)
list
* expression optionPexp_record([(l1,P1) ; ... ; (ln,Pn)], exp0) represents
{ l1=P1; ...; ln=Pn } when exp0 is None{ E0 with l1=P1; ...; ln=Pn } when exp0 is Some E0Invariant: n > 0
| Pexp_field of expression * Ocamlformat_ocaml_common.Longident.t Asttypes.locE.l
| Pexp_setfield of expression
* Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* expressionE1.l <- E2
| Pexp_array of expression list[| E1; ...; En |]
| Pexp_list of expression list[ E1; ...; En ]
| Pexp_ifthenelse of if_branch list
* (expression * Ocamlformat_ocaml_common.Location.t) optionPexp_ifthenelse (if_branches, Some (else_expr, else_keyword_loc)
| Pexp_sequence of expression * expression * string Asttypes.loc optionE1; E2
| Pexp_while of expression * expression * infix_ext_attrswhile E1 do E2 done
| Pexp_for of pattern
* expression
* expression
* Asttypes.direction_flag
* expression
* infix_ext_attrs| Pexp_constraint of expression * core_type(E : T)
| Pexp_coerce of expression * core_type option * core_typePexp_coerce(E, from, T) represents
(E :> T) when from is None,(E : T0 :> T) when from is Some T0.| Pexp_send of expression * Asttypes.label Asttypes.locE # m
| Pexp_new of Ocamlformat_ocaml_common.Longident.t Asttypes.loc * infix_ext_attrsnew M.c
| Pexp_setinstvar of Asttypes.label Asttypes.loc * expressionx <- 2
| Pexp_override of (Asttypes.label Asttypes.loc * expression) list{< x1 = E1; ...; xn = En >}
| Pexp_struct_item of structure_item * expression * infix_ext_attrslet SI in E
| Pexp_assert of expression * infix_ext_attrsassert E.
Note: assert false is treated in a special way by the type-checker.
| Pexp_lazy of expression * infix_ext_attrslazy E
| Pexp_object of class_structure * infix_ext_attrsobject ... end
| Pexp_pack of module_expr * package_type option * infix_ext_attrs(module M) is represented as Pexp_pack(M, None)(module M : S) is represented as Pexp_pack(M, Some S)| Pexp_open of Ocamlformat_ocaml_common.Longident.t Asttypes.loc * expressionM.(E)
| Pexp_letop of letoplet* P = E0 in E1let* P0 = E00 and* P1 = E01 in E1| Pexp_extension of extension[%id]
| Pexp_unreachable.
| Pexp_hole_
| Pexp_beginend of expression * infix_ext_attrsbegin E end
| Pexp_parens of expression(E)
| Pexp_cons of expression listE1 :: ... :: En
| Pexp_indexop_access of indexop_access| Pexp_prefix of string Asttypes.loc * expressionop E
| Pexp_infix of string Asttypes.loc * expression * expressionE1 op E2
and indexop_access = {pia_lhs : expression;pia_kind : indexop_access_kind;pia_paren : Asttypes.paren_kind;pia_rhs : expression option;}and indexop_access_kind = | Builtin of expressionarr.(i) arr.(i) <- e str.[i] str.[i] <- c bar.{i1; i2; ..} bar.{i1; i2; ..} <- e
| Dotop of Ocamlformat_ocaml_common.Longident.t Asttypes.loc option
* string
* expression listfoo.Path.%{i1, i2, ..} <- e
and if_branch = {if_cond : expression;if_body : expression;if_attrs : infix_ext_attrs;... [\@id1] [\@id2]
if_loc_then : Ocamlformat_ocaml_common.Location.t;Location of the then keyword, for comment attachment.
}Values of type case represents (P -> E) or (P when E0 -> E)
and letop = {let_ : binding_op;ands : binding_op list;body : expression;loc_in : Ocamlformat_ocaml_common.Location.t;}and binding_op = {pbop_op : string Asttypes.loc;pbop_pat : pattern;pbop_args : expr_function_param list;pbop_typ : value_constraint option;pbop_exp : expression;pbop_is_pun : bool;pbop_loc : Ocamlformat_ocaml_common.Location.t;}and function_param_desc = | Pparam_val of pparam_valPparam_val (lbl, exp0, P) represents the parameter:
P when lbl is Nolabel and exp0 is None~l:P when lbl is Labelled l and exp0 is None?l:P when lbl is Optional l and exp0 is None?l:(P = E0) when lbl is Optional l and exp0 is Some E0Note: If E0 is provided, only Optional is allowed.
| Pparam_newtype of string Asttypes.loc listPparam_newtype x represents the parameter (type x). x carries the location of the identifier, whereas the pparam_loc on the enclosing function_param node is the location of the (type x) as a whole.
Multiple parameters (type a b c) are represented as multiple Pparam_newtype nodes, 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 loc1 is the location of (type a b c), and the subsequent locs loc2 and loc3 are the same as loc1, except marked as ghost locations. The locations on a, b, c, correspond to the variables a, b, and c in the source code.
and function_body = | Pfunction_body of expression| Pfunction_cases of case list
* Ocamlformat_ocaml_common.Location.t
* infix_ext_attrsIn Pfunction_cases (_, loc, attrs), the location extends from the start of the function keyword to the end of the last case. The compiler will only use typechecking-related attributes from attrs, e.g. enabling or disabling a warning.
See the comment on Pexp_function.
and value_description = {pval_name : string Asttypes.loc;pval_type : core_type;pval_prim : string Asttypes.loc list;pval_attributes : ext_attrs;... [\@\@id1] [\@\@id2]
pval_loc : Ocamlformat_ocaml_common.Location.t;}Values of type value_description represents:
and type_declaration = {ptype_name : string Asttypes.loc;ptype_params : (core_type * Asttypes.variance_and_injectivity) list;('a1,...'an) t
ptype_constraints : (core_type
* core_type
* Ocamlformat_ocaml_common.Location.t)
list;... constraint T1=T1' ... constraint Tn=Tn'
ptype_kind : type_kind;ptype_private : Asttypes.private_flag;for = private ...
ptype_manifest : core_type option;represents = T
ptype_attributes : ext_attrs;... [\@\@id1] [\@\@id2]
ptype_loc : Ocamlformat_ocaml_common.Location.t;}Here are type declarations and their representation, for various ptype_kind and ptype_manifest values:
type t when type_kind is Ptype_abstract, and manifest is None,type t = T0 when type_kind is Ptype_abstract, and manifest is Some T0,type t = C of T | ... when type_kind is Ptype_variant, and manifest is None,type t = T0 = C of T | ... when type_kind is Ptype_variant, and manifest is Some T0,type t = {l: T; ...} when type_kind is Ptype_record, and manifest is None,type t = T0 = {l : T; ...} when type_kind is Ptype_record, and manifest is Some T0,type t = .. when type_kind is Ptype_open, and manifest is None.type t = external "gmp" when type_kind is Ptype_external("gmp") and manifest is None.and type_kind = | Ptype_abstract| Ptype_variant of constructor_declaration list| Ptype_record of label_declaration listInvariant: non-empty list
*)| Ptype_open| Ptype_external of stringand label_declaration = {pld_name : string Asttypes.loc;pld_mutable : Asttypes.mutable_flag;pld_type : core_type;pld_loc : Ocamlformat_ocaml_common.Location.t;pld_attributes : attributes;l : T [\@id1] [\@id2]
}{ ...; l: T; ... } when pld_mutable is Immutable,{ ...; mutable l: T; ... } when pld_mutable is Mutable.Note: T can be a Ptyp_poly.
and constructor_declaration = {pcd_name : string Asttypes.loc;pcd_vars : string Asttypes.loc list;pcd_args : constructor_arguments;pcd_res : core_type option;pcd_loc : Ocamlformat_ocaml_common.Location.t;pcd_attributes : attributes;C of ... [\@id1] [\@id2]
}and constructor_arguments = | Pcstr_tuple of core_type list| Pcstr_record of Ocamlformat_ocaml_common.Location.t * label_declaration listValues of type constructor_declaration represents the constructor arguments of:
C of T1 * ... * Tn when res = None, and args = Pcstr_tuple [T1; ... ; Tn],C: T0 when res = Some T0, and args = Pcstr_tuple [],C: T1 * ... * Tn -> T0 when res = Some T0, and args = Pcstr_tuple [T1; ... ; Tn],C of {...} when res = None, and args = Pcstr_record [...],C: {...} -> T0 when res = Some T0, and args = Pcstr_record [...].and type_extension = {ptyext_path : Ocamlformat_ocaml_common.Longident.t Asttypes.loc;ptyext_params : (core_type * Asttypes.variance_and_injectivity) list;ptyext_constructors : extension_constructor list;ptyext_private : Asttypes.private_flag;ptyext_loc : Ocamlformat_ocaml_common.Location.t;ptyext_attributes : ext_attrs;... \@\@id1 \@\@id2
}Definition of new extensions constructors for the extensive sum type t (type t += ...).
and extension_constructor = {pext_name : string Asttypes.loc;pext_kind : extension_constructor_kind;pext_loc : Ocamlformat_ocaml_common.Location.t;pext_attributes : attributes;C of ... [\@id1] [\@id2]
}and type_exception = {ptyexn_constructor : extension_constructor;ptyexn_loc : Ocamlformat_ocaml_common.Location.t;ptyexn_attributes : ext_attrs;... [\@\@id1] [\@\@id2]
}Definition of a new exception (exception E).
and extension_constructor_kind = | Pext_decl of string Asttypes.loc list
* constructor_arguments
* core_type optionPext_decl(existentials, c_args, t_opt) describes a new extension constructor. It can be:
C of T1 * ... * Tn when:
existentials is [],c_args is [T1; ...; Tn],t_opt is NoneC: T0 when
existentials is [],c_args is [],t_opt is Some T0.C: T1 * ... * Tn -> T0 when
existentials is [],c_args is [T1; ...; Tn],t_opt is Some T0.C: 'a... . T1 * ... * Tn -> T0 when
existentials is ['a;...],c_args is [T1; ... ; Tn],t_opt is Some T0.| Pext_rebind of Ocamlformat_ocaml_common.Longident.t Asttypes.locPext_rebind(D) re-export the constructor D with the new name C
and class_type = {pcty_desc : class_type_desc;pcty_loc : Ocamlformat_ocaml_common.Location.t;pcty_attributes : attributes;... [\@id1] [\@id2]
}and class_type_desc = | Pcty_constr of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* core_type listc['a1, ..., 'an] c| Pcty_signature of class_signatureobject ... end
| Pcty_arrow of arrow_param list * class_typePcty_arrow(lbl, T, CT) represents:
T -> CT when lbl is Nolabel,~l:T -> CT when lbl is Labelled l,?l:T -> CT when lbl is Optional l.| Pcty_extension of extension%id
| Pcty_open of open_description * class_typelet open M in CT
Values of type class_signature represents:
object('selfpat) ... endobject ... end when pcsig_self is Noneand class_type_field = {pctf_desc : class_type_field_desc;pctf_loc : Ocamlformat_ocaml_common.Location.t;pctf_attributes : attributes;... [\@\@id1] [\@\@id2]
}and class_type_field_desc = | Pctf_inherit of class_typeinherit CT
| Pctf_val of Asttypes.label Asttypes.loc * Asttypes.mutable_virtual * core_typeval x: T
| Pctf_method of Asttypes.label Asttypes.loc
* Asttypes.private_virtual
* core_typemethod x: T
| Pctf_constraint of core_type * core_typeconstraint T1 = T2
| Pctf_attribute of attribute[\@\@\@id]
| Pctf_extension of extension[%%id]
and 'a class_infos = {pci_virt : Asttypes.virtual_flag;pci_params : (core_type * Asttypes.variance_and_injectivity) list;pci_name : string Asttypes.loc;pci_args : class_function_param list;pci_constraint : class_type option;pci_expr : 'a;pci_loc : Ocamlformat_ocaml_common.Location.t;pci_attributes : ext_attrs;... [\@\@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_expr = {pcl_desc : class_expr_desc;pcl_loc : Ocamlformat_ocaml_common.Location.t;pcl_attributes : attributes;... [\@id1] [\@id2]
}and class_expr_desc = | Pcl_constr of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* core_type listc and ['a1, ..., 'an] c
| Pcl_structure of class_structureobject ... end
| Pcl_fun of class_function_param list * class_exprPcl_fun(P, CE) represents:
fun P -> CEfun ~l:P -> CEfun ?l:P -> CEfun ?l:(P = E0) -> CE| Pcl_apply of class_expr * (Asttypes.arg_label * expression) listPcl_apply(CE, [(l1,E1) ; ... ; (ln,En)]) represents CE ~l1:E1 ... ~ln:En. li can be empty (non labeled argument) or start with ? (optional argument).
Invariant: n > 0
| Pcl_let of value_bindings * class_expr * Ocamlformat_ocaml_common.Location.tPcl_let(rec, [(P1, E1); ... ; (Pn, En)], CE, loc_in) represents:
let P1 = E1 and ... and Pn = EN in CE when rec is Nonrecursive,let rec P1 = E1 and ... and Pn = EN in CE when rec is Recursive.loc_in is the location of the in keyword.| Pcl_constraint of class_expr * class_type(CE : CT)
| Pcl_extension of extension[%id]
| Pcl_open of open_description * class_exprlet open M in CE
Values of type class_structure represents:
object(selfpat) ... endobject ... end when pcstr_self is Noneand class_field = {pcf_desc : class_field_desc;pcf_loc : Ocamlformat_ocaml_common.Location.t;pcf_attributes : attributes;... [\@\@id1] [\@\@id2]
}and class_field_desc = | Pcf_inherit of Asttypes.override_flag * class_expr * string Asttypes.loc option| Pcf_val of Asttypes.label Asttypes.loc
* Asttypes.mutable_virtual
* class_field_value_kindPcf_val(x,flag, kind) represents:
val x = E when flag is Immutable and kind is Cfk_concrete(Fresh, E)val virtual x: T when flag is Immutable and kind is Cfk_virtual(T)val mutable x = E when flag is Mutable and kind is Cfk_concrete(Fresh, E)val mutable virtual x: T when flag is Mutable and kind is Cfk_virtual(T)| Pcf_method of Asttypes.label Asttypes.loc
* Asttypes.private_virtual
* class_field_method_kindmethod x = Emethod virtual x: T| Pcf_constraint of core_type * core_typeconstraint T1 = T2
| Pcf_initializer of expressioninitializer E
| Pcf_attribute of attribute[\@\@\@id]
| Pcf_extension of extension[%%id]
and 'a class_field_kind = | Cfk_virtual of core_type| Cfk_concrete of Asttypes.override_flag * 'a * expressionand class_field_method_kind =
(expr_function_param list * value_constraint option) class_field_kindand module_type = {pmty_desc : module_type_desc;pmty_loc : Ocamlformat_ocaml_common.Location.t;pmty_attributes : attributes;... [\@id1] [\@id2]
}and module_type_desc = | Pmty_ident of Ocamlformat_ocaml_common.Longident.t Asttypes.locPmty_ident(S) represents S
| Pmty_signature of signaturesig ... end
| Pmty_functor of functor_parameters_type * module_typefunctor (X1 : MT1) ... (Xn : MTn) -> MT -> ... -> MT. The functor keyword is optional.
| Pmty_with of module_type * with_constraint listMT with ...
| Pmty_typeof of module_exprmodule type of ME
| Pmty_extension of extension[%id]
| Pmty_alias of Ocamlformat_ocaml_common.Longident.t Asttypes.loc(module M)
and functor_parameter = | Unit()
| Named of string option Asttypes.loc * module_typeNamed(name, MT) represents:
(X : MT) when name is Some X,(_ : MT) when name is Noneand functor_parameters_type = | Pfunctorty_short of functor_parameter Asttypes.loc list(A : T) (_ : T) ... ->.
| Pfunctorty_keyword of attributes * functor_parameter Asttypes.loc listfunctor (A : T) (_ : T) ... ->.
| Pfunctorty_unnamed of module_typeT ->.
and signature_item = {psig_desc : signature_item_desc;psig_loc : Ocamlformat_ocaml_common.Location.t;}and signature_item_desc = | Psig_value of value_descriptionval x: Texternal x: T = "s1" ... "sn"| Psig_type of Asttypes.rec_flag * type_declaration listtype t1 = ... and ... and tn = ...
| Psig_typesubst of type_declaration listtype t1 := ... and ... and tn := ...
| Psig_typext of type_extensiontype t1 += ...
| Psig_exception of type_exceptionexception C of T
| Psig_module of module_declarationmodule X = M and module X : MT
| Psig_modsubst of module_substitutionmodule X := M
| Psig_recmodule of module_declaration listmodule rec X1 : MT1 and ... and Xn : MTn
| Psig_modtype of module_type_declarationmodule type S = MT and module type S
| Psig_modtypesubst of module_type_declarationmodule type S := ...
| Psig_open of open_descriptionopen X
| Psig_include of include_descriptioninclude MT
| Psig_class of class_description listclass c1 : ... and ... and cn : ...
| Psig_class_type of class_type_declaration listclass type ct1 = ... and ... and ctn = ...
| Psig_attribute of attribute[\@\@\@id]
| Psig_extension of extension * attributes[%%id]
and module_declaration = {pmd_name : string option Asttypes.loc;pmd_args : functor_parameter Asttypes.loc list;pmd_type : module_type;pmd_ext_attrs : ext_attrs;pmd_loc : Ocamlformat_ocaml_common.Location.t;}Values of type module_declaration represents S : MT
and module_substitution = {pms_name : string Asttypes.loc;pms_manifest : Ocamlformat_ocaml_common.Longident.t Asttypes.loc;pms_ext_attrs : ext_attrs;pms_loc : Ocamlformat_ocaml_common.Location.t;}Values of type module_substitution represents S := M
and module_type_declaration = {pmtd_name : string Asttypes.loc;pmtd_type : module_type option;pmtd_ext_attrs : ext_attrs;pmtd_loc : Ocamlformat_ocaml_common.Location.t;}Values of type module_type_declaration represents:
S = MT,S for abstract module type declaration, when pmtd_type is None.and 'a open_infos = {popen_expr : 'a;popen_override : Asttypes.override_flag;popen_loc : Ocamlformat_ocaml_common.Location.t;popen_attributes : ext_attrs;}Values of type 'a open_infos represents:
open! X when popen_override is Override (silences the "used identifier shadowing" warning)open X when popen_override is FreshValues of type open_description represents:
open M.Nopen M(N).OValues of type open_declaration represents:
open M.Nopen M(N).Oopen struct ... endand 'a include_infos = {pincl_mod : 'a;pincl_loc : Ocamlformat_ocaml_common.Location.t;pincl_attributes : ext_attrs;}Values of type include_description represents include MT
Values of type include_declaration represents include ME
and with_constraint = | Pwith_type of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* type_declarationwith type X.t = ...
Note: the last component of the longident must match the name of the type_declaration.
*)| Pwith_module of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* Ocamlformat_ocaml_common.Longident.t Asttypes.locwith module X.Y = Z
| Pwith_modtype of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* module_typewith module type X.Y = Z
| Pwith_modtypesubst of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* module_typewith module type X.Y := sig end
| Pwith_typesubst of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* type_declarationwith type X.t := ..., same format as [Pwith_type]
| Pwith_modsubst of Ocamlformat_ocaml_common.Longident.t Asttypes.loc
* Ocamlformat_ocaml_common.Longident.t Asttypes.locwith module X.Y := Z
and module_expr = {pmod_desc : module_expr_desc;pmod_loc : Ocamlformat_ocaml_common.Location.t;pmod_attributes : attributes;... [\@id1] [\@id2]
}and module_expr_desc = | Pmod_ident of Ocamlformat_ocaml_common.Longident.t Asttypes.locX
| Pmod_structure of structurestruct ... end
| Pmod_functor of functor_parameter Asttypes.loc list * module_exprfunctor (X1 : MT1) ... (Xn : MTn) -> ME
| Pmod_apply of module_expr * module_exprME1(ME2)
| Pmod_apply_unit of module_expr * Ocamlformat_ocaml_common.Location.tME1(). The location argument correspond to the ().
| Pmod_constraint of module_expr * module_type(ME : MT)
| Pmod_unpack of expression * package_type option * package_type option(val E : M1 :> M2)
| Pmod_extension of extension[%id]
| Pmod_hole_
and structure_item = {pstr_desc : structure_item_desc;pstr_loc : Ocamlformat_ocaml_common.Location.t;}and structure_item_desc = | Pstr_eval of expression * attributesE
| Pstr_value of value_bindingsPstr_value(rec, [(P1, E1 ; ... ; (Pn, En))]) represents:
let P1 = E1 and ... and Pn = EN when rec is Nonrecursive,let rec P1 = E1 and ... and Pn = EN when rec is Recursive.| Pstr_primitive of value_descriptionval x: Texternal x: T = "s1" ... "sn" | Pstr_type of Asttypes.rec_flag * type_declaration listtype t1 = ... and ... and tn = ...
| Pstr_typext of type_extensiontype t1 += ...
| Pstr_exception of type_exceptionexception C of Texception C = M.X| Pstr_module of module_bindingmodule X = ME
| Pstr_recmodule of module_binding listmodule rec X1 = ME1 and ... and Xn = MEn
| Pstr_modtype of module_type_declarationmodule type S = MT
| Pstr_open of open_declarationopen X
| Pstr_class of class_declaration listclass c1 = ... and ... and cn = ...
| Pstr_class_type of class_type_declaration listclass type ct1 = ... and ... and ctn = ...
| Pstr_include of include_declarationinclude ME
| Pstr_attribute of attribute[\@\@\@id]
| Pstr_extension of extension * attributes[%%id]
and value_constraint = | Pvc_constraint of {locally_abstract_univars : string Asttypes.loc list;typ : core_type;}| Pvc_coercion of {}Pvc_constraint { locally_abstract_univars=[]; typ} is a simple type constraint on a value binding: let x : typPvc_constraint { locally_abstract_univars; typ} locally_abstract_univars is the list of locally abstract type variables in let x: type a ... . typ Pvc_coercion { ground=None; coercion } represents let x :> typPvc_coercion { ground=Some g; coercion } represents let x : g :> typand value_binding = {pvb_pat : pattern;pvb_args : expr_function_param list;pvb_body : function_body;For bindings that are not functions, this is Pfunction_body expr.
pvb_constraint : value_constraint option;pvb_is_pun : bool;pvb_attributes : ext_attrs;pvb_loc : Ocamlformat_ocaml_common.Location.t;}let pat : type_constraint = exp
and module_binding = {pmb_name : string option Asttypes.loc;pmb_args : functor_parameter Asttypes.loc list;pmb_expr : module_expr;pmb_ext_attrs : ext_attrs;pmb_loc : Ocamlformat_ocaml_common.Location.t;}Values of type module_binding represents module X = ME
type toplevel_phrase = | Ptop_def of structure| Ptop_dir of toplevel_directive#use, #load ...
and toplevel_directive = {pdir_name : string Asttypes.loc;pdir_arg : directive_argument option;pdir_loc : Ocamlformat_ocaml_common.Location.t;}and directive_argument = {pdira_desc : directive_argument_desc;pdira_loc : Ocamlformat_ocaml_common.Location.t;}and directive_argument_desc = | Pdir_string of string| Pdir_int of string * char option| Pdir_ident of Ocamlformat_ocaml_common.Longident.t| Pdir_bool of bool