123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665(*
* Copyright (c) 2014 Leo White <lpw25@cl.cam.ac.uk>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*)openAsttypesopenTypesmoduleOCamlPath=PathopenOdoc_model.PathsopenOdoc_model.LangopenOdoc_model.NamesmoduleEnv=Ident_envmodulePaths=Odoc_model.Pathstypeenv={ident_env:Env.t;warnings_tag:stringoption;(** used to suppress warnings *)}letempty_docenv={Odoc_model.Comment.elements=[];warnings_tag=env.warnings_tag}moduleCompat=struct#ifOCAML_VERSION>=(4,14,0)#ifOCAML_VERSION>=(5,3,0)letnewty2=Btype.newty2#endif(** this is the type on which physical equality is meaningful *)typerepr_type_node=Types.transient_expr(** repr has morally type [type_expr -> repr_type_node] in all OCaml
versions *)letreprx=Transient_expr.reprx#ifOCAML_VERSION >=(5,6,0)(** Since 5.6, abbreviation expansion happens in place in the type graph and
the original abbreviation is remembered in the [Texpand] edge that
replaced it. [Types.get_desc] walks past those edges and would hand us
the expanded type, so use the same accessor the compiler's own printer
uses ([Out_type.printer_get_desc]) to recover the abbreviation. *)letget_descty=Btype.get_folded_desc~keep_Tvar:truetyletdeep_occur=Btype.deep_occur#elseletget_desc=Types.get_descletdeep_occur=Ctype.deep_occur#endifletget_row_name=Types.row_nameletrow_field_repr=Types.row_field_reprletfield_kind_repr =Types.field_kind_reprletstatic_row_repr=Btype.static_rowletrow_closed=Types.row_closedletrow_fields=Types.row_fieldsletfield_public=Types.Fpublicletself_type=Btype.self_typeletcsig_selfx=x.Types.csig_selfletrow_reprx=xletconcr_mem=Types.Meths.memletcsig_concrx=x.Types.csig_methsleteq_type=Types.eq_type#ifOCAML_VERSION>=(5,4,0)||definedOXCAMLletinvisible_wrapty=newty2 ~level:Btype.generic_level(Ttuple[None,ty])#elseletinvisible_wrap ty=newty2~level:Btype.generic_level(Ttuple[ty])#endif#elsetyperepr_type_node=Types.type_exprletrepr=Btype.reprletget_descx=(reprx).Types.descletdeep_occur=Ctype.deep_occurletget_row_namex=x.Types.row_nameletrow_field_repr=Btype.row_field_reprletfield_kind_repr=Btype.field_kind_reprletstatic_row_reprx=Btype.static_row(Btype.row_reprx)letrow_closedx=x.Types.row_closedletrow_fieldsx=x.Types.row_fieldsletfield_public =Types.Fpresentletself_type=Ctype.self_typeletcsig_selfx=Btype.reprx.Types.csig_selfletrow_repr=Btype.row_reprletconcr_mem=Types.Concr.memletcsig_concrx=x.Types.csig_concrleteq_typexy=x==y||reprx==repry(** Create a new node pointing to [ty] that is printed in the same way as
[ty]*)letinvisible_wrapty=Btype.(newty2generic_level(Ttuple[ty]))#endifendlet proxyty=Compat.(repr (Btype.proxyty))letopt_mapf=function|None->None|Somex->Some(fx)letopt_iterf=function|None->()|Somex->fx(* From OCaml 5.5, the argument types of inferred arrows are wrapped in a
trivial [Tpoly] node. Look through itwhen unwrapping optional arguments. *)letstrip_trivial_polytyp=matchCompat.get_desctypwithTpoly(typ,[])->typ|_->typletread_label lbl=letopenTypeExprin#ifdefinedOXCAMLmatchlblwith|Types.Nolabel->None|Types.Labelleds->Some(Labels)|Types.Optionals->Some(Optionals)|Types.Positions->(* FIXME: do better? *)Some(Labels)#elsematchlblwith|Asttypes.Nolabel->None|Asttypes.Labelleds->Some(Labels)|Asttypes.Optionals->Some(Optionals)#endif(* Handle type variable names *)(** To identify equal type node for type variables, we need a map from the
representative type node to names. Otherwise, equivalentvariables would end
up with distinct names *)letused_names:(Compat.repr_type_node*string)listref=ref[]letname_counter=ref0letreserved_names =ref[]letreset_names()=used_names:=[];name_counter:=0;reserved_names:=[]letreserve_name=function|Somename ->ifnot(List.memname!reserved_names)thenreserved_names:=name::!reserved_names|None->()letrecnext_name()=letname=if!name_counter<26thenString.make1(Char.chr(97+!name_counter))elseString.make1(Char.chr(97+!name_countermod26))^string_of_int(!name_counter/26)inincrname_counter;ifList.memname!reserved_namesthennext_name()elsenameletfresh_namebase=letcurrent_name=refbaseinleti=ref0inwhileList.exists(fun(_,name')->!current_name=name')!used_namesdocurrent_name:=base^(string_of_int !i);i:=!i+1;done;!current_nameletname_of_type_repr(ty:Compat.repr_type_node)=tryList.assqty!used_nameswithNot_found->letbase=matchty.descwith#ifdefinedOXCAML|Tvar{name=Somename;_}|Tunivar{name=Somename;_}->name#else|Tvar (Somename)|Tunivar(Somename)->name#endif|_->next_name()inletname=fresh_namebaseinifname<>"_"thenused_names:=(ty,name)::!used_names;nameletname_of_typety=name_of_type_repr(Compat.reprty)letremove_namestyl=used_names:=List.filter(fun(ty,_)->not(List.memqtytyl))!used_names(* Handle recursive types and shared row variables *)letaliased:Compat.repr_type_nodelistref=ref[]letused_aliases=ref[]letreset_aliased()=aliased:= [];used_aliases:=[]letis_aliasedpx=List.memqpx!aliasedletaliasable(ty:Types.type_expr)=matchCompat.get_desctywith|Tvar_|Tunivar_|Tpoly_->false|_->trueletadd_alias_proxypx=ifnot(List.memq px!aliased)thenbeginaliased:=px::!aliased;matchpx.descwith#ifdefinedOXCAML|Tvar{name;_}|Tunivar{name;_}->#else|Tvarname|Tunivar name->#endifreserve_namename|_->()endletadd_aliasty=add_alias_proxy(proxyty)letused_alias (px:Compat.repr_type_node)=List.memqpx!used_aliasesletuse_alias(px:Compat.repr_type_node)=used_aliases:=px::!used_aliasesletvisited_rows:Compat.repr_type_nodelistref=ref[]letreset_visited_rows()=visited_rows:=[]letis_row_visited px=List.memqpx!visited_rowsletvisit_rowpx=visited_rows:=px::!visited_rowsletvisit_objecttypx=ifCtype.opened_objecttythenvisited_rows:=px::!visited_rowsletnamable_rowrow=Compat.get_row_namerow<>None&&List.for_all(fun(_,f)->matchCompat.row_field_reprfwith#ifOCAML_VERSION>=(4,14,0)|Reither(c,l,_)->#else|Reither(c,l,_,_)->#endifCompat.row_closedrow&&ifcthenl=[]elseList.lengthl=1|_->true)(Compat.row_fieldsrow)let mark_type ty=letrecloopvisitedty=letpx=proxytyinifList.memqpxvisited&&aliasable tythen add_alias_proxypxelseletvisited=px::visitedinmatchCompat.get_desctywith#ifdefinedOXCAML|Tvar{name;_}|Tunivar{name;_}->#else|Tvarname|Tunivarname->#endifreserve_namename|Tarrow(_,ty1,ty2,_)->loopvisitedty1;loopvisitedty2#ifOCAML_VERSION>=(5,4,0)||definedOXCAML|Ttupletyl->List.iter(fun(_lbl,x)->loopvisitedx)tyl#else|Ttupletyl->List.iter(loopvisited)tyl#endif#ifdefinedOXCAML|Tunboxed_tupletyl->List.iter(fun(_,ty)->loopvisitedty)tyl#endif|Tconstr(_,tyl,_)->List.iter(loopvisited)tyl|Tvariantrow->ifis_row_visitedpxthenadd_alias_proxypxelsebeginifnot(Compat.static_row_reprrow)then visit_rowpx;matchCompat.get_row_namerowwith|Some(_,tyl)whennamable_rowrow->List.iter(loopvisited)tyl|_->Btype.iter_row(loopvisited)rowend|Tobject(fi,nm)->ifis_row_visitedpxthenadd_alias_proxypxelsebeginvisit_objecttypx;match!nmwith|None->letfields,_=Ctype.flatten_fieldsfiinList.iter(fun(_,kind,ty)->ifCompat.field_kind_reprkind=Compat.field_publicthenloopvisitedty)fields|Some(_,l)->List.iter(loopvisited)(List.tll)end|Tfield(_,kind,ty1,ty2)whenCompat.field_kind_reprkind=Compat.field_public->loopvisitedty1;loopvisitedty2|Tfield(_,_,_,ty2)->loop visitedty2|Tnil->()|Tpoly (ty,tyl)->List.iter(funt->add_alias t)tyl;loop visitedty#ifOCAML_VERSION>=(5,5,0)|Tpackagep->List.iter(fun(_,x)->loopvisitedx)p.pack_constraints|Tfunctor(_lbl,_id,pkg,ret_type)->List.iter(fun(_,x)->loopvisitedx)pkg.pack_constraints;loopvisited ret_type#elifOCAML_VERSION>=(5,4,0)|Tpackagep->List.iter(fun(_,x)->loopvisited x)p.pack_cstrs#elifOCAML_VERSION>=(4,13,0)|Tpackage(_,tyl)->List.iter(fun(_,x)->loopvisitedx)tyl#else|Tpackage(_,_,tyl)->List.iter(loopvisited)tyl#endif#ifOCAML_VERSION<(4,13,0)|Tsubstty-> loopvisitedty#else|Tsubst(ty,_)->loop visitedty#endif|Tlink_->assertfalse#ifOCAML_VERSION>=(5,6,0)(* [Compat.get_desc] walks past [Texpand] just as it does [Tlink]. *)|Texpand_->assertfalse#endif#ifdefinedOXCAML|Tquotetyp->loopvisitedtyp|Tquote_evaltyp->loopvisitedtyp|Tsplicetyp->loopvisitedtyp|Tof_kind_-> ()|Trepr_->()#endifinloop[]tyletreset_context()=reset_names();reset_aliased();reset_visited_rows()letmark_type_exprt=reset_context();mark_typetletmark_value_descriptionvd=reset_context();mark_typevd.val_typeletmark_type_parameterparam=letpx=proxyparaminadd_alias_proxy px;mark_typeparam;ifaliasableparamthenuse_aliaspx#ifOCAML_VERSION<(4,13,0)lettvar_nonety=ty.desc <-TvarNone#elifOCAML_VERSION<(4,14,0)lettvar_nonety=Types.Private_type_expr.set_descty(TvarNone)#elifdefinedOXCAMLlettvar_nonetyjkind=Types.Transient_expr.(set_desc(coercety)(Tvar{name=None;jkind}))#elselettvar_nonety=Types.Transient_expr.(set_desc(coercety)(TvarNone))#endifletwrap_constrained_paramstyl=letparams=List.fold_left(funtylty->ifList.exists(Compat.eq_typety)tylthenCompat.invisible_wrapty::tylelsety::tyl)(* Two parameters might be identical due to a constraint but we need to
print them differently in order to make the output syntactically valid.
We use [Ttuple[ty]] because it is printed as [ty]. *)[]tylinList.revparamsletprepare_type_parametersparamsmanifest=let params=wrap_constrained_params params inbeginmatchmanifestwith|Somety->letvars=Ctype.free_variablestyinList.iter(funty->matchCompat.get_desctywith#ifdefinedOXCAML|Tvar{name =Some"_";jkind}->ifList.memqtyvarsthentvar_nonetyjkind#else|Tvar(Some"_")->ifList.memqtyvarsthentvar_nonety#endif|_->())params|None->()end;params(* NOTE(@ostera): constructor with inlined records were introduced post 4.02 *)letmark_constructor_args=function#ifdefinedOXCAML|Cstr_tupleargs->List.iter(fun carg->mark_typecarg.ca_type)args#else|Cstr_tupleargs->List.itermark_typeargs#endif|Cstr_recordlds->List.iter(funld->mark_type ld.ld_type)ldsletmark_type_kind=function#ifOCAML_VERSION>=(5,2,0)|Type_abstract_->()#else|Type_abstract->()#endif#ifdefinedOXCAML|Type_variant(cds,_,_)->#elifOCAML_VERSION>=(4,13,0)|Type_variant (cds,_)->#else|Type_variantcds->#endifList.iter(funcd->mark_constructor_argscd.cd_args;opt_itermark_typecd.cd_res)cds#ifdefinedOXCAML|Type_record_unboxed_product(lds,_,_)->List.iter(fun ld->mark_typeld.ld_type)lds|Type_record(lds,_,_)->#else|Type_record(lds,_)->#endifList.iter(funld->mark_typeld.ld_type)lds|Type_open->()#ifOCAML_VERSION>=(5,5,0)|Type_external_->()#endifletmark_type_declarationdecl=letparams=prepare_type_parametersdecl.type_paramsdecl.type_manifest inreset_context();List.itermark_type_parameterparams;opt_itermark_typedecl.type_manifest;mark_type_kinddecl.type_kind;paramsletmark_extension_constructorext=mark_constructor_argsext.ext_args;opt_itermark_typeext.ext_ret_typeletmark_type_extension type_paramsexts=lettype_params=prepare_type_parameterstype_paramsNoneinreset_context();List.itermark_type_parametertype_params;List.itermark_extension_constructorexts;type_paramsletmark_type_extension'extrest=lettype_params=ext.ext_type_paramsinletexts=ext::(List.mapsndrest)inmark_type_extensiontype_paramsextsletmark_exceptionext=reset_context();mark_extension_constructorextletrecmark_class_typeparams=function|Cty_constr(_,tyl,cty)->letsty=Compat.self_typectyinifis_row_visited(proxysty)||List.existsaliasable params|| List.exists(Compat.deep_occursty)tylthenmark_class_typeparamsctyelseList.itermark_typetyl|Cty_signaturesign->let sty=Compat.csig_selfsigninletpx=proxystyinifis_row_visited pxthenadd_alias_proxypxelsevisit_rowpx;let(fields,_)=Ctype.flatten_fields(Ctype.object_fieldssign.csig_self)inList.iter(fun(_,_,ty)-> mark_typety)fields;Vars.iter(fun_(_,_,ty)->mark_typety)sign.csig_vars;ifis_aliasedpx&& aliasablestythenuse_aliaspx|Cty_arrow (_,ty,cty)->mark_type ty;mark_class_type paramsctyletmark_class_type_declarationcltd=reset_context();List.itermark_type_parametercltd.clty_params;mark_class_typecltd.clty_paramscltd.clty_typeletmark_class_declarationcld=reset_context();List.itermark_type_parametercld.cty_params;mark_class_typecld.cty_paramscld.cty_type#ifdefinedOXCAMLletrecread_longident_module(l:Longident.t):Paths.Path.Module.t=matchlwith|Longident.Lidents->`Root(ModuleName.make_stds)|Longident.Ldot(p,s)->`Dot(read_longident_modulep,ModuleName.make_std s)|Longident.Lapply(p,arg)->`Apply(read_longident_modulep,read_longident_modulearg)letread_longident_type(l:Longident.t):Paths.Path.Type.t=matchlwith|Longident.Lidents->`Resolved(`CoreType(TypeName.make_stds))|Longident.Ldot(p,s)->`DotT(read_longident_modulep,TypeName.make_stds)|Longident.Lapply_->`Resolved(`CoreType(TypeName.make_std"_"))letread_longident_class_type(l:Longident.t):Paths.Path.ClassType.t=matchlwith|Longident.Ldot(p,s)->`DotT(read_longident_modulep,TypeName.make_stds)|Longident.Lidents->`DotT(`Root(ModuleName.make_std"*"),TypeName.make_stds)|Longident.Lapply_->`DotT(`Root(ModuleName.make_std"*"),TypeName.make_std"_")letread_longident_module_type(l:Longident.t):Paths.Path.ModuleType.t=matchlwith|Longident.Ldot(p,s)->`DotMT(read_longident_modulep,ModuleTypeName.make_stds)|Longident.Lidents->`DotMT(`Root(ModuleName.make_std"_"),ModuleTypeName.make_stds)|Longident.Lapply_->`DotMT(`Root(ModuleName.make_std"_"),ModuleTypeName.make_std"_")letread_parsetree_modes(modes:Parsetree.modes)=List.map(fun(m:Parsetree.modeLocation.loc)->let(Parsetree.Modes)=m.txtins)modesletrecread_parsetree_core_type(ct:Parsetree.core_type)=letopenTypeExprinmatchct.ptyp_descwith|Ptyp_var(s,_)-> Vars|Ptyp_any_->Any|Ptyp_constr(lid,args)->Constr(read_longident_typelid.txt,List.mapread_parsetree_core_typeargs)|Ptyp_class(lid,args)->Class(read_longident_class_typelid.txt,List.mapread_parsetree_core_typeargs)|Ptyp_tuplets->Tuple(List.map(fun(lbl,t)->(lbl,read_parsetree_core_typet))ts)|Ptyp_unboxed_tuplets->Unboxed_tuple (List.map(fun(lbl,t)->(lbl,read_parsetree_core_typet))ts)|Ptyp_arrow(lbl,arg,res,arg_modes,res_modes)->letlbl=matchlblwith|Asttypes.Nolabel->None|Asttypes.Labelleds->Some(Labels)|Asttypes.Optionals->Some (Optionals)inArrow(lbl,(read_parsetree_core_typearg,read_parsetree_modesarg_modes),(read_parsetree_core_type res,read_parsetree_modesres_modes))|Ptyp_variant(fields,closed,labels)->letopenTypeExpr.Polymorphic_variantinletelements=List.map(fun(field:Parsetree.row_field)->matchfield.prf_descwith|Rtag(name,constant,args)->Constructor{name=name.txt;constant;arguments=List.mapread_parsetree_core_typeargs;doc={Odoc_model.Comment.elements=[];warnings_tag =None};}|Rinheritct->Type(read_parsetree_core_typect))fieldsinletkind =match(closed,labels)with|Asttypes.Open,_->Open|Asttypes.Closed,None->Fixed|Asttypes.Closed,Somels->ClosedlsinPolymorphic_variant{kind;elements}|Ptyp_object(fields,closed)->letopenTypeExpr.Objectinletfields=List.map(fun(field:Parsetree.object_field)->matchfield.pof_descwith|Otag(name,ct)->Method{name=name.txt;type_=read_parsetree_core_typect}|Oinheritct->Inherit(read_parsetree_core_typect))fieldsinObject {fields;open_=(closed=Asttypes.Open)}|Ptyp_alias (ct,None,_)->read_parsetree_core_typect|Ptyp_alias(ct,Somename,_)->Alias (read_parsetree_core_typect,name.txt)|Ptyp_poly(vars,ct)->letvars=List.map(fun(name,jk)->letkind=matchjkwithNone->Kind.Default|Somejk->read_jkind_annotationjkin(name.txt,kind))varsinPoly(vars,read_parsetree_core_typect)|Ptyp_package(lid,substs)->letpath=read_longident_module_typelid.txtinlet substitutions=List.map(fun(frag,ct)->(Env.Fragment.read_typefrag.txt,read_parsetree_core_typect))substsinPackage{path;substitutions}|Ptyp_quotect->Quote(read_parsetree_core_typect)|Ptyp_splice ct->Splice(read_parsetree_core_typect)(* TODO: no good representation available atm *)|Ptyp_of_kind_|Ptyp_repr_|Ptyp_extension_->Any|Ptyp_open(_,ct)->read_parsetree_core_typect|Ptyp_newlayout(_,ct)->(* layout-variable binder; odoc currently ignores the layout vars *)read_parsetree_core_typectandread_jkind_annotation(jk:Parsetree.jkind_annotation)=letopen Kindinmatchjk.pjka_descwith|Pjk_default->Default|Pjk_abbreviation(s,_)->Abbreviation(Env.Fragment.read_types.txt)|Pjk_mod(jk',modes)->Mod(read_jkind_annotation jk',read_parsetree_modes modes)|Pjk_with (jk',cty,modalities)->letty=read_parsetree_core_typectyinletmodalities=List.map(fun(m:Parsetree.modality Location.loc)->let(Parsetree.Modalitys)=m.txtins)modalitiesinWith(read_jkind_annotation jk',ty,modalities)|Pjk_kind_ofcty->Kind_of(read_parsetree_core_typecty)|Pjk_productjks->Product(List.mapread_jkind_annotationjks)letread_jkind_annotation =function|None->Kind.Default|Somejk->matchread_jkind_annotation jkwith|Abbreviation(`Dot(`Root,"value"))->Default|k->klet jkind_of_type_descte=matchtewith|Tvar{jkind;_}|Tunivar{jkind;_}->read_jkind_annotationjkind.annotation|_->Kind.Defaultletread_modalitiesmutmodalities =Typemode.least_modalities ~include_implied:false ~mutmodalities|>Typemode.sort_dedup_modalities|>List.map(fun(Mode.Modality.Atom(ax,m))->Format_doc.asprintf"%a"(Mode.Modality.Per_axis.printax)m)letread_value_modalitiesmodalities=letconst=Ctype.zap_modalities_to_floor_if_modes_enabled_atAlphamodalitiesinread_modalities Immutableconstletread_value_descr_modalitiesvd=read_value_modalitiesvd.val_modalitiesletread_label_modalitiesld=read_modalitiesld.ld_mutableld.ld_modalitiesletread_constructor_argumentarg=arg.ca_type,read_modalitiesImmutablearg.ca_modalitieslettree_of_modes(modes:Mode.Alloc.Const.t):stringlist=(* Same as the OxCaml's [tree_of_modes]: axes whose value is legacy
or is implied by another axis are suppressed. *)letforkable=matchmodes.areality,modes.forkablewith|Local,Unforkable|Global,Forkable->None|_,_->Somemodes.forkableinletyielding=matchmodes.areality,modes.yielding with|Local,Yielding|Global,Unyielding->None|_,_->Somemodes.yieldinginletcontention=matchmodes.visibility,modes.contentionwith|Immutable,Contended|Read,Shared|Read_write,Uncontended->None|_,_->Somemodes.contentioninletportability=matchmodes.statefulness,modes.portabilitywith|Stateless,Portable|Stateful,Nonportable->None|_,_->Somemodes.portabilityinlet{Mode.Alloc.areality;linearity;uniqueness;portability=_;contention=_;forkable=_;yielding=_;statefulness;visibility;staticity}=Mode.Alloc.Const.diffmodesMode.Alloc.Const.legacyinletprint_optprinta=Option.map(Format_doc.asprintf"%a"print)ainList.filter_map(funx->x)[print_opt Mode.Locality.Const.printareality;print_optMode.Uniqueness.Const.printuniqueness;print_optMode.Linearity.Const.printlinearity;print_optMode.Portability.Const.printportability;print_optMode.Contention.Const.printcontention;print_opt Mode.Forkable.Const.printforkable;print_optMode.Yielding.Const.printyielding;print_optMode.Statefulness.Const.printstatefulness;print_optMode.Visibility.Const.printvisibility;print_optMode.Staticity.Const.printstaticity]letread_alloc_modesm=tree_of_modes(Mode.Alloc.zap_to_legacym)typemodes=Mode.Alloc.Const.tletlegacy_modes=Mode.Alloc.Const.legacyletcurried_accmodesarg_mode=Ctype.curry_modemodes(Mode.Alloc.zap_to_legacyarg_mode)letmode_is_impliedimplied_modesres_mode=letsnap=Btype.snapshot()inletimplied=matchMode.Alloc.equate(Mode.Alloc.of_constimplied_modes)res_modewith|Ok()->true|Error_->falseinBtype.backtrack snap;impliedletread_arrow_modesimplied_modestyp=matchCompat.get_desctypwith|Tarrow((_,arg_mode,res_mode),_,res,_)->letarg_modes=read_alloc_modesarg_modeinletimplied_modes=curried_accimplied_modesarg_mode inletres_is_arrow =matchCompat.get_descreswith|Tarrow_->not(is_aliased(proxyres))|_->falseinletres_modes=ifres_is_arrow&&mode_is_impliedimplied_modesres_modethen []elseread_alloc_modes res_modein(arg_modes,res_modes,implied_modes)|_->([],[],implied_modes)#elseletjkind_of_type_desc_te=Kind.Defaultletread_value_descr_modalities_vd=[]letread_label_modalities_ld=[]letread_constructor_argumentarg=arg,[]typemodes=unitletlegacy_modes:modes=()letread_arrow_modes(implied_modes:modes)_typ=([],[],implied_modes)#endifletrecread_type_exprenvtyp=read_type_expr_modalenvlegacy_modestypandread_type_expr_modalenvimplied_modestyp=letopenTypeExprinletpx=proxytypinifused_aliaspxthenVar(name_of_type typ)elsebeginlet alias=ifnot(is_aliasedpx&&aliasabletyp)thenNoneelsebeginuse_aliaspx;Some(name_of_typetyp)endinlettyp=matchCompat.get_desctypwith|Tvar_->letname=name_of_typetypinifname="_" thenAnyelseVar name#ifdefined OXCAML|Tarrow((lbl,_,_),arg,res,_)->#else|Tarrow(lbl,arg,res,_)->#endifletlbl=read_label lblinletlbl,arg=matchlblwith|Some(Optionals)->(matchCompat.get_desc(strip_trivial_polyarg)with|Tconstr(_option,[arg],_)->lbl,read_type_exprenvarg(* Unwrap option if possible *)|_->(Some(RawOptionals),read_type_exprenvarg))(* If not, mark is as wrapped *)|_->lbl,read_type_expr envarginletarg_modes,res_modes,modes =read_arrow_modesimplied_modestypinletres=read_type_expr_modalenvimplied_modesresinArrow(lbl,(arg,arg_modes),(res,res_modes))|Ttupletyps->#ifOCAML_VERSION>=(5,4,0)||definedOXCAMLlettyps=List.map(fun(lbl,x)->lbl,read_type_exprenvx)typsin#elselettyps=List.map(funx->None,read_type_exprenvx)typsin#endifTupletyps#ifdefinedOXCAML|Tunboxed_tupletyps->lettyps=List.map(fun(l,t)->l,read_type_exprenvt)typsinUnboxed_tuple typs#endif|Tconstr(p,params,_)->letp=Env.Path.read_typeenv.ident_envpinletparams=List.map(read_type_exprenv)paramsinConstr(p,params)|Tvariantrow->read_rowenvpxrow|Tobject(fi,nm)->read_objectenvfi!nm|Tnil|Tfield_->read_objectenvtypNone|Tpoly (typ,[])->read_type_exprenvtyp|Tpoly(typ,tyl)->lettyl=List.mapCompat.reprtylinletvars_with_kinds=List.map(funty->letname=name_of_type_reprtyinletkind=jkind_of_type_descty.descin(name,kind))tylinlettyp=read_type_expr envtypinremove_namestyl;Poly(vars_with_kinds,typ)|Tunivar_->Var(name_of_typetyp)#if OCAML_VERSION>=(5,5,0)|Tpackage{pack_path=p;pack_constraints }->leteqs=List.filter_map(fun(l,ty)->Option.map(funx->x,ty)(Longident.unflattenl))pack_constraintsin#elifOCAML_VERSION>=(5,4,0)|Tpackage{pack_path=p;pack_cstrs}->leteqs=List.filter_map (fun (l,ty)->Option.map(funx->x,ty)(Longident.unflatten l))pack_cstrsin#elifOCAML_VERSION>=(4,13,0)|Tpackage(p,eqs)->#else|Tpackage(p,frags,tyl)->leteqs=List.combinefragstylin#endifletpackage=read_packageenveqspinPackage package#ifOCAML_VERSION<(4,13,0)|Tsubsttyp->read_type_exprenvtyp#else|Tsubst(typ,_)->read_type_exprenvtyp#endif#ifOCAML_VERSION>=(5,5,0)|Tfunctor(lbl,id,pkg,ret_type)->letlbl=read_labellblinletparent=Identifier.fresh_module_arg_parent()inletid=Ocaml_ident.of_unscopedidinlete',id=Env.add_module_argparentid(ModuleName.hidden_of_identid)env.ident_envinletenv={envwithident_env=e'}inletret=read_type_exprenvret_typeinleteqs=List.filter_map(fun(l,ty)->Option.map(funx->x,ty)(Longident.unflattenl))pkg.pack_constraintsinletpackage=read_packageenveqspkg.pack_pathinArrow_functor(lbl,{id;package},ret)#endif|Tlink _->assertfalse#ifOCAML_VERSION >=(5,6,0)(* [Compat.get_desc] walks past[Texpand] just as it does [Tlink]. *)|Texpand_->assert false#endif#ifdefinedOXCAML|Tquotetyp->Quote(read_type_exprenvtyp)|Tquote_eval typ->Quote(read_type_exprenvtyp)|Tsplice typ->Splice(read_type_exprenvtyp)|Tof_kind _->assertfalse|Trepr_->Any(* oxcaml: representation annotations are ignored *)#endifinmatchaliaswith|None->typ|Somename->Alias(typ,name)endandread_packageenveqsp=letopenTypeExprinletopenTypeExpr.Packageinletpath=Env.Path.read_module_typeenv.ident_envpinletsubstitutions=List.map(fun(frag,typ)->letfrag=Env.Fragment.read_typefraginlettyp=read_type_exprenvtypin(frag,typ))eqsin{path;substitutions}andread_rowenv_pxrow=let openTypeExprinletopenTypeExpr.Polymorphic_variantinletrow=Compat.row_reprrowinletfields=ifCompat.row_closedrowthenList.filter(fun(_,f)->Compat.row_field_reprf<>Rabsent)(Compat.row_fields row)elseCompat.row_fieldsrowinletsorted_fields=List.sort(fun(p,_)(q,_)->comparepq)fieldsinletpresent=List.filter(fun(_,f)->matchCompat.row_field_reprfwith|Rpresent_->true|_->false)sorted_fieldsinletall_present =List.lengthpresent=List.lengthsorted_fieldsinmatchCompat.get_row_namerowwith|Some(p,params)whennamable_rowrow->letp=Env.Path.read_typeenv.ident_envpinletparams=List.map(read_type_exprenv)paramsinifCompat.row_closedrow&& all_presentthenConstr(p,params)elseletkind=ifall_present thenOpenelseClosed(List.mapfstpresent)inPolymorphic_variant{kind;elements=[Type(Constr(p,params))]}|_->letelements=List.map(fun(name,f)->letdoc=empty_docenvinmatchCompat.row_field_reprfwith|RpresentNone->Constructor{name;constant=true;arguments=[];doc}|Rpresent(Sometyp)->Constructor{name;constant=false;arguments=[read_type_exprenvtyp];doc;}#ifOCAML_VERSION >=(4,14,0)|Reither(constant,typs,_)->#else|Reither(constant,typs,_,_)->#endifletarguments=List.map(read_type_exprenv)typsinConstructor{name;constant;arguments;doc}|Rabsent->assertfalse)sorted_fieldsinletkind=ifall_presentthenifCompat.row_closedrowthenFixedelseOpenelseClosed(List.mapfstpresent)inPolymorphic_variant{kind;elements}andread_objectenvfinm=letopenTypeExprinletopen TypeExpr.Objectinletpx=proxyfiinifused_aliaspxthenVar(name_of_typefi)elsebeginuse_aliaspx;matchnmwith|None->let(fields,rest)=Ctype.flatten_fieldsfiinletpresent_fields=List.fold_right(fun(n,k,t)l->matchCompat.field_kind_reprkwith|fwhenf=Compat.field_public->(n,t)::l|_->l)fields []inletsorted_fields=List.sort(fun(n,_)(n',_)->comparenn')present_fieldsinletmethods=List.map(fun(name,typ)->Method{name;type_=read_type_exprenvtyp})sorted_fieldsinlet open_=matchCompat.get_descrestwith|Tvar_|Tunivar_->true|Tconstr_->true|Tnil->false|_->assert falseinObject {fields=methods;open_}|Some(p,_::params)->letp=Env.Path.read_class_typeenv.ident_envpinletparams=List.map(read_type_exprenv)paramsinClass(p,params)|_->assertfalseendlet read_value_description({ident_env;warnings_tag}asenv)parentidvd=letopenSignatureinletid=Env.find_value_identifier ident_envidinlet source_loc =Noneinletcontainer =(parent :Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tagcontainervd.val_attributesinmark_value_descriptionvd;lettype_=read_type_exprenvvd.val_type inletvalue=matchvd.val_kindwith#ifdefinedOXCAML|Val_reg _->Value.Abstract#else|Val_reg->Value.Abstract#endif|Val_prim desc->letprimitives=letopenPrimitive indesc.prim_name::(matchdesc.prim_native_namewith""->[]|name->[name])inExternalprimitives|_->assertfalseinletext_attrs=Doc_attr.attrs_of_value_descriptionvdinletmodalities=read_value_descr_modalities vd inValue{Value.id;source_loc;doc;type_;value;ext_attrs;modalities}#ifdefinedOXCAMLletis_mutable=Types.is_mutable#elseletis_mutableld=ld=Mutable#endifletread_label_declarationenvparentld=letopenTypeDecl.Fieldinletname=Ident.nameld.ld_idinletid=Identifier.Mk.field(parent,Odoc_model.Names.FieldName.make_stdname)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tag(parent:>Identifier.LabelParent.t)ld.ld_attributesinletmutable_=is_mutableld.ld_mutableinlettype_=read_type_exprenvld.ld_typeinletmodalities=read_label_modalitiesldin{id;doc;mutable_;type_;modalities}letread_constructor_declaration_argumentsenvparentarg=letopenTypeDecl.Constructorinmatchargwith|Cstr_tupleargs->letargs_with_modalities=List.map(funarg->letarg_type,arg_modalities=read_constructor_argumentarginread_type_expr envarg_type,arg_modalities)argsinTupleargs_with_modalities|Cstr_recordlds->Record (List.map(read_label_declarationenvparent)lds)letread_constructor_declarationenvparentcd=letopenTypeDecl.Constructorinletid=Ident_env.find_constructor_identifierenv.ident_envcd.cd_idinletcontainer=(parent:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainer cd.cd_attributesinletargs =read_constructor_declaration_arguments env(parent:>Identifier.FieldParent.t)cd.cd_argsinletres=opt_map(read_type_exprenv)cd.cd_resin{id;doc;args;res}letread_type_kindenvparent=letopenTypeDecl.Representation infunction#ifOCAML_VERSION>=(5,2,0)|Type_abstract _->#else|Type_abstract->#endifNone#ifdefinedOXCAML|Type_variant(cstrs,_,_)->#elifOCAML_VERSION>=(4,13,0)|Type_variant(cstrs,_)->#else|Type_variantcstrs->#endifletcstrs=List.map(read_constructor_declarationenvparent)cstrsinSome(Variantcstrs)#ifdefined OXCAML|Type_record_unboxed_product(lbls,_,_)->letlbls=List.map(read_label_declarationenv(parent:>Identifier.FieldParent.t))lblsinSome(Record lbls)|Type_record(lbls,_,_)->#else|Type_record(lbls,_)->#endiflet lbls=List.map(read_label_declaration env(parent:>Identifier.FieldParent.t))lblsinSome(Recordlbls)|Type_open->SomeExtensible#ifOCAML_VERSION>=(5,5,0)|Type_external_->None#endiflet read_injectivityvar=#ifOCAML_VERSION<(5,1,0)let_,_,_,inj=Variance.get_lower varin#elselet_,_,inj=Variance.get_lowervarin#endifinjletread_type_parameterabstrvarparam=letopenTypeDeclinletname=name_of_typeparaminletdesc=ifname="_"thenAnyelseVarnameinletkind=jkind_of_type_desc(Compat.get_desc param)inletvariance=ifnot(abstr||aliasable param)thenNoneelsebeginletco,cn=Variance.get_uppervarinifnotcnthenSomePoselse ifnotcothenSomeNegelseNoneendinlet injectivity=read_injectivityvarin{desc;variance;injectivity;kind}letread_type_constraintsenv params=List.fold_right(funtyp1acc->lettyp2=Ctype.unaliastyp1inifBtype.proxy typ1!=Btype.proxytyp2thenlettyp1=read_type_exprenvtyp1inlettyp2=read_type_exprenvtyp2in(typ1,typ2)::accelse acc)params[]let read_class_constraintsenvparams=letopenClassSignatureinread_type_constraints envparams|>List.map(fun(left,right)->Constraint{Constraint.left;right;doc=empty_doc env})letread_type_declarationenvparentiddecl=letopenTypeDeclinletid=Env.find_type_identifierenv.ident_envidinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonicalcontainerdecl.type_attributesinletcanonical=matchcanonicalwith|None->None|Somes->Doc_attr.conv_canonical_typesinletparams=mark_type_declarationdeclinletmanifest=opt_map(read_type_exprenv)decl.type_manifestinletconstraints=read_type_constraintsenvparamsinletrepresentation =read_type_kindenv(id:>Identifier.DataType.t)decl.type_kindinletabstr=matchdecl.type_kindwith#ifOCAML_VERSION>=(5,2,0)|Type_abstract_->#else|Type_abstract->#endifdecl.type_manifest=None||decl.type_private=Private|Type_record_->decl.type_private=Private#ifdefined OXCAML|Type_record_unboxed_product_->decl.type_private=Private#endif#ifdefinedOXCAML|Type_variant (tll,_,_)->#elifOCAML_VERSION>=(4,13,0)|Type_variant(tll,_)->#else|Type_varianttll ->#endifdecl.type_private=Private||List.exists(funcd->cd.cd_res <>None)tll|Type_open->decl.type_manifest=None#ifOCAML_VERSION>=(5,5,0)|Type_external_->decl.type_manifest=None||decl.type_private=Private#endifinletparams=List.map2(read_type_parameterabstr)decl.type_varianceparamsinletprivate_=(decl.type_private=Private)inletkind=#ifdefinedOXCAMLread_jkind_annotationdecl.type_jkind.annotation#elseKind.Default#endifinlet equation=Equation.{params;manifest;constraints;private_;kind}in{id;source_loc;doc;canonical;equation;representation}letread_extension_constructorenvparentidext=letopenExtension.Constructorinletid=Env.find_extension_identifier env.ident_envidinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainerext.ext_attributesinletargs=read_constructor_declaration_arguments env(parent:Identifier.Signature.t:>Identifier.FieldParent.t)ext.ext_argsinletres=opt_map(read_type_exprenv)ext.ext_ret_typein{id;source_loc;doc;args;res}letread_type_extensionenvparentidextrest=letopenExtensioninlettype_path=Env.Path.read_typeenv.ident_env ext.ext_type_pathinletdoc=Doc_attr.emptyenv.warnings_taginlettype_params=mark_type_extension'extrestinletfirst=read_extension_constructorenvparentidextinletrest=List.map(fun(id,ext)->read_extension_constructorenvparentidext)restinletconstructors=first::restinlettype_params=List.map(read_type_parameterfalseVariance.null)type_paramsinletprivate_=(ext.ext_private=Private)in{parent;type_path;type_params;doc;private_;constructors;}letread_exception envparentidext=letopenExceptioninletid=Env.find_exception_identifierenv.ident_envidinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inlet doc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainerext.ext_attributesinmark_exceptionext;letargs=read_constructor_declaration_argumentsenv(parent:Identifier.Signature.t:>Identifier.FieldParent.t)ext.ext_argsinletres=opt_map(read_type_exprenv)ext.ext_ret_typein{id;source_loc;doc;args;res}letread_methodenvparentconcrete(name,kind,typ)=let openMethodinlet id =Identifier.Mk.method_(parent,Odoc_model.Names.MethodName.make_stdname)inlet doc=Doc_attr.emptyenv.warnings_taginletprivate_=(Compat.field_kind_reprkind)<>Compat.field_publicinlet virtual_=not(Compat.concr_memnameconcrete)inlettype_=read_type_exprenvtypinClassSignature.Method{id;doc;private_;virtual_;type_}letread_instance_variable envparent(name,mutable_,virtual_,typ)=letopenInstanceVariableinletid=Identifier.Mk.instance_variable(parent,Odoc_model.Names.InstanceVariableName.make_stdname)inletdoc=Doc_attr.emptyenv.warnings_taginletmutable_=(mutable_=Asttypes.Mutable)inletvirtual_=(virtual_=Virtual)inlettype_=read_type_exprenvtypinClassSignature.InstanceVariable{id;doc;mutable_;virtual_;type_}letread_self_type sty=letpx=proxystyinifnot(is_aliasedpx)thenNoneelseSome(TypeExpr.Var(name_of_type_reprpx))letrecread_class_signatureenvparentparams=letopenClassTypeinfunction|Cty_constr(p,_,cty)->ifis_row_visited(proxy(Compat.self_typecty))||List.existsaliasableparamsthenread_class_signatureenvparentparamsctyelsebeginletp=Env.Path.read_class_typeenv.ident_envpinletparams=List.map(read_type_exprenv)paramsinConstr(p,params)end|Cty_signaturecsig->letopenClassSignatureinletself=read_self_typecsig.csig_selfinletconstraints=read_class_constraintsenvparamsinletinstance_variables=Vars.fold(funname(mutable_,virtual_,typ)acc->(name,mutable_,virtual_,typ)::acc)csig.csig_vars[]inletmethods,_=Ctype.flatten_fields(Ctype.object_fieldscsig.csig_self)inletmethods=List.filter(fun(name,_,_)->name<>Btype.dummy_method)methodsinletinstance_variables=List.map(read_instance_variableenvparent)instance_variablesinletmethods=List.map(read_methodenvparent(Compat.csig_concrcsig))methodsinletitems=constraints@instance_variables@methods inSignature{self;items;doc=empty_docenv}|Cty_arrow_->assertfalseletrecread_virtual=function|Cty_constr(_,_,cty)|Cty_arrow(_,_,cty)->read_virtualcty|Cty_signaturecsig->letmethods,_=Ctype.flatten_fields (Ctype.object_fieldscsig.csig_self)inletvirtual_method=List.exists(fun(name,_,_)->not(name=Btype.dummy_method||Compat.concr_memname(Compat.csig_concrcsig)))methodsinletvirtual_instance_variable=Vars.exists(fun _(_,virtual_,_)->virtual_=Virtual)csig.csig_varsinvirtual_method ||virtual_instance_variableletread_class_type_declarationenvparentidcltd=letopenClassTypeinletid=Env.find_class_type_identifierenv.ident_envidinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tag containercltd.clty_attributesinmark_class_type_declaration cltd;letparams=List.map2(read_type_parameterfalse)cltd.clty_variancecltd.clty_paramsinletexpr=read_class_signatureenv(id:>Identifier.ClassSignature.t)cltd.clty_paramscltd.clty_typeinlet virtual_=read_virtualcltd.clty_typein{id;source_loc;doc;virtual_;params;expr;expansion=None}letrecread_class_typeenvparentparams=letopenClassinfunction|Cty_constr_|Cty_signature_ascty->ClassType(read_class_signatureenvparentparamscty)|Cty_arrow(lbl,arg,cty)->letlbl=read_labellblinletlbl,arg=matchlblwith|Some(Optional s)->(matchCompat.get_desc(strip_trivial_poly arg)with|Tconstr(_option,[arg],_)->lbl,read_type_exprenvarg(* Unwrap option if possible *)|_->(Some(RawOptionals),read_type_exprenvarg))(* If not, mark is as wrapped *)|_->lbl,read_type_exprenvarginletcty=read_class_typeenvparentparamsctyinArrow(lbl,arg,cty)letread_class_declaration envparentidcld=letopenClassinletid=Env.find_class_identifierenv.ident_envidinletsource_loc=Noneinletcontainer=(parent :Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainercld.cty_attributesinmark_class_declarationcld;letparams=List.map2(read_type_parameterfalse)cld.cty_variancecld.cty_paramsinlettype_=read_class_type env(id:>Identifier.ClassSignature.t)cld.cty_paramscld.cty_typeinletvirtual_=cld.cty_new=Nonein{id;source_loc;doc;virtual_;params;type_;expansion=None}letrecread_module_typeenvparent(mty:Odoc_model.Compat.module_type)=letopenModuleTypeinmatchmtywith|Mty_identp->Path{p_path=Env.Path.read_module_type env.ident_envp;p_expansion=None}|Mty_signature sg->Signature(read_signatureenvparentsg)|Mty_functor(parameter,res)->letf_parameter,env=matchparameterwith|Unit->Odoc_model.Lang.FunctorParameter.Unit,env|Named (id_opt,arg)->letid,env=matchid_optwith|None ->Identifier.Mk.parameter(parent,Odoc_model.Names.ModuleName.make_std"_"),env|Someid->lete'=Env.add_parameterparentid(ModuleName.of_identid)env.ident_envinIdent_env.find_parameter_identifier e'id,{envwithident_env=e'}inletarg=read_module_typeenv(id:>Identifier.Signature.t)arginOdoc_model.Lang.FunctorParameter.Named ({FunctorParameter.id;expr=arg}),envinletres=read_module_typeenv(Identifier.Mk.resultparent)resinFunctor(f_parameter,res)|Mty_alias p->lett_original_path=Env.Path.read_moduleenv.ident_envpinlett_desc=ModPath t_original_path inTypeOf {t_desc;t_expansion=None;t_original_path}|Mty_strengthen (mty,p,a)->letmty=read_module_type envparentmtyinlets_path=Env.Path.read_moduleenv.ident_envpinlets_aliasable=matchawith|Aliasable->true|Not_aliasable->falseinmatchOdoc_model.Lang.umty_of_mtymtywith|Somes_expr->Strengthen{s_expr;s_path;s_aliasable;s_expansion=None}|None->failwith"invalid Mty_strengthen"andread_module_type_declarationenvparentid(mtd:Odoc_model.Compat.modtype_declaration)=letopenModuleTypeinletid=Env.find_module_typeenv.ident_envidinletsource_loc=Noneinletcontainer =(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonicalcontainermtd.mtd_attributesinletcanonical=matchcanonicalwith|None->None|Somes->Doc_attr.conv_canonical_module_typesinletexpr=opt_map(read_module_typeenv(id:>Identifier.Signature.t))mtd.mtd_typein{id;source_loc;doc;canonical;expr}andread_module_declaration envparentident(md:Odoc_model.Compat.module_declaration)=letopenModuleinletid=(Env.find_module_identifierenv.ident_envident:>Identifier.Module.t)inletsource_loc=Noneinletcontainer=(parent :Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonicalcontainermd.md_attributesinletcanonical=match canonicalwith|None->None|Somes->Some(Doc_attr.conv_canonical_modules)inlettype_=matchmd.md_typewith|Mty_aliasp->Alias(Env.Path.read_moduleenv.ident_envp,None)|_->ModuleType(read_module_typeenv(id:>Identifier.Signature.t)md.md_type)inlethidden=match canonicalwith|Some_->false|None-> Odoc_model.Names.contains_double_underscore(Ident.nameident)in{id;source_loc;doc;type_;canonical;hidden}andread_type_rec_status rec_status=letopenSignatureinmatchrec_statuswith|Trec_first->Ordinary|Trec_next->And|Trec_not->Nonrecandread_module_rec_status rec_status=letopenSignature inmatchrec_statuswith|Trec_not->Ordinary|Trec_first->Rec|Trec_next->Andandread_signature_noenvenvparent(items:Odoc_model.Compat.signature)=letrecloop(acc,shadowed)items=letopenSignatureinletopenOdoc_model.Compatinletopen Includeinmatchitemswith|Sig_value(id,v,_)::rest->letvd=read_value_description envparent idvinletshadowed=ifEnv.is_shadowedenv.ident_envidthenletidentifier=Env.find_value_identifierenv.ident_envidinmatchidentifierwith|`Value(_,n)->{shadowedwiths_values=(Odoc_model.Names.parenthesise(Ident.nameid),n)::shadowed.s_values}elseshadowedinloop (vd::acc,shadowed)rest|Sig_type(id,_,_,_)::restwhenBtype.is_row_name(Ident.nameid)->loop(acc,shadowed)rest|Sig_type(id,decl,rec_status,_)::rest->let decl=read_type_declarationenvparentiddecl inletshadowed=ifEnv.is_shadowedenv.ident_envidthenletidentifier=Env.find_type_identifierenv.ident_envidinlet`Type(_,name)=identifierin{shadowedwiths_types=(Ident.nameid,name)::shadowed.s_types}elseshadowedinloop (Type(read_type_rec_statusrec_status,decl)::acc,shadowed)rest|Sig_typext(id,ext,Text_first,_)::rest->letrecinner_loopinner_acc=function|Sig_typext(id,ext,Text_next,_)::rest->inner_loop((id,ext)::inner_acc)rest|rest->letext=read_type_extensionenvparentidext(List.revinner_acc)inloop(TypExtext::acc,shadowed)restininner_loop[]rest|Sig_typext(id,ext,Text_next,_)::rest->letext=read_type_extensionenvparentidext[]inloop(TypExtext::acc,shadowed)rest|Sig_typext(id,ext,Text_exception,_)::rest->letexn=read_exceptionenvparentidextinloop(Exceptionexn::acc,shadowed)rest|Sig_module(id,_,md,rec_status,_)::rest->letmd=read_module_declarationenvparentidmdinletshadowed=ifEnv.is_shadowedenv.ident_envidthenletidentifier=Env.find_module_identifierenv.ident_envidinletname=matchidentifierwith|`Module(_,n)->n|`Parameter(_,n)->n|`Root(_,n)->nin{shadowedwiths_modules=(Ident.nameid,name)::shadowed.s_modules}elseshadowedinloop(Module(read_module_rec_statusrec_status,md)::acc,shadowed)rest|Sig_modtype(id,mtd,_)::rest->letmtd=read_module_type_declarationenvparentidmtdinletshadowed=ifEnv.is_shadowedenv.ident_envidthenletidentifier=Env.find_module_typeenv.ident_envidinletname=matchidentifierwith|`ModuleType(_,n)->nin{shadowedwiths_module_types=(Ident.nameid,name)::shadowed.s_module_types}elseshadowedinloop(ModuleTypemtd::acc,shadowed)rest#ifOCAML_VERSION<(5,1,0)|Sig_class(id,cl,rec_status,_)::Sig_class_type_::Sig_type_::Sig_type_::rest->#else|Sig_class(id,cl,rec_status,_)::Sig_class_type_::Sig_type_::rest->#endifletcl=read_class_declarationenvparentidclinletshadowed=ifEnv.is_shadowedenv.ident_envidthenletidentifier=Env.find_class_identifierenv.ident_envidinletname=matchidentifierwith|`Class(_,n)->nin{shadowedwiths_classes=(Ident.nameid,name)::shadowed.s_classes}elseshadowedinloop(Class(read_type_rec_statusrec_status,cl)::acc,shadowed)rest#ifOCAML_VERSION<(5,1,0)|Sig_class_type(id,cltyp,rec_status,_)::Sig_type_::Sig_type_::rest->#else|Sig_class_type(id,cltyp,rec_status,_)::Sig_type_::rest->#endifletcltyp=read_class_type_declarationenvparentidcltypinletshadowed=ifEnv.is_shadowedenv.ident_envidthenletidentifier=Env.find_class_type_identifierenv.ident_envidinletname=matchidentifierwith|`ClassType(_,n)->nin{shadowedwiths_class_types=(Ident.nameid,name)::shadowed.s_class_types}elseshadowedinloop(ClassType(read_type_rec_statusrec_status,cltyp)::acc,shadowed)rest(* Skip all of the hidden sig items *)(* Bad - we expect Sig_class and Sig_class_type to be matched above
with subsequent Sig_type items *)|Sig_class_type_::_|Sig_class_::_->assertfalse|[]->({items=List.revacc;compiled=false;removed=[];doc=empty_docenv},shadowed)inloop([],{s_modules=[];s_module_types=[];s_values=[];s_types=[];s_classes=[];s_class_types=[]})itemsandread_signatureenvparent(items:Odoc_model.Compat.signature)=lete'=Env.handle_signature_type_itemsparentitemsenv.ident_envinletenv={envwithident_env=e'}infst@@read_signature_noenvenvparentitemsletread_interfacerootname~warnings_tagintf=letid=Identifier.Mk.root(root,Odoc_model.Names.ModuleName.make_stdname)inletitems=read_signature{ident_env=Env.empty();warnings_tag}idintfin(id,items)