123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815(*
* 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=Ident_envmodulePaths=Odoc_model.Pathsletread_module_expr:(Ident_env.t->Identifier.Signature.t->Identifier.LabelParent.t->Typedtree.module_expr->ModuleType.expr)ref=ref(fun____->failwith"unset")letopt_mapf=function|None->None|Somex->Some(fx)letread_label=Cmi.read_labelletrecread_core_typeenvcontainerctyp=letopenTypeExprinmatchctyp.ctyp_descwith|Ttyp_any->Any|Ttyp_vars->Vars|Ttyp_arrow(lbl,arg,res)->letlbl=read_labellblin#ifOCAML_VERSION<(4,3,0)(* 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_VERSION<(4,6,0)(fun(name,_,typ)->Method{name;type_=read_core_typeenvcontainertyp})#elifOCAML_VERSION<(4,8,0)(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_VERSION>=(4,8,0)matchfield.rf_descwith|Ttag(name,constant,arguments)->letattributes=field.rf_attributesin#elsematchfieldwith|Ttag(name,attributes,constant,arguments)->#endifletarguments=List.map(read_core_typeenvcontainer)argumentsin#ifOCAML_VERSION>=(4,6,0)letname=name.txtin#endifletdoc=Doc_attr.attached_no_tagcontainerattributesinConstructor{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=letopenSignatureinletid=Env.find_value_identifierenvvd.val_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainervd.val_attributesinlettype_=read_core_typeenvcontainervd.val_descinletvalue=matchvd.val_primwith|[]->Value.Abstract|primitives->ExternalprimitivesinValue{Value.id;doc;type_;value}letread_type_parameter(ctyp,var_and_injectivity)=letopenTypeDeclinletdesc=matchctyp.ctyp_descwith|Ttyp_any->Any|Ttyp_vars->Vars|_->assertfalseinletvariance,injectivity=#ifOCAML_VERSION<(4,12,0)letvar=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=Ident.nameld.ld_idinletid=`Field(parent,FieldName.make_stdname)inletdoc=Doc_attr.attached_no_taglabel_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_VERSION<(4,3,0)ignoreparent;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=Ident.namecd.cd_idinletid=`Constructor(parent,ConstructorName.make_stdname)inletcontainer=(parent:Identifier.DataType.t:>Identifier.Parent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_taglabel_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=letopenTypeDeclinletid=Env.find_type_identifierenvdecl.typ_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attachedOdoc_model.Semantics.Expect_canonicalcontainerdecl.typ_attributesinletcanonical=(canonical:>Path.Type.toption)inletequation=read_type_equationenvcontainerdeclinletrepresentation=read_type_kindenv(id:>Identifier.DataType.t)decl.typ_kindin{id;doc;canonical;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_VERSION>=(4,8,0)letread_type_substitutionsenvparentdecls=List.map(fundecl->Odoc_model.Lang.Signature.TypeSubstitution(read_type_declarationenvparentdecl))decls#endifletread_extension_constructorenvparentext=letopenExtension.ConstructorinletopenOdoc_model.Namesinletname=Ident.nameext.ext_idinletid=`Extension(parent,ExtensionName.make_stdname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.Parent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_taglabel_containerext.ext_attributesinmatchext.ext_kindwith|Text_rebind_->assertfalse#ifOCAML_VERSION>=(4,14,0)|Text_decl(_,args,res)->#else|Text_decl(args,res)->#endifletargs=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.attached_no_tagcontainertyext.tyext_attributesinlettype_params=List.mapread_type_parametertyext.tyext_paramsinletprivate_=(tyext.tyext_private=Private)inletconstructors=List.map(read_extension_constructorenvparent)tyext.tyext_constructorsin{parent;type_path;doc;type_params;private_;constructors;}letread_exceptionenvparent(ext:extension_constructor)=letopenExceptioninletopenOdoc_model.Namesinletname=Ident.nameext.ext_idinletid=`Exception(parent,ExceptionName.make_stdname)inletcontainer=(parent:Identifier.Signature.t:>Identifier.Parent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_taglabel_containerext.ext_attributesinmatchext.ext_kindwith|Text_rebind_->assertfalse#ifOCAML_VERSION>=(4,14,0)|Text_decl(_,args,res)->#else|Text_decl(args,res)->#endifletargs=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.attached_no_tagcontainerctf.ctf_attributesinmatchctf.ctf_descwith|Tctf_val(name,mutable_,virtual_,typ)->letopenInstanceVariableinletid=`InstanceVariable(parent,InstanceVariableName.make_stdname)inletmutable_=(mutable_=Mutable)inletvirtual_=(virtual_=Virtual)inlettype_=read_core_typeenvcontainertypinSome(InstanceVariable{id;doc;mutable_;virtual_;type_})|Tctf_method(name,private_,virtual_,typ)->letopenMethodinletid=`Method(parent,MethodName.make_stdname)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.revitemsinletitems,(doc,doc_post)=Doc_attr.extract_top_comment_classitemsinletitems=matchdoc_postwith|[]->items|_->Comment(`Docsdoc_post)::itemsinSignature{self;items;doc}|Tcty_arrow_->assertfalse#ifOCAML_VERSION>=(4,8,0)|Tcty_open(_,cty)->read_class_signatureenvparentlabel_parentcty#elifOCAML_VERSION>=(4,6,0)|Tcty_open(_,_,_,_,cty)->read_class_signatureenvparentlabel_parentcty#endifletread_class_type_declarationenvparentcltd=letopenClassTypeinletid=Env.find_class_type_identifierenvcltd.ci_id_class_typeinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainercltd.ci_attributesinletvirtual_=(cltd.ci_virt=Virtual)inletparams=List.mapread_type_parametercltd.ci_paramsinletexpr=read_class_signatureenv(id:>Identifier.ClassSignature.t)containercltd.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_VERSION>=(4,8,0)|Tcty_open(_,cty)->read_class_typeenvparentlabel_parentcty#elifOCAML_VERSION>=(4,6,0)|Tcty_open(_,_,_,_,cty)->read_class_typeenvparentlabel_parentcty#endifletread_class_descriptionenvparentcld=letopenClassinletid=Env.find_class_identifierenvcld.ci_id_classinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainercld.ci_attributesinletvirtual_=(cld.ci_virt=Virtual)inletparams=List.mapread_type_parametercld.ci_paramsinlettype_=read_class_typeenv(id:>Identifier.ClassSignature.t)containercld.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_constraintenvglobal_parentparent(_,frag,constr)=let_=global_parentinletopenModuleTypeinmatchconstrwith|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_modtypemty->letfrag=Env.Fragment.read_module_typefrag.Location.txtinletmty=read_module_typeenvglobal_parentparentmtyinModuleTypeEq(frag,mty)|Twith_modtypesubstmty->letfrag=Env.Fragment.read_module_typefrag.Location.txtinletmty=read_module_typeenvglobal_parentparentmtyinModuleTypeSubst(frag,mty)#endifandread_module_typeenvparentlabel_parentmty=letopenModuleTypeinmatchmty.mty_descwith|Tmty_ident(p,_)->Path{p_path=Env.Path.read_module_typeenvp;p_expansion=None}|Tmty_signaturesg->letsg,()=read_signatureOdoc_model.Semantics.Expect_noneenvparentsginSignaturesg#ifOCAML_VERSION>=(4,10,0)|Tmty_functor(parameter,res)->letf_parameter,env=matchparameterwith|Unit->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,ParameterName.make_stdname)inletarg=read_module_typeenvidlabel_parentarginNamed{id;expr=arg;},envinletres=read_module_typeenv(`Resultparent)label_parentresinFunctor(f_parameter,res)#else|Tmty_functor(id,_,arg,res)->letf_parameter=matchargwith|None->Odoc_model.Lang.FunctorParameter.Unit|Somearg->letname=Ident.nameidinletid=`Parameter(parent,Odoc_model.Names.ParameterName.make_stdname)inletarg=read_module_typeenvidlabel_parentarginNamed{FunctorParameter.id;expr=arg}inletenv=Env.add_parameterparentid(ParameterName.of_identid)envinletres=read_module_typeenv(`Resultparent)label_parentresinFunctor(f_parameter,res)#endif|Tmty_with(body,subs)->(letbody=read_module_typeenvparentlabel_parentbodyinletsubs=List.map(read_with_constraintenvparentlabel_parent)subsinmatchOdoc_model.Lang.umty_of_mtybodywith|Somew_expr->With{w_substitutions=subs;w_expansion=None;w_expr}|None->failwith"error")|Tmty_typeofmexpr->letdecl=matchmexpr.mod_descwith|Tmod_ident(p,_)->TypeOf{t_desc=ModPath(Env.Path.read_moduleenvp);t_expansion=None}|Tmod_structure{str_items=[{str_desc=Tstr_include{incl_mod;_};_}];_}->beginmatchTypemod.path_of_moduleincl_modwith|Somep->TypeOf{t_desc=StructInclude(Env.Path.read_moduleenvp);t_expansion=None}|None->!read_module_exprenvparentlabel_parentmexprend|_->!read_module_exprenvparentlabel_parentmexprindecl|Tmty_alias_->assertfalse(** Like [read_module_type] but handle the canonical tag in the top-comment. If
[canonical] is [Some _], no tag is expected in the top-comment. *)andread_module_type_maybe_canonicalenvparentcontainer~canonicalmty=match(canonical,mty.mty_desc)with|None,Tmty_signaturesg->letsg,canonical=read_signatureOdoc_model.Semantics.Expect_canonicalenvparentsgin(ModuleType.Signaturesg,canonical)|_,_->(read_module_typeenvparentcontainermty,canonical)andread_module_type_declarationenvparentmtd=letopenModuleTypeinletid=Env.find_module_typeenvmtd.mtd_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attachedOdoc_model.Semantics.Expect_canonicalcontainermtd.mtd_attributesinletexpr,canonical=matchmtd.mtd_typewith|Somemty->letexpr,canonical=read_module_type_maybe_canonicalenv(id:>Identifier.Signature.t)container~canonicalmtyin(Someexpr,canonical)|None->(None,canonical)inletcanonical=(canonical:>Path.ModuleType.toption)in{id;doc;canonical;expr}andread_module_declarationenvparentmd=letopenModulein#ifOCAML_VERSION>=(4,10,0)matchmd.md_idwith|None->None|Someid->letid=Env.find_module_identifierenvidin#elseletid=Env.find_module_identifierenvmd.md_idin#endifletid=(id:>Identifier.Module.t)inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attachedOdoc_model.Semantics.Expect_canonicalcontainermd.md_attributesinlettype_,canonical=matchmd.md_type.mty_descwith|Tmty_alias(p,_)->(Alias(Env.Path.read_moduleenvp,None),canonical)|_->letexpr,canonical=read_module_type_maybe_canonicalenv(id:>Identifier.Signature.t)container~canonicalmd.md_typein(ModuleTypeexpr,canonical)inletcanonical=(canonical:>Path.Module.toption)inlethidden=#ifOCAML_VERSION>=(4,10,0)matchcanonical,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#endifinSome{id;doc;type_;canonical;hidden}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,None)andread_signature_itemenvparentitem=letopenSignatureinmatchitem.sig_descwith|Tsig_valuevd->[read_value_descriptionenvparentvd]#ifOCAML_VERSION<(4,3,0)|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_VERSION>=(4,8,0)[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)]|Tsig_openo->[Open(read_openenvparento)]|Tsig_includeincl->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_VERSION>=(4,8,0)|Tsig_typesubsttst->read_type_substitutionsenvparenttst|Tsig_modsubstmst->[ModuleSubstitution(read_module_substitutionenvparentmst)]#ifOCAML_VERSION>=(4,13,0)|Tsig_modtypesubstmtst->[ModuleTypeSubstitution(read_module_type_substitutionenvparentmtst)]#endifandread_module_substitutionenvparentms=letopenModuleSubstitutioninletid=Env.find_module_identifierenvms.ms_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,()=Doc_attr.attachedOdoc_model.Semantics.Expect_nonecontainerms.ms_attributesinletmanifest=Env.Path.read_moduleenvms.ms_manifestin{id;doc;manifest}#ifOCAML_VERSION>=(4,13,0)andread_module_type_substitutionenvparentmtd=letopenModuleTypeSubstitutioninletid=Env.find_module_typeenvmtd.mtd_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,()=Doc_attr.attachedOdoc_model.Semantics.Expect_nonecontainermtd.mtd_attributesinletexpr=matchopt_map(read_module_typeenv(id:>Identifier.Signature.t)container)mtd.mtd_typewith|None->assertfalse|Somex->xin{id;doc;manifest=expr;}#endif#endifandread_includeenvparentincl=letopenIncludeinletloc=Cmi.read_locationincl.incl_locinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,status=Doc_attr.attachedOdoc_model.Semantics.Expect_statuscontainerincl.incl_attributesinletcontent,shadowed=Cmi.read_signature_noenvenvparent(Odoc_model.Compat.signatureincl.incl_type)inletexpr=read_module_typeenvparentcontainerincl.incl_modinletreccontains_signature=function|ModuleType.U.Signature_->true|Path_->false|With(_,w_expr)->contains_signaturew_expr|TypeOf_->falsein(* inline type or module substitution is tricky to inline, because the
scope of the substitution is to the end of the signature being inlined.
If we've got one of those, we fall back to inlining the compiler-computed signature *)letis_inlinableitems=not(List.exists(function|Signature.TypeSubstitution_->true|ModuleSubstitution_->true|_->false)items)inmatchOdoc_model.Lang.umty_of_mtyexprwith|Someuexprwhennot(contains_signatureuexpr)->letdecl=Include.ModuleTypeuexprinletexpansion={content;shadowed;}in[Include{parent;doc;decl;expansion;status;strengthened=None;loc}]|SomeModuleType.U.Signature{items;_}whenis_inlinableitems->items|_->content.itemsandread_openenvparento=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainero.open_attributesin#ifOCAML_VERSION>=(4,8,0)letsignature=o.open_bound_itemsin#elseletsignature=[]in#endifletexpansion,_=Cmi.read_signature_noenvenvparent(Odoc_model.Compat.signaturesignature)in{expansion;doc}andread_signature:'tags.'tagsOdoc_model.Semantics.handle_internal_tags->_->_->_->_*'tags=funinternal_tagsenvparentsg->letenv=Env.add_signature_tree_itemsparentsgenvinletitems,(doc,doc_post),tags=letclassifyitem=matchitem.sig_descwith|Tsig_attributeattr->Some(`Attributeattr)|Tsig_open_->Some`Open|_->NoneinDoc_attr.extract_top_commentinternal_tags~classifyparentsg.sig_itemsinletitems=List.fold_left(funitemsitem->List.rev_append(read_signature_itemenvparentitem)items)[]items|>List.revinmatchdoc_postwith|[]->({Signature.items;compiled=false;doc},tags)|_->({Signature.items=Comment(`Docsdoc_post)::items;compiled=false;doc},tags)letread_interfacerootnameintf=letid=`Root(root,Odoc_model.Names.ModuleName.make_stdname)inletsg,canonical=read_signatureOdoc_model.Semantics.Expect_canonicalEnv.emptyidintfin(id,sg,(canonical:>Odoc_model.Paths.Path.Module.toption))