12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082(*
* 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.PathsmoduleCompat=struct#ifOCAML_VERSION>=(4,14,0)letget_desc=Types.get_descletget_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.Fpublicletreprx=xletself_type=Btype.self_typeletcsig_selfx=x.Types.csig_selfletrow_reprx=xletconcr_mem=Types.Meths.memletcsig_concrx=x.Types.csig_meths#elseletget_descx=x.Types.descletget_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.Fpresentletrepr=Btype.reprletself_type=Ctype.self_typeletcsig_selfx=Btype.reprx.Types.csig_selfletrow_repr=Btype.row_reprletconcr_mem=Types.Concr.memletcsig_concrx=x.Types.csig_concr#endifendletopt_mapf=function|None->None|Somex->Some(fx)letopt_iterf=function|None->()|Somex->fxletread_labellbl=letopenTypeExprin#ifOCAML_VERSION<(4,3,0)(* NOTE(@ostera): 4.02 does not have an Asttypes variant for whether the
* label exists, and is an optional label or not, so I went back to string
* manipulation *)ifString.lengthlbl==0thenNoneelsematchString.getlbl0with|'?'->Some(Optional(String.sublbl1(String.lengthlbl-1)))|_->Some(Labellbl)#elsematchlblwith|Asttypes.Nolabel->None|Asttypes.Labelleds->Some(Labels)|Asttypes.Optionals->Some(Optionals)#endif(* Handle type variable names *)letused_names=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(ty:Types.type_expr)=tryList.assqty!used_nameswithNot_found->letbase=matchCompat.get_desctywith|Tvar(Somename)|Tunivar(Somename)->name|_->next_name()inletname=fresh_namebaseinifname<>"_"thenused_names:=(ty,name)::!used_names;nameletremove_namestyl=used_names:=List.filter(fun(ty,_)->not(List.memqtytyl))!used_names(* Handle recursive types and shared row variables *)letaliased=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_aliasty=letpx=Btype.proxytyinifnot(List.memqpx!aliased)thenbeginaliased:=px::!aliased;matchCompat.get_descpxwith|Tvarname|Tunivarname->reserve_namename|_->()endletused_alias(px:Types.type_expr)=List.memqpx!used_aliasesletuse_alias(px:Types.type_expr)=used_aliases:=px::!used_aliasesletvisited_rows=ref[]letreset_visited_rows()=visited_rows:=[]letis_row_visitedpx=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)letmark_typety=letrecloopvisitedty=letty=Compat.reprtyinletpx=Btype.proxytyinifList.memqpxvisited&&aliasabletythenadd_aliaspxelseletvisited=px::visitedinmatchCompat.get_desctywith|Tvarname->reserve_namename|Tarrow(_,ty1,ty2,_)->loopvisitedty1;loopvisitedty2|Ttupletyl->List.iter(loopvisited)tyl|Tconstr(_,tyl,_)->List.iter(loopvisited)tyl|Tvariantrow->ifis_row_visitedpxthenadd_aliaspxelsebeginifnot(Compat.static_row_reprrow)thenvisit_rowpx;matchCompat.get_row_namerowwith|Some(_,tyl)whennamable_rowrow->List.iter(loopvisited)tyl|_->Btype.iter_row(loopvisited)rowend|Tobject(fi,nm)->ifis_row_visitedpxthenadd_aliaspxelsebeginvisit_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)->loopvisitedty2|Tnil->()|Tpoly(ty,tyl)->List.iter(funt->add_aliast)tyl;loopvisitedty|Tunivarname->reserve_namename#ifOCAML_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,_)->loopvisitedty#endif|Tlink_->assertfalseinloop[]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=add_aliasparam;mark_typeparam;ifaliasableparamthenuse_alias(Btype.proxyparam)#ifOCAML_VERSION<(4,13,0)lettsubstx=Tsubstxlettvar_nonety=ty.desc<-TvarNone#elifOCAML_VERSION<(4,14,0)lettsubstx=Tsubst(x,None)lettvar_nonety=Types.Private_type_expr.set_descty(TvarNone)#elselettsubstx=Tsubst(x,None)lettvar_nonety=Types.Transient_expr.(set_desc(coercety)(TvarNone))#endifletprepare_type_parametersparamsmanifest=letparams=List.fold_left(funparamsparam->letparam=Compat.reprparaminifList.memqparamparamsthenBtype.newgenty(tsubstparam)::paramselseparam::params)[]paramsinletparams=List.revparamsinbeginmatchmanifestwith|Somety->letvars=Ctype.free_variablestyinList.iter(funty->matchCompat.get_desctywith|Tvar(Some"_")->ifList.memqtyvarsthentvar_nonety|_->())params|None->()end;params(* NOTE(@ostera): constructor with inlined records were introduced post 4.02 *)letmark_constructor_args=#ifOCAML_VERSION<(4,3,0)List.itermark_type#elsefunction|Cstr_tupleargs->List.itermark_typeargs|Cstr_recordlds->List.iter(funld->mark_typeld.ld_type)lds#endifletmark_type_kind=function|Type_abstract->()#ifOCAML_VERSION>=(4,13,0)|Type_variant(cds,_)->#else|Type_variantcds->#endifList.iter(funcd->mark_constructor_argscd.cd_args;opt_itermark_typecd.cd_res)cds|Type_record(lds,_)->List.iter(funld->mark_typeld.ld_type)lds|Type_open->()letmark_type_declarationdecl=letparams=prepare_type_parametersdecl.type_paramsdecl.type_manifestinreset_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_extensiontype_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(Btype.proxysty)||List.existsaliasableparams||List.exists(Ctype.deep_occursty)tylthenmark_class_typeparamsctyelseList.itermark_typetyl|Cty_signaturesign->letsty=Compat.csig_selfsigninletpx=Btype.proxystyinifis_row_visitedpxthenadd_aliasstyelsevisit_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_aliasedsty&&aliasablestythenuse_aliaspx|Cty_arrow(_,ty,cty)->mark_typety;mark_class_typeparamsctyletmark_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_typeletrecread_type_exprenvtyp=letopenTypeExprinlettyp=Compat.reprtypinletpx=Btype.proxytypinifused_aliaspxthenVar(name_of_typetyp)elsebeginletalias=ifnot(is_aliasedpx&&aliasabletyp)thenNoneelsebeginuse_aliaspx;Some(name_of_typetyp)endinlettyp=matchCompat.get_desctypwith|Tvar_->letname=name_of_typetypinifname="_"thenAnyelseVarname|Tarrow(lbl,arg,res,_)->letarg=ifBtype.is_optionallblthenmatchCompat.get_desc(Compat.reprarg)with|Tconstr(_option,[arg],_)->read_type_exprenvarg|_->assertfalseelseread_type_exprenvarginletlbl=read_labellblinletres=read_type_exprenvresinArrow(lbl,arg,res)|Ttupletyps->lettyps=List.map(read_type_exprenv)typsinTupletyps|Tconstr(p,params,_)->letp=Env.Path.read_typeenvpinletparams=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=List.mapname_of_typetylinlettyp=read_type_exprenvtypinremove_namestyl;Poly(vars,typ)|Tunivar_->Var(name_of_typetyp)#ifOCAML_VERSION>=(4,13,0)|Tpackage(p,eqs)->#else|Tpackage(p,frags,tyl)->leteqs=List.combinefragstylin#endifletopenTypeExpr.Packageinletpath=Env.Path.read_module_typeenvpinletsubstitutions=List.map(fun(frag,typ)->letfrag=Env.Fragment.read_typefraginlettyp=read_type_exprenvtypin(frag,typ))eqsinPackage{path;substitutions}#ifOCAML_VERSION<(4,13,0)|Tsubsttyp->read_type_exprenvtyp#else|Tsubst(typ,_)->read_type_exprenvtyp#endif|Tlink_->assertfalseinmatchaliaswith|None->typ|Somename->Alias(typ,name)endandread_rowenv_pxrow=letopenTypeExprinletopenTypeExpr.Polymorphic_variantinletrow=Compat.row_reprrowinletfields=ifCompat.row_closedrowthenList.filter(fun(_,f)->Compat.row_field_reprf<>Rabsent)(Compat.row_fieldsrow)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_typeenvpinletparams=List.map(read_type_exprenv)paramsinifCompat.row_closedrow&&all_presentthenConstr(p,params)elseletkind=ifall_presentthenOpenelseClosed(List.mapfstpresent)inPolymorphic_variant{kind;elements=[Type(Constr(p,params))]}|_->letelements=List.map(fun(name,f)->matchCompat.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=letopenTypeExprinletopenTypeExpr.Objectinletfi=Compat.reprfiinletpx=Btype.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_fieldsinletopen_=matchCompat.get_descrestwith|Tvar_|Tunivar_->true|Tconstr_->true|Tnil->false|_->assertfalseinObject{fields=methods;open_}|Some(p,_::params)->letp=Env.Path.read_class_typeenvpinletparams=List.map(read_type_exprenv)paramsinClass(p,params)|_->assertfalseendletread_value_descriptionenvparentidvd=letopenSignatureinletid=Env.find_value_identifierenvidinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainervd.val_attributesinmark_value_descriptionvd;lettype_=read_type_exprenvvd.val_typeinletvalue=matchvd.val_kindwith|Val_reg->Value.Abstract|Val_primdesc->letprimitives=letopenPrimitiveindesc.prim_name::(matchdesc.prim_native_namewith""->[]|name->[name])inExternalprimitives|_->assertfalseinValue{Value.id;doc;type_;value}letread_label_declarationenvparentld=letopenTypeDecl.Fieldinletname=Ident.nameld.ld_idinletid=`Field(parent,Odoc_model.Names.FieldName.make_stdname)inletdoc=Doc_attr.attached_no_tag(parent:>Identifier.LabelParent.t)ld.ld_attributesinletmutable_=(ld.ld_mutable=Mutable)inlettype_=read_type_exprenvld.ld_typein{id;doc;mutable_;type_}letread_constructor_declaration_argumentsenvparentarg=#ifOCAML_VERSION<(4,3,0)(* NOTE(@ostera): constructor with inlined records were introduced post 4.02
so it's safe to use Tuple here *)ignoreparent;TypeDecl.Constructor.Tuple(List.map(read_type_exprenv)arg)#elseletopenTypeDecl.Constructorinmatchargwith|Cstr_tupleargs->Tuple(List.map(read_type_exprenv)args)|Cstr_recordlds->Record(List.map(read_label_declarationenvparent)lds)#endifletread_constructor_declarationenvparentcd=letopenTypeDecl.Constructorinletname=Ident.namecd.cd_idinletid=`Constructor(parent,Odoc_model.Names.ConstructorName.make_stdname)inletcontainer=(parent:Identifier.DataType.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainercd.cd_attributesinletargs=read_constructor_declaration_argumentsenv(parent:>Identifier.Parent.t)cd.cd_argsinletres=opt_map(read_type_exprenv)cd.cd_resin{id;doc;args;res}letread_type_kindenvparent=letopenTypeDecl.Representationinfunction|Type_abstract->None#ifOCAML_VERSION>=(4,13,0)|Type_variant(cstrs,_)->#else|Type_variantcstrs->#endifletcstrs=List.map(read_constructor_declarationenvparent)cstrsinSome(Variantcstrs)|Type_record(lbls,_)->letlbls=List.map(read_label_declarationenv(parent:>Identifier.Parent.t))lblsinSome(Recordlbls)|Type_open->SomeExtensibleletread_type_parameterabstrvarparam=letopenTypeDeclinletname=name_of_typeparaminletdesc=ifname="_"thenAnyelseVarnameinletvariance=ifnot(abstr||aliasableparam)thenNoneelsebeginletco,cn=Variance.get_uppervarinifnotcnthenSomePoselseifnotcothenSomeNegelseNoneendinletinjectivity=let_,_,_,inj=Variance.get_lowervarininjin{desc;variance;injectivity}letread_type_constraintsenvparams=List.fold_right(funtyp1acc->lettyp2=Ctype.unaliastyp1inifBtype.proxytyp1!=Btype.proxytyp2thenlettyp1=read_type_exprenvtyp1inlettyp2=read_type_exprenvtyp2in(typ1,typ2)::accelseacc)params[]letread_type_declarationenvparentiddecl=letopenTypeDeclinletid=Env.find_type_identifierenvidinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attachedOdoc_model.Semantics.Expect_canonicalcontainerdecl.type_attributesinletcanonical=(canonical:>Path.Type.toption)inletparams=mark_type_declarationdeclinletmanifest=opt_map(read_type_exprenv)decl.type_manifestinletconstraints=read_type_constraintsenvparamsinletrepresentation=read_type_kindenviddecl.type_kindinletabstr=matchdecl.type_kindwithType_abstract->decl.type_manifest=None||decl.type_private=Private|Type_record_->decl.type_private=Private#ifOCAML_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=Noneinletparams=List.map2(read_type_parameterabstr)decl.type_varianceparamsinletprivate_=(decl.type_private=Private)inletequation=Equation.{params;manifest;constraints;private_}in{id;doc;canonical;equation;representation}letread_extension_constructorenvparentidext=letopenExtension.Constructorinletname=Ident.nameidinletid=`Extension(parent,Odoc_model.Names.ExtensionName.make_stdname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainerext.ext_attributesinletargs=read_constructor_declaration_argumentsenv(parent:Identifier.Signature.t:>Identifier.Parent.t)ext.ext_argsinletres=opt_map(read_type_exprenv)ext.ext_ret_typein{id;doc;args;res}letread_type_extensionenvparentidextrest=letopenExtensioninlettype_path=Env.Path.read_typeenvext.ext_type_pathinletdoc=Doc_attr.emptyinlettype_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_exceptionenvparentidext=letopenExceptioninletname=Ident.nameidinletid=`Exception(parent,Odoc_model.Names.ExceptionName.make_stdname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainerext.ext_attributesinmark_exceptionext;letargs=read_constructor_declaration_argumentsenv(parent:Identifier.Signature.t:>Identifier.Parent.t)ext.ext_argsinletres=opt_map(read_type_exprenv)ext.ext_ret_typein{id;doc;args;res}letread_methodenvparentconcrete(name,kind,typ)=letopenMethodinletid=`Method(parent,Odoc_model.Names.MethodName.make_stdname)inletdoc=Doc_attr.emptyinletprivate_=(Compat.field_kind_reprkind)<>Compat.field_publicinletvirtual_=not(Compat.concr_memnameconcrete)inlettype_=read_type_exprenvtypinClassSignature.Method{id;doc;private_;virtual_;type_}letread_instance_variableenvparent(name,mutable_,virtual_,typ)=letopenInstanceVariableinletid=`InstanceVariable(parent,Odoc_model.Names.InstanceVariableName.make_stdname)inletdoc=Doc_attr.emptyinletmutable_=(mutable_=Mutable)inletvirtual_=(virtual_=Virtual)inlettype_=read_type_exprenvtypinClassSignature.InstanceVariable{id;doc;mutable_;virtual_;type_}letread_self_typesty=letsty=Compat.reprstyinifnot(is_aliasedsty)thenNoneelseSome(TypeExpr.Var(name_of_type(Btype.proxysty)))letrecread_class_signatureenvparentparams=letopenClassTypeinfunction|Cty_constr(p,_,cty)->ifis_row_visited(Btype.proxy(Compat.self_typecty))||List.existsaliasableparamsthenread_class_signatureenvparentparamsctyelsebeginletp=Env.Path.read_class_typeenvpinletparams=List.map(read_type_exprenv)paramsinConstr(p,params)end|Cty_signaturecsig->letopenClassSignatureinletself=read_self_typecsig.csig_selfinletconstraints=read_type_constraintsenvparamsinletconstraints=List.map(fun(typ1,typ2)->Constraint(typ1,typ2))constraintsinletinstance_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@methodsinSignature{self;items;doc=[]}|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_identifierenvidinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainercltd.clty_attributesinmark_class_type_declarationcltd;letparams=List.map2(read_type_parameterfalse)cltd.clty_variancecltd.clty_paramsinletexpr=read_class_signatureenv(id:>Identifier.ClassSignature.t)cltd.clty_paramscltd.clty_typeinletvirtual_=read_virtualcltd.clty_typein{id;doc;virtual_;params;expr;expansion=None}letrecread_class_typeenvparentparams=letopenClassinfunction|Cty_constr_|Cty_signature_ascty->ClassType(read_class_signatureenvparentparamscty)|Cty_arrow(lbl,arg,cty)->letarg=ifBtype.is_optionallblthenmatchCompat.get_desc(Compat.reprarg)with|Tconstr(path,[arg],_)whenOCamlPath.samepathPredef.path_option->read_type_exprenvarg|_->assertfalseelseread_type_exprenvarginletlbl=read_labellblinletcty=read_class_typeenvparentparamsctyinArrow(lbl,arg,cty)letread_class_declarationenvparentidcld=letopenClassinletid=Env.find_class_identifierenvidinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainercld.cty_attributesinmark_class_declarationcld;letparams=List.map2(read_type_parameterfalse)cld.cty_variancecld.cty_paramsinlettype_=read_class_typeenv(id:>Identifier.ClassSignature.t)cld.cty_paramscld.cty_typeinletvirtual_=cld.cty_new=Nonein{id;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_typeenvp;p_expansion=None}|Mty_signaturesg->Signature(read_signatureenvparentsg)|Mty_functor(parameter,res)->letf_parameter,env=matchparameterwith|Unit->Odoc_model.Lang.FunctorParameter.Unit,env|Named(id_opt,arg)->letname,env=matchid_optwith|Someid->Ident.nameid,Env.add_parameterparentid(ParameterName.of_identid)env|None->"_",envinletid=`Parameter(parent,Odoc_model.Names.ParameterName.make_stdname)inletarg=read_module_typeenvidarginOdoc_model.Lang.FunctorParameter.Named({FunctorParameter.id;expr=arg}),envinletres=read_module_typeenv(`Resultparent)resinFunctor(f_parameter,res)|Mty_alias_->assertfalseandread_module_type_declarationenvparentid(mtd:Odoc_model.Compat.modtype_declaration)=letopenModuleTypeinletid=Env.find_module_typeenvidinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attachedOdoc_model.Semantics.Expect_canonicalcontainermtd.mtd_attributesinletcanonical=(canonical:>Path.ModuleType.toption)inletexpr=opt_map(read_module_typeenv(id:>Identifier.Signature.t))mtd.mtd_typein{id;doc;canonical;expr}andread_module_declarationenvparentident(md:Odoc_model.Compat.module_declaration)=letopenModuleinletid=(Env.find_module_identifierenvident:>Identifier.Module.t)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attachedOdoc_model.Semantics.Expect_canonicalcontainermd.md_attributesinletcanonical=(canonical:>Path.Module.toption)inlettype_=matchmd.md_typewith|Mty_aliasp->Alias(Env.Path.read_moduleenvp,None)|_->ModuleType(read_module_typeenv(id:>Identifier.Signature.t)md.md_type)inlethidden=matchcanonicalwith|Some_->false|None->Odoc_model.Root.contains_double_underscore(Ident.nameident)in{id;doc;type_;canonical;hidden}andread_type_rec_statusrec_status=letopenSignatureinmatchrec_statuswith|Trec_first->Ordinary|Trec_next->And|Trec_not->Nonrecandread_module_rec_statusrec_status=letopenSignatureinmatchrec_statuswith|Trec_not->Ordinary|Trec_first->Rec|Trec_next->Andandread_signature_noenvenvparent(items:Odoc_model.Compat.signature)=letrecloop(acc,shadowed)items=letopenSignatureinletopenOdoc_model.CompatinletopenIncludeinmatchitemswith|Sig_value(id,v,_)::rest->letvd=read_value_descriptionenvparentidvinletshadowed=ifEnv.is_shadowedenvidthen{shadowedwiths_values=Ident.nameid::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->letdecl=read_type_declarationenvparentiddeclinletshadowed=ifEnv.is_shadowedenvidthen{shadowedwiths_types=Ident.nameid::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_shadowedenvidthen{shadowedwiths_modules=Ident.nameid::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_shadowedenvidthen{shadowedwiths_module_types=Ident.nameid::shadowed.s_module_types}elseshadowedinloop(ModuleTypemtd::acc,shadowed)rest|Sig_class(id,cl,rec_status,_)::Sig_class_type_::Sig_type_::Sig_type_::rest->letcl=read_class_declarationenvparentidclinletshadowed=ifEnv.is_shadowedenvidthen{shadowedwiths_classes=Ident.nameid::shadowed.s_classes}elseshadowedinloop(Class(read_type_rec_statusrec_status,cl)::acc,shadowed)rest|Sig_class_type(id,cltyp,rec_status,_)::Sig_type_::Sig_type_::rest->letcltyp=read_class_type_declarationenvparentidcltypinletshadowed=ifEnv.is_shadowedenvidthen{shadowedwiths_class_types=Ident.nameid::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;doc=[]},shadowed)inloop([],{s_modules=[];s_module_types=[];s_values=[];s_types=[];s_classes=[];s_class_types=[]})itemsandread_signatureenvparent(items:Odoc_model.Compat.signature)=letenv=Env.handle_signature_type_itemsparentitemsenvinfst@@read_signature_noenvenvparentitemsletread_interfacerootnameintf=letid=`Root(root,Odoc_model.Names.ModuleName.make_stdname)inletitems=read_signatureEnv.emptyidintfin(id,items)letpoint_of_pos{Lexing.pos_lnum;pos_bol;pos_cnum;_}=letcolumn=pos_cnum-pos_bolin{Odoc_model.Location_.line=pos_lnum;column}letread_location{Location.loc_start;loc_end;_}={Odoc_model.Location_.file=loc_start.pos_fname;start=point_of_posloc_start;end_=point_of_posloc_end;}