123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140moduleAsttypes=structtypeconstant(*IF_CURRENT = Asttypes.constant *)=Const_intofint|Const_charofchar|Const_stringofstring*Location.t*stringoption|Const_floatofstring|Const_int32ofint32|Const_int64ofint64|Const_nativeintof nativeinttyperec_flag(*IF_CURRENT = Asttypes.rec_flag *)=Nonrecursive|Recursivetypedirection_flag (*IF_CURRENT = Asttypes.direction_flag *)=Upto|Downto(* Order matters, used in polymorphic comparison *)typeprivate_flag(*IF_CURRENT = Asttypes.private_flag *)=Private|Publictypemutable_flag (*IF_CURRENT = Asttypes.mutable_flag *) =Immutable|Mutabletypevirtual_flag(*IF_CURRENT = Asttypes.virtual_flag *) =Virtual|Concretetypeoverride_flag(*IF_CURRENT = Asttypes.override_flag *) =Override|Freshtypeclosed_flag (*IF_CURRENT = Asttypes.closed_flag *) =Closed|Opentypelabel=stringtypearg_label(*IF_CURRENT = Asttypes.arg_label *) =Nolabel|Labelledofstring(** [label:T -> ...] *)|Optionalofstring(** [?label:T -> ...] *)type'aloc='aLocation.loc={txt:'a;loc :Location.t;}typevariance(*IF_CURRENT = Asttypes.variance *) =|Covariant|Contravariant|NoVariancetypeinjectivity(*IF_CURRENT = Asttypes.injectivity *) =|Injective|NoInjectivityendmoduleParsetree=structopenAsttypestypeconstant(*IF_CURRENT = Parsetree.constant *)=|Pconst_integerofstring*charoption(** Integer 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_charofchar(** Character such as ['c']. *)|Pconst_stringofstring*Location.t*stringoption(** Constant string such as ["constant"] or
[{delim|other constant|delim}].
The location span the content of the string, without the delimiters.
*)|Pconst_floatofstring*charoption(** Float constant such as [3.4], [2e5] or [1.4e-4].
Suffixes [g-z][G-Z] are accepted by the parser.
Suffixes are rejected by the typechecker.
*)typelocation_stack=Location.tlist(** {1 Extension points} *)typeattribute(*IF_CURRENT = Parsetree.attribute *)={attr_name:stringloc;attr_payload:payload;attr_loc:Location.t;}(** Attributes such as [[\@id ARG]] and [[\@\@id ARG]].
Metadata containers passed around within the AST.
The compiler ignores unknown attributes.
*)andextension=stringloc*payload(** Extension points such as [[%id ARG] and [%%id ARG]].
Sub-language placeholder -- rejected by the typechecker.
*)andattributes=attributelistandpayload(*IF_CURRENT = Parsetree.payload *)=|PStrofstructure|PSigofsignature(** [: SIG] in an attribute or an extension point *)|PTypofcore_type(** [: T] in an attribute or an extension point *)|PPatofpattern*expressionoption(** [? P] or [? P when E], in an attribute or an extension point *)(** {1 Core language} *)(** {2 Type expressions} *)andcore_type(*IF_CURRENT = Parsetree.core_type *)={ptyp_desc:core_type_desc;ptyp_loc:Location.t;ptyp_loc_stack:location_stack;ptyp_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andcore_type_desc(*IF_CURRENT = Parsetree.core_type_desc *)=|Ptyp_any(** [_] *)|Ptyp_var ofstring(** A type variable such as ['a] *)|Ptyp_arrowofarg_label*core_type*core_type(** [Ptyp_arrow(lbl, T1, T2)] represents:
- [T1 -> T2] when [lbl] is
{{!Asttypes.arg_label.Nolabel}[Nolabel]},
- [~l:T1 -> T2] when [lbl] is
{{!Asttypes.arg_label.Labelled}[Labelled]},
- [?l:T1 -> T2] when [lbl] is
{{!Asttypes.arg_label.Optional}[Optional]}.
*)|Ptyp_tupleofcore_typelist(** [Ptyp_tuple([T1 ; ... ; Tn])]
represents a product type [T1 * ... * Tn].
Invariant: [n >= 2].
*)|Ptyp_constrofLongident.tloc*core_typelist(** [Ptyp_constr(lident, l)] represents:
- [tconstr] when [l=[]],
- [T tconstr] when [l=[T]],
- [(T1, ..., Tn) tconstr] when [l=[T1 ; ... ; Tn]].
*)|Ptyp_objectofobject_fieldlist*closed_flag(** [Ptyp_object([ l1:T1; ...; ln:Tn ], flag)] represents:
- [< l1:T1; ...; ln:Tn >] when [flag] is
{{!Asttypes.closed_flag.Closed}[Closed]},
- [< l1:T1; ...; ln:Tn; .. >] when [flag] is
{{!Asttypes.closed_flag.Open}[Open]}.
*)|Ptyp_classofLongident.tloc*core_typelist(** [Ptyp_class(tconstr, l)] represents:
- [#tconstr] when [l=[]],
- [T #tconstr] when [l=[T]],
- [(T1, ..., Tn) #tconstr] when [l=[T1 ; ... ; Tn]].
*)|Ptyp_aliasofcore_type*stringloc(** [T as 'a]. *)|Ptyp_variantofrow_fieldlist*closed_flag*labellistoption(** [Ptyp_variant([`A;`B], flag, labels)] represents:
- [[ `A|`B ]]
when [flag] is {{!Asttypes.closed_flag.Closed}[Closed]},
and [labels] is [None],
- [[> `A|`B ]]
when [flag] is {{!Asttypes.closed_flag.Open}[Open]},
and [labels] is [None],
- [[< `A|`B ]]
when [flag] is {{!Asttypes.closed_flag.Closed}[Closed]},
and [labels] is [Some []],
- [[< `A|`B > `X `Y ]]
when [flag] is {{!Asttypes.closed_flag.Closed}[Closed]},
and [labels] is [Some ["X";"Y"]].
*)|Ptyp_polyofstringloclist*core_type(** ['a1 ... 'an. T]
Can only appear in the following context:
- As the {!core_type} of a
{{!pattern_desc.Ppat_constraint}[Ppat_constraint]} node corresponding
to a constraint on a let-binding:
{[let x : 'a1 ... 'an. T = e ...]}
- Under {{!class_field_kind.Cfk_virtual}[Cfk_virtual]} for methods
(not values).
- As the {!core_type} of a
{{!class_type_field_desc.Pctf_method}[Pctf_method]} node.
- As the {!core_type} of a {{!expression_desc.Pexp_poly}[Pexp_poly]}
node.
- As the {{!label_declaration.pld_type}[pld_type]} field of a
{!label_declaration}.
- As a {!core_type} of a {{!core_type_desc.Ptyp_object}[Ptyp_object]}
node.
- As the {{!value_description.pval_type}[pval_type]} field of a
{!value_description}.
*)|Ptyp_packageofpackage_type(** [(module S)]. *)|Ptyp_openofLongident.tloc*core_type(** [M.(T)] *)|Ptyp_extension ofextension(** [[%id]]. *)andpackage_type=Longident.tloc*(Longident.tloc*core_type)list(** As {!package_type} typed values:
- [(S, [])] represents [(module S)],
- [(S, [(t1, T1) ; ... ; (tn, Tn)])]
represents [(module S with type t1 = T1 and ... and tn = Tn)].
*)androw_field(*IF_CURRENT = Parsetree.row_field *)={prf_desc:row_field_desc;prf_loc:Location.t;prf_attributes:attributes;}androw_field_desc(*IF_CURRENT = Parsetree.row_field_desc *)=|Rtagoflabelloc*bool*core_typelist(** [Rtag(`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]].
- The [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)
*)|Rinheritofcore_type(** [[ | t ]] *)and object_field(*IF_CURRENT = Parsetree.object_field *)={pof_desc:object_field_desc;pof_loc:Location.t;pof_attributes:attributes;}andobject_field_desc(*IF_CURRENT = Parsetree.object_field_desc *)=|Otagoflabelloc*core_type|Oinheritofcore_type(** {2 Patterns} *)andpattern(*IF_CURRENT = Parsetree.pattern *)={ppat_desc:pattern_desc;ppat_loc:Location.t;ppat_loc_stack:location_stack;ppat_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andpattern_desc(*IF_CURRENT = Parsetree.pattern_desc *)=|Ppat_any(** The pattern [_]. *)|Ppat_varofstringloc(** A variable pattern such as [x] *)|Ppat_aliasofpattern*stringloc(** An alias pattern such as [P as 'a] *)|Ppat_constantofconstant(** Patterns such as [1], ['a'], ["true"], [1.0], [1l], [1L], [1n] *)|Ppat_intervalofconstant*constant(** Patterns such as ['a'..'z'].
Other forms of interval are recognized by the parser
but rejected by the type-checker. *)|Ppat_tupleofpatternlist(** Patterns [(P1, ..., Pn)].
Invariant: [n >= 2]
*)|Ppat_constructofLongident.tloc*(stringloclist*pattern)option(** [Ppat_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_variantoflabel*patternoption(** [Ppat_variant(`A, pat)] represents:
- [`A] when [pat] is [None],
- [`A P] when [pat] is [Some P]
*)|Ppat_recordof(Longident.tloc*pattern)list*closed_flag(** [Ppat_record([(l1, P1) ; ... ; (ln, Pn)], flag)] represents:
- [{ l1=P1; ...; ln=Pn }]
when [flag] is {{!Asttypes.closed_flag.Closed}[Closed]}
- [{ l1=P1; ...; ln=Pn; _}]
when [flag] is {{!Asttypes.closed_flag.Open}[Open]}
Invariant: [n > 0]
*)|Ppat_arrayofpatternlist(** Pattern [[| P1; ...; Pn |]] *)|Ppat_orofpattern*pattern(** Pattern [P1 | P2] *)|Ppat_constraintofpattern*core_type(** Pattern [(P : T)] *)|Ppat_typeofLongident.tloc(** Pattern [#tconst] *)|Ppat_lazyofpattern(** Pattern [lazy P] *)|Ppat_unpackofstringoptionloc(** [Ppat_unpack(s)] represents:
- [(module P)] when [s] is [Some "P"]
- [(module _)] when [s] is [None]
Note: [(module P : S)] is represented as
[Ppat_constraint(Ppat_unpack(Some "P"), Ptyp_package S)]
*)|Ppat_exceptionofpattern(** Pattern [exception P] *)|Ppat_extensionofextension(** Pattern [[%id]] *)|Ppat_openofLongident.tloc*pattern(** Pattern [M.(P)] *)(** {2 Value expressions} *)andexpression(*IF_CURRENT = Parsetree.expression *)={pexp_desc:expression_desc;pexp_loc:Location.t;pexp_loc_stack:location_stack;pexp_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andexpression_desc(*IF_CURRENT = Parsetree.expression_desc *)=|Pexp_identofLongident.tloc(** Identifiers such as [x] and [M.x]
*)|Pexp_constantofconstant(** Expressions constant such as [1], ['a'], ["true"], [1.0], [1l],
[1L], [1n] *)|Pexp_letofrec_flag*value_bindinglist*expression(** [Pexp_let(flag, [(P1,E1) ; ... ; (Pn,En)], E)] represents:
- [let P1 = E1 and ... and Pn = EN in E]
when [flag] is {{!Asttypes.rec_flag.Nonrecursive}[Nonrecursive]},
- [let rec P1 = E1 and ... and Pn = EN in E]
when [flag] is {{!Asttypes.rec_flag.Recursive}[Recursive]}.
*)|Pexp_functionoffunction_paramlist*type_constraintoption*function_body(** [Pexp_function ([P1; ...; Pn], C, body)] represents any construct
involving [fun] or [function], including:
- [fun P1 ... Pn -> E]
when [body = Pfunction_body E]
- [fun 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. [Pexp_function (params, _, body)] must
have non-empty [params] or a [Pfunction_cases _] body.
*)|Pexp_applyofexpression*(arg_label*expression)list(** [Pexp_apply(E0, [(l1, E1) ; ... ; (ln, En)])]
represents [E0 ~l1:E1 ... ~ln:En]
[li] can be
{{!Asttypes.arg_label.Nolabel}[Nolabel]} (non labeled argument),
{{!Asttypes.arg_label.Labelled}[Labelled]} (labelled arguments) or
{{!Asttypes.arg_label.Optional}[Optional]} (optional argument).
Invariant: [n > 0]
*)|Pexp_matchofexpression*caselist(** [match E0 with P1 -> E1 | ... | Pn -> En] *)|Pexp_tryofexpression*caselist(** [try E0 with P1 -> E1 | ... | Pn -> En] *)|Pexp_tupleofexpressionlist(** Expressions [(E1, ..., En)]
Invariant: [n >= 2]
*)|Pexp_constructofLongident.tloc*expressionoption(** [Pexp_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_variantoflabel*expressionoption(** [Pexp_variant(`A, exp)] represents
- [`A] when [exp] is [None]
- [`A E] when [exp] is [Some E]
*)|Pexp_recordof(Longident.tloc*expression)list*expressionoption(** [Pexp_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 E0]
Invariant: [n > 0]
*)|Pexp_fieldofexpression*Longident.tloc(** [E.l] *)|Pexp_setfieldofexpression*Longident.tloc*expression(** [E1.l <- E2] *)|Pexp_arrayofexpressionlist(** [[| E1; ...; En |]] *)|Pexp_ifthenelseofexpression*expression*expression option(** [if E1 then E2 else E3] *)|Pexp_sequenceofexpression*expression(** [E1; E2] *)|Pexp_whileofexpression*expression(** [while E1 do E2 done] *)|Pexp_forofpattern*expression*expression*direction_flag *expression(** [Pexp_for(i, E1, E2, direction, E3)] represents:
- [for i = E1 to E2 do E3 done]
when [direction] is {{!Asttypes.direction_flag.Upto}[Upto]}
- [for i = E1 downto E2 do E3 done]
when [direction] is {{!Asttypes.direction_flag.Downto}[Downto]}
*)|Pexp_constraintofexpression*core_type(** [(E : T)] *)|Pexp_coerceofexpression*core_typeoption*core_type(** [Pexp_coerce(E, from, T)] represents
- [(E :> T)] when [from] is [None],
- [(E : T0 :> T)] when [from] is [Some T0].
*)|Pexp_sendofexpression*labelloc(** [E # m] *)|Pexp_newofLongident.tloc(** [new M.c] *)|Pexp_setinstvaroflabelloc*expression(** [x <- 2] *)|Pexp_overrideof(labelloc*expression)list(** [{< x1 = E1; ...; xn = En >}] *)|Pexp_letmoduleofstringoptionloc*module_expr*expression(** [let module M = ME in E] *)|Pexp_letexceptionofextension_constructor*expression(** [let exception C in E] *)|Pexp_assertofexpression(** [assert E].
Note: [assert false] is treated in a special way by the
type-checker. *)|Pexp_lazyofexpression(** [lazy E] *)|Pexp_polyofexpression*core_typeoption(** Used for method bodies.
Can only be used as the expression under
{{!class_field_kind.Cfk_concrete}[Cfk_concrete]} for methods (not
values). *)|Pexp_objectofclass_structure(** [object ... end] *)|Pexp_newtypeofstringloc*expression(** [fun (type t) -> E] *)|Pexp_packofmodule_expr(** [(module ME)].
[(module ME : S)] is represented as
[Pexp_constraint(Pexp_pack ME, Ptyp_package S)] *)|Pexp_openofopen_declaration*expression(** - [M.(E)]
- [let open M in E]
- [let open! M in E] *)|Pexp_letopofletop(** - [let* P = E0 in E1]
- [let* P0 = E00 and* P1 = E01 in E1] *)|Pexp_extensionofextension(** [[%id]] *)|Pexp_unreachable(** [.] *)andcase(*IF_CURRENT = Parsetree.case *)={pc_lhs:pattern;pc_guard:expression option;pc_rhs:expression;}(** Values of type {!case} represents [(P -> E)] or [(P when E0 -> E)] *)andletop(*IF_CURRENT = Parsetree.letop *)={let_:binding_op;ands:binding_op list;body:expression;}andbinding_op (*IF_CURRENT = Parsetree.binding_op *)={pbop_op:stringloc;pbop_pat:pattern;pbop_exp:expression;pbop_loc:Location.t;}andfunction_param_desc (*IF_CURRENT = Parsetree.function_param_desc *)=|Pparam_valofarg_label*expressionoption*pattern(** [Pparam_val (lbl, exp0, P)] represents the parameter:
- [P]
when [lbl] is {{!Asttypes.arg_label.Nolabel}[Nolabel]}
and [exp0] is [None]
- [~l:P]
when [lbl] is {{!Asttypes.arg_label.Labelled}[Labelled l]}
and [exp0] is [None]
- [?l:P]
when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]}
and [exp0] is [None]
- [?l:(P = E0)]
when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]}
and [exp0] is [Some E0]
Note: If [E0] is provided, only
{{!Asttypes.arg_label.Optional}[Optional]} is allowed.
*)|Pparam_newtypeofstringloc(** [Pparam_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.
*)andfunction_param(*IF_CURRENT = Parsetree.function_param *)={pparam_loc:Location.t;pparam_desc:function_param_desc;}andfunction_body (*IF_CURRENT = Parsetree.function_body *)=|Pfunction_bodyofexpression|Pfunction_casesofcaselist*Location.t*attributes(** In [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 {{!expression_desc.Pexp_function}[Pexp_function]}. *)andtype_constraint(*IF_CURRENT = Parsetree.type_constraint *)=|Pconstraintofcore_type|Pcoerceofcore_type option*core_type(** See the comment on {{!expression_desc.Pexp_function}[Pexp_function]}. *)(** {2 Value descriptions} *)andvalue_description(*IF_CURRENT = Parsetree.value_description *)={pval_name:stringloc;pval_type:core_type;pval_prim:stringlist;pval_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)pval_loc:Location.t;}(** Values of type {!value_description} represents:
- [val x: T],
when {{!value_description.pval_prim}[pval_prim]} is [[]]
- [external x: T = "s1" ... "sn"]
when {{!value_description.pval_prim}[pval_prim]} is [["s1";..."sn"]]
*)(** {2 Type declarations} *)andtype_declaration(*IF_CURRENT = Parsetree.type_declaration *)={ptype_name:stringloc;ptype_params:(core_type*(variance*injectivity))list;(** [('a1,...'an) t] *)ptype_cstrs:(core_type*core_type*Location.t)list;(** [... constraint T1=T1' ... constraint Tn=Tn'] *)ptype_kind:type_kind;ptype_private:private_flag;(** for [= private ...] *)ptype_manifest:core_typeoption;(** represents [= T] *)ptype_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)ptype_loc:Location.t;}(**
Here are type declarations and their representation,
for various {{!type_declaration.ptype_kind}[ptype_kind]}
and {{!type_declaration.ptype_manifest}[ptype_manifest]} values:
- [type t] when [type_kind] is {{!type_kind.Ptype_abstract}[Ptype_abstract]},
and [manifest] is [None],
- [type t = T0]
when [type_kind] is {{!type_kind.Ptype_abstract}[Ptype_abstract]},
and [manifest] is [Some T0],
- [type t = C of T | ...]
when [type_kind] is {{!type_kind.Ptype_variant}[Ptype_variant]},
and [manifest] is [None],
- [type t = T0 = C of T | ...]
when [type_kind] is {{!type_kind.Ptype_variant}[Ptype_variant]},
and [manifest] is [Some T0],
- [type t = {l: T; ...}]
when [type_kind] is {{!type_kind.Ptype_record}[Ptype_record]},
and [manifest] is [None],
- [type t = T0 = {l : T; ...}]
when [type_kind] is {{!type_kind.Ptype_record}[Ptype_record]},
and [manifest] is [Some T0],
- [type t = ..]
when [type_kind] is {{!type_kind.Ptype_open}[Ptype_open]},
and [manifest] is [None].
*)andtype_kind(*IF_CURRENT = Parsetree.type_kind *)=|Ptype_abstract|Ptype_variantofconstructor_declarationlist|Ptype_recordoflabel_declaration list(** Invariant: non-empty list *)|Ptype_openandlabel_declaration(*IF_CURRENT = Parsetree.label_declaration *)={pld_name:stringloc;pld_mutable:mutable_flag;pld_type:core_type;pld_loc:Location.t;pld_attributes:attributes;(** [l : T [\@id1] [\@id2]] *)}(**
- [{ ...; l: T; ... }]
when {{!label_declaration.pld_mutable}[pld_mutable]}
is {{!Asttypes.mutable_flag.Immutable}[Immutable]},
- [{ ...; mutable l: T; ... }]
when {{!label_declaration.pld_mutable}[pld_mutable]}
is {{!Asttypes.mutable_flag.Mutable}[Mutable]}.
Note: [T] can be a {{!core_type_desc.Ptyp_poly}[Ptyp_poly]}.
*)andconstructor_declaration(*IF_CURRENT = Parsetree.constructor_declaration *)={pcd_name:stringloc;pcd_vars:stringloclist;pcd_args:constructor_arguments;pcd_res:core_type option;pcd_loc:Location.t;pcd_attributes:attributes;(** [C of ... [\@id1] [\@id2]] *)}andconstructor_arguments(*IF_CURRENT = Parsetree.constructor_arguments *)=|Pcstr_tupleofcore_typelist|Pcstr_recordoflabel_declarationlist(** Values 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 [...]].
*)andtype_extension(*IF_CURRENT = Parsetree.type_extension *)={ptyext_path:Longident.tloc;ptyext_params:(core_type*(variance*injectivity))list;ptyext_constructors:extension_constructorlist;ptyext_private:private_flag;ptyext_loc:Location.t;ptyext_attributes:attributes;(** ... [\@\@id1] [\@\@id2] *)}(**
Definition of new extensions constructors for the extensive sum type [t]
([type t += ...]).
*)andextension_constructor(*IF_CURRENT = Parsetree.extension_constructor *)={pext_name:stringloc;pext_kind:extension_constructor_kind;pext_loc:Location.t;pext_attributes:attributes;(** [C of ... [\@id1] [\@id2]] *)}andtype_exception(*IF_CURRENT = Parsetree.type_exception *)={ptyexn_constructor:extension_constructor;ptyexn_loc:Location.t;ptyexn_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)}(** Definition of a new exception ([exception E]). *)andextension_constructor_kind(*IF_CURRENT = Parsetree.extension_constructor_kind *)=|Pext_declofstringloclist*constructor_arguments*core_typeoption(** [Pext_decl(existentials, c_args, t_opt)]
describes a new extension constructor. It can be:
- [C of T1 * ... * Tn] when:
{ul {- [existentials] is [[]],}
{- [c_args] is [[T1; ...; Tn]],}
{- [t_opt] is [None].}}
- [C: T0] when
{ul {- [existentials] is [[]],}
{- [c_args] is [[]],}
{- [t_opt] is [Some T0].}}
- [C: T1 * ... * Tn -> T0] when
{ul {- [existentials] is [[]],}
{- [c_args] is [[T1; ...; Tn]],}
{- [t_opt] is [Some T0].}}
- [C: 'a... . T1 * ... * Tn -> T0] when
{ul {- [existentials] is [['a;...]],}
{- [c_args] is [[T1; ... ; Tn]],}
{- [t_opt] is [Some T0].}}
*)|Pext_rebindofLongident.tloc(** [Pext_rebind(D)] re-export the constructor [D] with the new name [C] *)(** {1 Class language} *)(** {2 Type expressions for the class language} *)andclass_type(*IF_CURRENT = Parsetree.class_type *)={pcty_desc:class_type_desc;pcty_loc:Location.t;pcty_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andclass_type_desc(*IF_CURRENT = Parsetree.class_type_desc *)=|Pcty_constrofLongident.tloc*core_typelist(** - [c]
- [['a1, ..., 'an] c] *)|Pcty_signatureofclass_signature(** [object ... end] *)|Pcty_arrowofarg_label*core_type*class_type(** [Pcty_arrow(lbl, T, CT)] represents:
- [T -> CT]
when [lbl] is {{!Asttypes.arg_label.Nolabel}[Nolabel]},
- [~l:T -> CT]
when [lbl] is {{!Asttypes.arg_label.Labelled}[Labelled l]},
- [?l:T -> CT]
when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]}.
*)|Pcty_extensionofextension(** [%id] *)|Pcty_open ofopen_description*class_type(** [let open M in CT] *)andclass_signature(*IF_CURRENT = Parsetree.class_signature *)={pcsig_self:core_type;pcsig_fields:class_type_fieldlist;}(** Values of type [class_signature] represents:
- [object('selfpat) ... end]
- [object ... end] when {{!class_signature.pcsig_self}[pcsig_self]}
is {{!core_type_desc.Ptyp_any}[Ptyp_any]}
*)andclass_type_field(*IF_CURRENT = Parsetree.class_type_field *)={pctf_desc:class_type_field_desc;pctf_loc:Location.t;pctf_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)}andclass_type_field_desc(*IF_CURRENT = Parsetree.class_type_field_desc *)=|Pctf_inheritofclass_type(** [inherit CT] *)|Pctf_valof(labelloc*mutable_flag*virtual_flag*core_type)(** [val x: T] *)|Pctf_methodof(labelloc*private_flag*virtual_flag*core_type)(** [method x: T]
Note: [T] can be a {{!core_type_desc.Ptyp_poly}[Ptyp_poly]}.
*)|Pctf_constraintof(core_type*core_type)(** [constraint T1 = T2] *)|Pctf_attributeofattribute(** [[\@\@\@id]] *)|Pctf_extensionofextension(** [[%%id]] *)and'aclass_infos(*IF_CURRENT = 'a Parsetree.class_infos *)={pci_virt:virtual_flag;pci_params:(core_type*(variance*injectivity))list;pci_name:stringloc;pci_expr:'a;pci_loc:Location.t;pci_attributes: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.
*)andclass_description=class_typeclass_infosandclass_type_declaration =class_typeclass_infos(** {2 Value expressions for the class language} *)andclass_expr(*IF_CURRENT = Parsetree.class_expr *)={pcl_desc:class_expr_desc;pcl_loc:Location.t;pcl_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andclass_expr_desc(*IF_CURRENT = Parsetree.class_expr_desc *)=|Pcl_constrofLongident.tloc*core_typelist(** [c] and [['a1, ..., 'an] c] *)|Pcl_structureofclass_structure(** [object ... end] *)|Pcl_funofarg_label*expressionoption*pattern*class_expr(** [Pcl_fun(lbl, exp0, P, CE)] represents:
- [fun P -> CE]
when [lbl] is {{!Asttypes.arg_label.Nolabel}[Nolabel]}
and [exp0] is [None],
- [fun ~l:P -> CE]
when [lbl] is {{!Asttypes.arg_label.Labelled}[Labelled l]}
and [exp0] is [None],
- [fun ?l:P -> CE]
when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]}
and [exp0] is [None],
- [fun ?l:(P = E0) -> CE]
when [lbl] is {{!Asttypes.arg_label.Optional}[Optional l]}
and [exp0] is [Some E0].
*)|Pcl_applyofclass_expr*(arg_label*expression)list(** [Pcl_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_letofrec_flag*value_bindinglist*class_expr(** [Pcl_let(rec, [(P1, E1); ... ; (Pn, En)], CE)] represents:
- [let P1 = E1 and ... and Pn = EN in CE]
when [rec] is {{!Asttypes.rec_flag.Nonrecursive}[Nonrecursive]},
- [let rec P1 = E1 and ... and Pn = EN in CE]
when [rec] is {{!Asttypes.rec_flag.Recursive}[Recursive]}.
*)|Pcl_constraintofclass_expr*class_type(** [(CE : CT)] *)|Pcl_extensionofextension(** [[%id]] *)|Pcl_openofopen_description*class_expr(** [let open M in CE] *)andclass_structure(*IF_CURRENT = Parsetree.class_structure *)={pcstr_self:pattern;pcstr_fields:class_fieldlist;}(** Values of type {!class_structure} represents:
- [object(selfpat) ... end]
- [object ... end] when {{!class_structure.pcstr_self}[pcstr_self]}
is {{!pattern_desc.Ppat_any}[Ppat_any]}
*)andclass_field(*IF_CURRENT = Parsetree.class_field *)={pcf_desc:class_field_desc;pcf_loc:Location.t;pcf_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)}andclass_field_desc(*IF_CURRENT = Parsetree.class_field_desc *)=|Pcf_inheritofoverride_flag*class_expr*stringlocoption(** [Pcf_inherit(flag, CE, s)] represents:
- [inherit CE]
when [flag] is {{!Asttypes.override_flag.Fresh}[Fresh]}
and [s] is [None],
- [inherit CE as x]
when [flag] is {{!Asttypes.override_flag.Fresh}[Fresh]}
and [s] is [Some x],
- [inherit! CE]
when [flag] is {{!Asttypes.override_flag.Override}[Override]}
and [s] is [None],
- [inherit! CE as x]
when [flag] is {{!Asttypes.override_flag.Override}[Override]}
and [s] is [Some x]
*)|Pcf_valof(labelloc*mutable_flag*class_field_kind)(** [Pcf_val(x,flag, kind)] represents:
- [val x = E]
when [flag] is {{!Asttypes.mutable_flag.Immutable}[Immutable]}
and [kind] is {{!class_field_kind.Cfk_concrete}[Cfk_concrete(Fresh, E)]}
- [val virtual x: T]
when [flag] is {{!Asttypes.mutable_flag.Immutable}[Immutable]}
and [kind] is {{!class_field_kind.Cfk_virtual}[Cfk_virtual(T)]}
- [val mutable x = E]
when [flag] is {{!Asttypes.mutable_flag.Mutable}[Mutable]}
and [kind] is {{!class_field_kind.Cfk_concrete}[Cfk_concrete(Fresh, E)]}
- [val mutable virtual x: T]
when [flag] is {{!Asttypes.mutable_flag.Mutable}[Mutable]}
and [kind] is {{!class_field_kind.Cfk_virtual}[Cfk_virtual(T)]}
*)|Pcf_methodof(labelloc*private_flag*class_field_kind)(** - [method x = E]
([E] can be a {{!expression_desc.Pexp_poly}[Pexp_poly]})
- [method virtual x: T]
([T] can be a {{!core_type_desc.Ptyp_poly}[Ptyp_poly]})
*)|Pcf_constraintof(core_type*core_type)(** [constraint T1 = T2] *)|Pcf_initializerofexpression(** [initializer E] *)|Pcf_attributeofattribute(** [[\@\@\@id]] *)|Pcf_extensionofextension(** [[%%id]] *)andclass_field_kind(*IF_CURRENT = Parsetree.class_field_kind *)=|Cfk_virtualofcore_type|Cfk_concreteofoverride_flag*expressionandclass_declaration=class_exprclass_infos(** {1 Module language} *)(** {2 Type expressions for the module language} *)andmodule_type(*IF_CURRENT = Parsetree.module_type *)={pmty_desc:module_type_desc;pmty_loc:Location.t;pmty_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andmodule_type_desc(*IF_CURRENT = Parsetree.module_type_desc *)=|Pmty_identofLongident.tloc(** [Pmty_ident(S)] represents [S] *)|Pmty_signatureofsignature(** [sig ... end] *)|Pmty_functoroffunctor_parameter*module_type(** [functor(X : MT1) -> MT2] *)|Pmty_withofmodule_type*with_constraintlist(** [MT with ...] *)|Pmty_typeofofmodule_expr(** [module type of ME] *)|Pmty_extensionofextension(** [[%id]] *)|Pmty_aliasofLongident.tloc(** [(module M)] *)andfunctor_parameter(*IF_CURRENT = Parsetree.functor_parameter *)=|Unit(** [()] *)|Named ofstringoptionloc*module_type(** [Named(name, MT)] represents:
- [(X : MT)] when [name] is [Some X],
- [(_ : MT)] when [name] is [None] *)andsignature=signature_itemlistandsignature_item(*IF_CURRENT = Parsetree.signature_item *)={psig_desc:signature_item_desc;psig_loc:Location.t;}andsignature_item_desc (*IF_CURRENT = Parsetree.signature_item_desc *)=|Psig_valueofvalue_description(** - [val x: T]
- [external x: T = "s1" ... "sn"]
*)|Psig_typeofrec_flag*type_declarationlist(** [type t1 = ... and ... and tn = ...] *)|Psig_typesubstoftype_declarationlist(** [type t1 := ... and ... and tn := ...] *)|Psig_typextoftype_extension(** [type t1 += ...] *)|Psig_exceptionoftype_exception(** [exception C of T] *)|Psig_moduleofmodule_declaration(** [module X = M] and [module X : MT] *)|Psig_modsubstofmodule_substitution(** [module X := M] *)|Psig_recmoduleofmodule_declarationlist(** [module rec X1 : MT1 and ... and Xn : MTn] *)|Psig_modtypeofmodule_type_declaration(** [module type S = MT] and [module type S] *)|Psig_modtypesubstofmodule_type_declaration(** [module type S := ...] *)|Psig_openofopen_description(** [open X] *)|Psig_includeofinclude_description(** [include MT] *)|Psig_classofclass_descriptionlist(** [class c1 : ... and ... and cn : ...] *)|Psig_class_typeofclass_type_declarationlist(** [class type ct1 = ... and ... and ctn = ...] *)|Psig_attributeofattribute(** [[\@\@\@id]] *)|Psig_extensionofextension*attributes(** [[%%id]] *)andmodule_declaration(*IF_CURRENT = Parsetree.module_declaration *)={pmd_name:stringoptionloc;pmd_type:module_type;pmd_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)pmd_loc:Location.t;}(** Values of type [module_declaration] represents [S : MT] *)andmodule_substitution(*IF_CURRENT = Parsetree.module_substitution *)={pms_name:stringloc;pms_manifest:Longident.tloc;pms_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)pms_loc:Location.t;}(** Values of type [module_substitution] represents [S := M] *)andmodule_type_declaration(*IF_CURRENT = Parsetree.module_type_declaration *)={pmtd_name:stringloc;pmtd_type:module_typeoption;pmtd_attributes:attributes;(** [... [\@\@id1] [\@\@id2]] *)pmtd_loc:Location.t;}(** Values of type [module_type_declaration] represents:
- [S = MT],
- [S] for abstract module type declaration,
when {{!module_type_declaration.pmtd_type}[pmtd_type]} is [None].
*)and'aopen_infos(*IF_CURRENT = 'a Parsetree.open_infos *)={popen_expr:'a;popen_override:override_flag;popen_loc:Location.t;popen_attributes:attributes;}(** Values of type ['a open_infos] represents:
- [open! X] when {{!open_infos.popen_override}[popen_override]}
is {{!Asttypes.override_flag.Override}[Override]}
(silences the "used identifier shadowing" warning)
- [open X] when {{!open_infos.popen_override}[popen_override]}
is {{!Asttypes.override_flag.Fresh}[Fresh]}
*)andopen_description=Longident.tlocopen_infos(** Values of type [open_description] represents:
- [open M.N]
- [open M(N).O] *)andopen_declaration=module_expropen_infos(** Values of type [open_declaration] represents:
- [open M.N]
- [open M(N).O]
- [open struct ... end] *)and'ainclude_infos(*IF_CURRENT = 'a Parsetree.include_infos *)={pincl_mod:'a;pincl_loc:Location.t;pincl_attributes:attributes;}andinclude_description =module_typeinclude_infos(** Values of type [include_description] represents [include MT] *)andinclude_declaration=module_exprinclude_infos(** Values of type [include_declaration] represents [include ME] *)andwith_constraint(*IF_CURRENT = Parsetree.with_constraint *)=|Pwith_typeofLongident.tloc*type_declaration(** [with type X.t = ...]
Note: the last component of the longident must match
the name of the type_declaration. *)|Pwith_moduleofLongident.tloc*Longident.tloc(** [with module X.Y = Z] *)|Pwith_modtypeofLongident.tloc*module_type(** [with module type X.Y = Z] *)|Pwith_modtypesubstofLongident.tloc*module_type(** [with module type X.Y := sig end] *)|Pwith_typesubstofLongident.tloc*type_declaration(** [with type X.t := ..., same format as [Pwith_type]] *)|Pwith_modsubstofLongident.tloc*Longident.tloc(** [with module X.Y := Z] *)(** {2 Value expressions for the module language} *)andmodule_expr(*IF_CURRENT = Parsetree.module_expr *)={pmod_desc:module_expr_desc;pmod_loc:Location.t;pmod_attributes:attributes;(** [... [\@id1] [\@id2]] *)}andmodule_expr_desc(*IF_CURRENT = Parsetree.module_expr_desc *)=|Pmod_identofLongident.tloc(** [X] *)|Pmod_structureofstructure(** [struct ... end] *)|Pmod_functoroffunctor_parameter*module_expr(** [functor(X : MT1) -> ME] *)|Pmod_applyofmodule_expr*module_expr(** [ME1(ME2)] *)|Pmod_apply_unitofmodule_expr(** [ME1()] *)|Pmod_constraintofmodule_expr*module_type(** [(ME : MT)] *)|Pmod_unpackofexpression(** [(val E)] *)|Pmod_extensionofextension(** [[%id]] *)andstructure=structure_itemlistandstructure_item(*IF_CURRENT = Parsetree.structure_item *)={pstr_desc:structure_item_desc;pstr_loc:Location.t;}andstructure_item_desc (*IF_CURRENT = Parsetree.structure_item_desc *)=|Pstr_evalofexpression*attributes(** [E] *)|Pstr_value ofrec_flag*value_bindinglist(** [Pstr_value(rec, [(P1, E1 ; ... ; (Pn, En))])] represents:
- [let P1 = E1 and ... and Pn = EN]
when [rec] is {{!Asttypes.rec_flag.Nonrecursive}[Nonrecursive]},
- [let rec P1 = E1 and ... and Pn = EN ]
when [rec] is {{!Asttypes.rec_flag.Recursive}[Recursive]}.
*)|Pstr_primitiveofvalue_description(** - [val x: T]
- [external x: T = "s1" ... "sn" ]*)|Pstr_typeofrec_flag*type_declarationlist(** [type t1 = ... and ... and tn = ...] *)|Pstr_typextoftype_extension(** [type t1 += ...] *)|Pstr_exceptionoftype_exception(** - [exception C of T]
- [exception C = M.X] *)|Pstr_moduleofmodule_binding(** [module X = ME] *)|Pstr_recmoduleofmodule_bindinglist(** [module rec X1 = ME1 and ... and Xn = MEn] *)|Pstr_modtypeofmodule_type_declaration(** [module type S = MT] *)|Pstr_openofopen_declaration(** [open X] *)|Pstr_classofclass_declarationlist(** [class c1 = ... and ... and cn = ...] *)|Pstr_class_typeofclass_type_declarationlist(** [class type ct1 = ... and ... and ctn = ...] *)|Pstr_includeofinclude_declaration(** [include ME] *)|Pstr_attributeofattribute(** [[\@\@\@id]] *)|Pstr_extensionofextension*attributes(** [[%%id]] *)andvalue_constraint(*IF_CURRENT = Parsetree.value_constraint *)=|Pvc_constraintof{locally_abstract_univars:stringloclist;typ:core_type;}|Pvc_coercion of{ground:core_typeoption;coercion:core_type}andvalue_binding(*IF_CURRENT = Parsetree.value_binding *)={pvb_pat:pattern;pvb_expr:expression;pvb_constraint:value_constraintoption;pvb_attributes:attributes;pvb_loc:Location.t;}andmodule_binding (*IF_CURRENT = Parsetree.module_binding *)={pmb_name:stringoptionloc;pmb_expr:module_expr;pmb_attributes:attributes;pmb_loc:Location.t;}(** Values of type [module_binding] represents [module X = ME] *)(** {1 Toplevel} *)(** {2 Toplevel phrases} *)typetoplevel_phrase(*IF_CURRENT = Parsetree.toplevel_phrase *)=|Ptop_defofstructure|Ptop_diroftoplevel_directive (** [#use], [#load] ... *)andtoplevel_directive(*IF_CURRENT = Parsetree.toplevel_directive *)={pdir_name:stringloc;pdir_arg:directive_argumentoption;pdir_loc:Location.t;}anddirective_argument (*IF_CURRENT = Parsetree.directive_argument *)={pdira_desc:directive_argument_desc;pdira_loc:Location.t;}anddirective_argument_desc (*IF_CURRENT = Parsetree.directive_argument_desc *)=|Pdir_stringofstring|Pdir_intofstring *charoption|Pdir_ident ofLongident.t|Pdir_boolofboolendmoduleConfig=structletast_impl_magic_number="Caml1999M034"letast_intf_magic_number="Caml1999N034"end