123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754(*
* 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.
*)openAsttypesopenTypedtreemoduleOCamlPath=PathopenOdoc_model.PathsopenOdoc_model.LangopenOdoc_model.NamesmoduleEnv=Odoc_model.Ident_envmodulePaths=Odoc_model.PathsmoduleIdent_env=Odoc_model.Ident_envletopt_mapf=function|None->None|Somex->Some(fx)letparenthesisename=matchnamewith|"asr"|"land"|"lnot"|"lor"|"lsl"|"lsr"|"lxor"|"mod"->"("^name^")"|_->if(String.lengthname>0)thenmatchname.[0]with|'a'..'z'|'\223'..'\246'|'\248'..'\255'|'_'|'A'..'Z'|'\192'..'\214'|'\216'..'\222'->name|_->"("^name^")"elsenameletread_label=Cmi.read_labelletrecread_core_typeenvcontainerctyp=letopenTypeExprinmatchctyp.ctyp_descwith|Ttyp_any->Any|Ttyp_vars->Vars|Ttyp_arrow(lbl,arg,res)->letlbl=read_labellblin#ifOCAML_MAJOR=4&&OCAML_MINOR=02(* NOTE(@ostera): Unbox the optional value for this optional labelled
argument since the 4.02.x representation includes it explicitly. *)letarg=matchlblwith|None|Some(Label(_))->read_core_typeenvcontainerarg|Some(Optional(_))->letarg'=matcharg.ctyp_descwith|Ttyp_constr(_,_,param::_)->param|_->arginread_core_typeenvcontainerarg'#elseletarg=read_core_typeenvcontainerarg#endifinletres=read_core_typeenvcontainerresinArrow(lbl,arg,res)|Ttyp_tupletyps->lettyps=List.map(read_core_typeenvcontainer)typsinTupletyps|Ttyp_constr(p,_,params)->letp=Env.Path.read_typeenvpinletparams=List.map(read_core_typeenvcontainer)paramsinConstr(p,params)|Ttyp_object(methods,closed)->letopenTypeExpr.Objectinletfields=List.map#ifOCAML_MAJOR=4&&OCAML_MINOR<06(fun(name,_,typ)->Method{name;type_=read_core_typeenvcontainertyp})#elifOCAML_MAJOR=4&&OCAML_MINOR<08(function|OTtag(name,_,typ)->Method{name=name.txt;type_=read_core_typeenvcontainertyp;}|OTinherittyp->Inherit(read_core_typeenvcontainertyp))#else(function|{of_desc=OTtag(name,typ);_}->Method{name=name.txt;type_=read_core_typeenvcontainertyp;}|{of_desc=OTinherittyp;_}->Inherit(read_core_typeenvcontainertyp))#endifmethodsinObject{fields;open_=(closed=Asttypes.Open)}|Ttyp_class(p,_,params)->letp=Env.Path.read_class_typeenvpinletparams=List.map(read_core_typeenvcontainer)paramsinClass(p,params)|Ttyp_alias(typ,var)->lettyp=read_core_typeenvcontainertypinAlias(typ,var)|Ttyp_variant(fields,closed,present)->letopenTypeExpr.Polymorphic_variantinletelements=fields|>List.mapbeginfunfield->#ifOCAML_MAJOR=4&&OCAML_MINOR>=08matchfield.rf_descwith|Ttag(name,constant,arguments)->letattributes=field.rf_attributesin#elsematchfieldwith|Ttag(name,attributes,constant,arguments)->#endifletarguments=List.map(read_core_typeenvcontainer)argumentsin#ifOCAML_MAJOR=4&&OCAML_MINOR>=06letname=name.txtin#endifletdoc=Doc_attr.attachedcontainerattributesinConstructor{name;constant;arguments;doc}|Tinherittyp->Type(read_core_typeenvcontainertyp)endinletkind=ifclosed=Asttypes.OpenthenOpenelsematchpresentwith|None->Fixed|Somenames->ClosednamesinPolymorphic_variant{kind;elements}|Ttyp_poly([],typ)->read_core_typeenvcontainertyp|Ttyp_poly(vars,typ)->Poly(vars,read_core_typeenvcontainertyp)|Ttyp_package{pack_path;pack_fields;_}->letopenTypeExpr.Packageinletpath=Env.Path.read_module_typeenvpack_pathinletsubstitutions=List.map(fun(frag,typ)->letfrag=Env.Fragment.read_typefrag.Location.txtinlettyp=read_core_typeenvcontainertypin(frag,typ))pack_fieldsinPackage{path;substitutions}letread_value_descriptionenvparentvd=letopenSignatureinletopenOdoc_model.Namesinletname=parenthesise(Ident.namevd.val_id)inletid=`Value(parent,ValueName.of_stringname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainervd.val_attributesinlettype_=read_core_typeenvcontainervd.val_descinmatchvd.val_primwith|[]->Value{Value.id;doc;type_}|primitives->External{External.id;doc;type_;primitives}letread_type_parameter(ctyp,var_and_injectivity)=letopenTypeDeclinletdesc=matchctyp.ctyp_descwith|Ttyp_any->Any|Ttyp_vars->Vars|_->assertfalseinletvariance,injectivity=#ifOCAML_MAJOR=4&&OCAML_MINOR<12letvar=matchvar_and_injectivitywith|Covariant->SomePos|Contravariant->SomeNeg|Invariant->Noneinvar,false#elseletvar=matchfstvar_and_injectivitywith|Covariant->SomePos|Contravariant->SomeNeg|NoVariance->Noneinletinjectivity=matchsndvar_and_injectivitywith|Injective->true|NoInjectivity->falseinvar,injectivity#endifin{desc;variance;injectivity}letread_label_declarationenvparentlabel_parentld=letopenTypeDecl.FieldinletopenOdoc_model.Namesinletname=parenthesise(Ident.nameld.ld_id)inletid=`Field(parent,FieldName.of_stringname)inletdoc=Doc_attr.attachedlabel_parentld.ld_attributesinletmutable_=(ld.ld_mutable=Mutable)inlettype_=read_core_typeenvlabel_parentld.ld_typein{id;doc;mutable_;type_}letread_constructor_declaration_argumentsenvparentlabel_parentarg=letopenTypeDecl.Constructorin#ifOCAML_MAJOR=4&&OCAML_MINOR=02ignoreparent;Tuple(List.map(read_core_typeenvlabel_parent)arg)#elsematchargwith|Cstr_tupleargs->Tuple(List.map(read_core_typeenvlabel_parent)args)|Cstr_recordlds->Record(List.map(read_label_declarationenvparentlabel_parent)lds)#endifletread_constructor_declarationenvparentcd=letopenTypeDecl.ConstructorinletopenOdoc_model.Namesinletname=parenthesise(Ident.namecd.cd_id)inletid=`Constructor(parent,ConstructorName.of_stringname)inletcontainer=(parent:Identifier.DataType.t:>Identifier.Parent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedlabel_containercd.cd_attributesinletargs=read_constructor_declaration_argumentsenvcontainerlabel_containercd.cd_argsinletres=opt_map(read_core_typeenvlabel_container)cd.cd_resin{id;doc;args;res}letread_type_kindenvparent=letopenTypeDecl.Representationinfunction|Ttype_abstract->None|Ttype_variantcstrs->letcstrs=List.map(read_constructor_declarationenvparent)cstrsinSome(Variantcstrs)|Ttype_recordlbls->letparent=(parent:Identifier.DataType.t:>Identifier.Parent.t)inletlabel_parent=(parent:>Identifier.LabelParent.t)inletlbls=List.map(read_label_declarationenvparentlabel_parent)lblsinSome(Recordlbls)|Ttype_open->SomeExtensibleletread_type_equationenvcontainerdecl=letopenTypeDecl.Equationinletparams=List.mapread_type_parameterdecl.typ_paramsinletprivate_=(decl.typ_private=Private)inletmanifest=opt_map(read_core_typeenvcontainer)decl.typ_manifestinletconstraints=List.map(fun(typ1,typ2,_)->(read_core_typeenvcontainertyp1,read_core_typeenvcontainertyp2))decl.typ_cstrsin{params;private_;manifest;constraints}letread_type_declarationenvparentdecl=letopenTypeDeclinletopenOdoc_model.Namesinletname=parenthesise(Ident.namedecl.typ_id)inletid=`Type(parent,TypeName.of_stringname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainerdecl.typ_attributesinletequation=read_type_equationenvcontainerdeclinletrepresentation=read_type_kindenviddecl.typ_kindin{id;doc;equation;representation}letread_type_declarationsenvparentrec_flagdecls=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletitems=letopenSignatureinList.fold_left(fun(acc,recursive)decl->letcomments=Doc_attr.standalone_multiplecontainerdecl.typ_attributesinletcomments=List.map(funcom->Commentcom)commentsinletdecl=read_type_declarationenvparentdeclin((Type(recursive,decl))::(List.rev_appendcommentsacc),And))([],rec_flag)decls|>fstinList.revitems#ifOCAML_MAJOR=4&&OCAML_MINOR>=08letread_type_substitutionsenvparentdecls=List.map(fundecl->Odoc_model.Lang.Signature.TypeSubstitution(read_type_declarationenvparentdecl))decls#endifletread_extension_constructorenvparentext=letopenExtension.ConstructorinletopenOdoc_model.Namesinletname=parenthesise(Ident.nameext.ext_id)inletid=`Extension(parent,ExtensionName.of_stringname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.Parent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedlabel_containerext.ext_attributesinmatchext.ext_kindwith|Text_rebind_->assertfalse|Text_decl(args,res)->letargs=read_constructor_declaration_argumentsenvcontainerlabel_containerargsinletres=opt_map(read_core_typeenvlabel_container)resin{id;doc;args;res}letread_type_extensionenvparenttyext=letopenExtensioninlettype_path=Env.Path.read_typeenvtyext.tyext_pathinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainertyext.tyext_attributesinlettype_params=List.mapread_type_parametertyext.tyext_paramsinletprivate_=(tyext.tyext_private=Private)inletconstructors=List.map(read_extension_constructorenvparent)tyext.tyext_constructorsin{type_path;doc;type_params;private_;constructors;}letread_exceptionenvparent(ext:extension_constructor)=letopenExceptioninletopenOdoc_model.Namesinletname=parenthesise(Ident.nameext.ext_id)inletid=`Exception(parent,ExceptionName.of_stringname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.Parent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedlabel_containerext.ext_attributesinmatchext.ext_kindwith|Text_rebind_->assertfalse|Text_decl(args,res)->letargs=read_constructor_declaration_argumentsenvcontainerlabel_containerargsinletres=opt_map(read_core_typeenvlabel_container)resin{id;doc;args;res}letrecread_class_type_fieldenvparentctf=letopenClassSignatureinletopenOdoc_model.Namesinletcontainer=(parent:Identifier.ClassSignature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainerctf.ctf_attributesinmatchctf.ctf_descwith|Tctf_val(name,mutable_,virtual_,typ)->letopenInstanceVariableinletname=parenthesisenameinletid=`InstanceVariable(parent,InstanceVariableName.of_stringname)inletmutable_=(mutable_=Mutable)inletvirtual_=(virtual_=Virtual)inlettype_=read_core_typeenvcontainertypinSome(InstanceVariable{id;doc;mutable_;virtual_;type_})|Tctf_method(name,private_,virtual_,typ)->letopenMethodinletname=parenthesisenameinletid=`Method(parent,MethodName.of_stringname)inletprivate_=(private_=Private)inletvirtual_=(virtual_=Virtual)inlettype_=read_core_typeenvcontainertypinSome(Method{id;doc;private_;virtual_;type_})|Tctf_constraint(typ1,typ2)->lettyp1=read_core_typeenvcontainertyp1inlettyp2=read_core_typeenvcontainertyp2inSome(Constraint(typ1,typ2))|Tctf_inheritcltyp->Some(Inherit(read_class_signatureenvparentcontainercltyp))|Tctf_attributeattr->matchDoc_attr.standalonecontainerattrwith|None->None|Somedoc->Some(Commentdoc)andread_self_typeenvcontainertyp=iftyp.ctyp_desc=Ttyp_anythenNoneelseSome(read_core_typeenvcontainertyp)andread_class_signatureenvparentlabel_parentcltyp=letopenClassTypeinmatchcltyp.cltyp_descwith|Tcty_constr(p,_,params)->letp=Env.Path.read_class_typeenvpinletparams=List.map(read_core_typeenvlabel_parent)paramsinConstr(p,params)|Tcty_signaturecsig->letopenClassSignatureinletself=read_self_typeenvlabel_parentcsig.csig_selfinletitems=List.fold_left(funrestitem->matchread_class_type_fieldenvparentitemwith|None->rest|Someitem->item::rest)[]csig.csig_fieldsinletitems=List.revitemsinSignature{self;items}|Tcty_arrow_->assertfalse#ifOCAML_MAJOR=4&&OCAML_MINOR>=06|Tcty_open_->assertfalse#endifletread_class_type_declarationenvparentcltd=letopenClassTypeinletname=parenthesise(Ident.namecltd.ci_id_class_type)inletid=`ClassType(parent,Odoc_model.Names.ClassTypeName.of_stringname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainercltd.ci_attributesinletvirtual_=(cltd.ci_virt=Virtual)inletparams=List.mapread_type_parametercltd.ci_paramsinletexpr=read_class_signatureenvidcontainercltd.ci_exprin{id;doc;virtual_;params;expr;expansion=None}letread_class_type_declarationsenvparentcltds=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletopenSignatureinList.fold_leftbeginfun(acc,recursive)cltd->letcomments=Doc_attr.standalone_multiplecontainercltd.ci_attributesinletcomments=List.map(funcom->Commentcom)commentsinletcltd=read_class_type_declarationenvparentcltdin((ClassType(recursive,cltd))::(List.rev_appendcommentsacc),And)end([],Ordinary)cltds|>fst|>List.revletrecread_class_typeenvparentlabel_parentcty=letopenClassinmatchcty.cltyp_descwith|Tcty_constr_|Tcty_signature_->ClassType(read_class_signatureenvparentlabel_parentcty)|Tcty_arrow(lbl,arg,res)->letlbl=read_labellblinletarg=read_core_typeenvlabel_parentarginletres=read_class_typeenvparentlabel_parentresinArrow(lbl,arg,res)#ifOCAML_MAJOR=4&&OCAML_MINOR>=06&&OCAML_MINOR<08|Tcty_open(_,_,_,_,cty)->read_class_typeenvparentlabel_parentcty#elifOCAML_MAJOR=4&&OCAML_MINOR>=08|Tcty_open(_,cty)->read_class_typeenvparentlabel_parentcty#endifletread_class_descriptionenvparentcld=letopenClassinletname=parenthesise(Ident.namecld.ci_id_class)inletid=`Class(parent,Odoc_model.Names.ClassName.of_stringname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainercld.ci_attributesinletvirtual_=(cld.ci_virt=Virtual)inletparams=List.mapread_type_parametercld.ci_paramsinlettype_=read_class_typeenvidcontainercld.ci_exprin{id;doc;virtual_;params;type_;expansion=None}letread_class_descriptionsenvparentclds=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletopenSignatureinList.fold_leftbeginfun(acc,recursive)cld->letcomments=Doc_attr.standalone_multiplecontainercld.ci_attributesinletcomments=List.map(funcom->Commentcom)commentsinletcld=read_class_descriptionenvparentcldin((Class(recursive,cld))::(List.rev_appendcommentsacc),And)end([],Ordinary)clds|>fst|>List.revletrecread_with_constraintenvparent(_,frag,constr)=letopenModuleTypeinmatchconstrwith|Twith_typedecl->letfrag=Env.Fragment.read_typefrag.Location.txtinleteq=read_type_equationenvparentdeclinTypeEq(frag,eq)|Twith_module(p,_)->letfrag=Env.Fragment.read_modulefrag.Location.txtinleteq=read_module_equationenvpinModuleEq(frag,eq)|Twith_typesubstdecl->letfrag=Env.Fragment.read_typefrag.Location.txtinleteq=read_type_equationenvparentdeclinTypeSubst(frag,eq)|Twith_modsubst(p,_)->letfrag=Env.Fragment.read_modulefrag.Location.txtinletp=Env.Path.read_moduleenvpinModuleSubst(frag,p)#ifOCAML_VERSION>=(4,13,0)|Twith_modtype_->failwith"with module type is only supported by odoc 2.0 and later"|Twith_modtypesubst_->failwith"with module type is only supported by odoc 2.0 and later"#endifandread_module_typeenvparentlabel_parentposmty=letopenModuleTypeinmatchmty.mty_descwith|Tmty_ident(p,_)->Path(Env.Path.read_module_typeenvp)|Tmty_signaturesg->Signature(read_signatureenvparentsg)#ifOCAML_MAJOR=4&&OCAML_MINOR>=10|Tmty_functor(parameter,res)->letparameter,env=matchparameterwith|Unit->FunctorParameter.Unit,env|Named(id_opt,_,arg)->letname,env=matchid_optwith|Someid->parenthesise(Ident.nameid),Env.add_argumentparentposid(ArgumentName.of_identid)env|None->"_",envinletid=`Argument(parent,pos,ArgumentName.of_stringname)inletarg=read_module_typeenvidlabel_parent1arginletexpansion=matchargwith|Signature_->SomeModule.AlreadyASig|_->NoneinNamed{id;expr=arg;expansion},envinletres=read_module_typeenvparentlabel_parent(pos+1)resinFunctor(parameter,res)#else|Tmty_functor(id,_,arg,res)->letarg=matchargwith|None->Odoc_model.Lang.FunctorParameter.Unit|Somearg->letname=parenthesise(Ident.nameid)inletid=`Argument(parent,pos,Odoc_model.Names.ArgumentName.of_stringname)inletarg=read_module_typeenvidlabel_parent1arginletexpansion=matchargwith|Signature_->SomeModule.AlreadyASig|_->NoneinNamed{FunctorParameter.id;expr=arg;expansion}inletenv=Env.add_argumentparentposid(ArgumentName.of_identid)envinletres=read_module_typeenvparentlabel_parent(pos+1)resinFunctor(arg,res)#endif|Tmty_with(body,subs)->letbody=read_module_typeenvparentlabel_parentposbodyinletsubs=List.map(read_with_constraintenvlabel_parent)subsinWith(body,subs)|Tmty_typeofmexpr->letdecl=letopenModuleinmatchmexpr.mod_descwith|Tmod_ident(p,_)->Alias(Env.Path.read_moduleenvp)|_->letmty=Cmi.read_module_typeenvparentpos(Odoc_model.Compat.module_typemexpr.mod_type)inModuleTypemtyinTypeOfdecl|Tmty_alias_->assertfalseandread_module_type_declarationenvparentmtd=letopenModuleTypeinletname=parenthesise(Ident.namemtd.mtd_id)inletid=`ModuleType(parent,(Odoc_model.Names.ModuleTypeName.of_stringname))inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainermtd.mtd_attributesinletexpr=opt_map(read_module_typeenvidcontainer1)mtd.mtd_typeinletexpansion=matchexprwith|Some(Signature_)->SomeModule.AlreadyASig|_->Nonein{id;doc;expr;expansion}andread_module_declarationenvparentmd=letopenModulein#ifOCAML_MAJOR=4&&OCAML_MINOR>=10matchmd.md_idwith|None->None|Someid->letname=parenthesise(Ident.nameid)inletid=`Module(parent,Odoc_model.Names.ModuleName.of_stringname)in#elseletname=parenthesise(Ident.namemd.md_id)inletid=`Module(parent,Odoc_model.Names.ModuleName.of_stringname)in#endifletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainermd.md_attributesinletcanonical=letdoc=List.mapOdoc_model.Location_.valuedocinmatchList.find(function`Tag(`Canonical_)->true|_->false)docwith|exceptionNot_found->None|`Tag(`Canonical(p,r))->Some(p,r)|_->Noneinlettype_=matchmd.md_type.mty_descwith|Tmty_alias(p,_)->Alias(Env.Path.read_moduleenvp)|_->ModuleType(read_module_typeenvidcontainer1md.md_type)inlethidden=#ifOCAML_MAJOR=4&&OCAML_MINOR>=10matchcanonical,md.md_idwith|None,Someid->Odoc_model.Root.contains_double_underscore(Ident.nameid)|_,_->false#elsematchcanonicalwith|None->Odoc_model.Root.contains_double_underscore(Ident.namemd.md_id)|_->false#endifinletexpansion=matchtype_with|ModuleType(ModuleType.Signature_)->SomeAlreadyASig|_->NoneinSome{id;doc;type_;expansion;canonical;hidden;display_type=None}andread_module_declarationsenvparentmds=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletopenSignatureinList.fold_left(fun(acc,recursive)md->letcomments=Doc_attr.standalone_multiplecontainermd.md_attributesinletcomments=List.map(funcom->Commentcom)commentsinmatchread_module_declarationenvparentmdwith|Somemd->((Module(recursive,md))::(List.rev_appendcommentsacc),And)|None->acc,recursive)([],Rec)mds|>fst|>List.revandread_module_equationenvp=letopenModuleinAlias(Env.Path.read_moduleenvp)#ifOCAML_MAJOR=4&&OCAML_MINOR>=08andmodule_of_extended_openenvparento=letopenModuleinletid=`Module(parent,Odoc_model.Names.ModuleName.internal_of_string(Env.module_name_of_openo))inlet(p,_)=o.Typedtree.open_exprinlettype_=Alias(Env.Path.read_moduleenvp)in{id;doc=[];type_;canonical=None;hidden=true;display_type=None;expansion=None}#endifandread_signature_itemenvparentitem=letopenSignatureinmatchitem.sig_descwith|Tsig_valuevd->[read_value_descriptionenvparentvd]#ifOCAML_MAJOR=4&&OCAML_MINOR=02|Tsig_typedecls->letrec_flag=Ordinaryin#else|Tsig_type(rec_flag,decls)->letrec_flag=matchrec_flagwith|Recursive->Ordinary|Nonrecursive->Nonrecin#endifread_type_declarationsenvparentrec_flagdecls|Tsig_typexttyext->[TypExt(read_type_extensionenvparenttyext)]|Tsig_exceptionext->#ifOCAML_MAJOR=4&&OCAML_MINOR>=08[Exception(read_exceptionenvparentext.tyexn_constructor)]#else[Exception(read_exceptionenvparentext)]#endif|Tsig_modulemd->beginmatchread_module_declarationenvparentmdwith|Somem->[Module(Ordinary,m)]|None->[]end|Tsig_recmodulemds->read_module_declarationsenvparentmds|Tsig_modtypemtd->[ModuleType(read_module_type_declarationenvparentmtd)]#ifOCAML_MAJOR=4&&OCAML_MINOR>=08|Tsig_openo->[Comment`Stop;Module(Ordinary,module_of_extended_openenvparento);Comment`Stop]#else|Tsig_open_->[]#endif|Tsig_includeincl->[Include(read_includeenvparentincl)]|Tsig_classcls->read_class_descriptionsenvparentcls|Tsig_class_typecltyps->read_class_type_declarationsenvparentcltyps|Tsig_attributeattr->beginletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inmatchDoc_attr.standalonecontainerattrwith|None->[]|Somedoc->[Commentdoc]end#ifOCAML_MAJOR=4&&OCAML_MINOR>=08|Tsig_typesubsttst->read_type_substitutionsenvparenttst|Tsig_modsubstmst->[ModuleSubstitution(read_module_substitutionenvparentmst)]#ifOCAML_VERSION>=(4,13,0)|Tsig_modtypesubst_->failwith"local module type substitution is only supported by odoc 2.0 and later"#endifandread_module_substitutionenvparentms=letopenModuleSubstitutioninletname=parenthesise(Ident.namems.ms_id)inletid=`Module(parent,(Odoc_model.Names.ModuleName.of_stringname))inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainerms.ms_attributesinletmanifest=Env.Path.read_moduleenvms.ms_manifestin{id;doc;manifest}#endifandread_includeenvparentincl=letopenIncludeinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attachedcontainerincl.incl_attributesinletexpr=read_module_typeenvparentcontainer1incl.incl_modinletdecl=Module.ModuleTypeexprinletcontent=Cmi.read_signatureenvparent(Odoc_model.Compat.signatureincl.incl_type)inletexpansion={content;resolved=false}in{parent;doc;decl;expansion}andread_signatureenvparentsg=letenv=Env.add_signature_tree_itemsparentsgenvinletitems=List.fold_left(funitemsitem->List.rev_append(read_signature_itemenvparentitem)items)[]sg.sig_itemsinList.revitemsletread_interfacerootnameintf=letid=`Root(root,Odoc_model.Names.UnitName.of_stringname)inletitems=read_signatureEnv.emptyidintfinletdoc,items=letopenSignatureinmatchitemswith|Comment(`Docsdoc)::items->doc,items|_->Doc_attr.empty,itemsin(id,doc,items)