12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157moduleAsttypes=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_desc:constant_desc;pconst_loc:Location.t;}andconstant_desc(*IF_CURRENT = Parsetree.constant_desc *)=|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_effectofpattern*pattern(* Pattern [effect P 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:string loc;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}(**
- [Pvc_constraint { locally_abstract_univars=[]; typ}]
is a simple type constraint on a value binding: [ let x : typ]
- More generally, in [Pvc_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 :> typ]
- [Pvc_coercion { ground=Some g; coercion }] represents [let x : g :> typ]
*)andvalue_binding(*IF_CURRENT = Parsetree.value_binding *)={pvb_pat:pattern;pvb_expr:expression;pvb_constraint:value_constraintoption;pvb_attributes:attributes;pvb_loc:Location.t;}(** [let pat : type_constraint = exp] *)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="Caml1999M035"letast_intf_magic_number="Caml1999N035"end