123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832(*
* 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.Pathsopen Odoc_model.LangopenOdoc_model.NamesmoduleEnv=Ident_envmodulePaths=Odoc_model.Pathstypeenv=Cmi.env={ident_env:Ident_env.t;warnings_tag:stringoption;}letread_module_expr:(env->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)->let lbl=read_label lblin#ifOCAML_VERSION<(4,3,0)(* NOTE(@ostera): Unbox the optional value for this optionallabelled
argument since the 4.02.x representation includes it explicitly. *)letarg=matchlblwith|None|Some(Label(_))->read_core_typeenvcontainerarg|Some(Optional(_))|Some(RawOptional(_))->letarg'=matcharg.ctyp_descwith|Ttyp_constr(_,_,param::_)->param|_->arginread_core_type envcontainerarg'#elseletarg=read_core_type envcontainerarg#endifinletres=read_core_typeenvcontainerresinArrow(lbl,arg,res)|Ttyp_tupletyps->lettyps=List.map(read_core_type envcontainer)typsinTupletyps|Ttyp_constr(p,_,params)->letp=Env.Path.read_typeenv.ident_envpinletparams=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_typeenvcontainer typ})#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_type envcontainertyp))#endifmethodsinObject{fields;open_=(closed=Asttypes.Open)}|Ttyp_class(p,_,params)->letp=Env.Path.read_class_typeenv.ident_envpinletparams=List.map(read_core_typeenvcontainer)paramsinClass(p,params)|Ttyp_alias(typ,var)->let typ=read_core_typeenvcontainertypin#ifOCAML_VERSION>=(5,2,0)Alias(typ,var.txt)#elseAlias(typ,var)#endif|Ttyp_variant(fields,closed,present)->letopenTypeExpr.Polymorphic_variantinletelements=fields|>List.mapbegin funfield->#ifOCAML_VERSION>=(4,8,0)match field.rf_descwith|Ttag(name,constant,arguments)->letattributes=field.rf_attributesin#elsematchfieldwith|Ttag(name,attributes,constant,arguments)->#endiflet arguments=List.map(read_core_typeenvcontainer)argumentsin#ifOCAML_VERSION>=(4,6,0)letname=name.txtin#endifletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainerattributesinConstructor{name;constant;arguments;doc}|Tinherit typ->Type(read_core_type envcontainertyp)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.Package inletpath=Env.Path.read_module_typeenv.ident_envpack_pathinletsubstitutions=List.map(fun(frag,typ)->letfrag=Env.Fragment.read_typefrag.Location.txtinlettyp=read_core_typeenv containertypin(frag,typ))pack_fieldsinPackage{path;substitutions}#ifOCAML_VERSION>=(5,2,0)|Ttyp_open(_p,_l,t)->(* TODO: adjust model *)read_core_typeenvcontainer t#endifletread_value_descriptionenvparent vd=letopen Signatureinlet id=Env.find_value_identifierenv.ident_envvd.val_idinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainervd.val_attributesinlettype_=read_core_typeenvcontainervd.val_descinletvalue=matchvd.val_prim with|[]->Value.Abstract|primitives->ExternalprimitivesinValue{Value.id;source_loc;doc;type_;value}letread_type_parameter(ctyp,var_and_injectivity)=letopenTypeDeclinlet desc=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_injectivity with|Covariant ->SomePos|Contravariant ->SomeNeg|NoVariance->Noneinletinjectivity=match sndvar_and_injectivitywith|Injective->true|NoInjectivity->falseinvar,injectivity#endifin{desc;variance;injectivity}let read_label_declaration envparentlabel_parentld=letopenTypeDecl.FieldinletopenOdoc_model.Namesinletname=Ident.nameld.ld_idinletid=Identifier.Mk.field(parent,FieldName.make_stdname)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_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.Constructorinletid=Ident_env.find_constructor_identifierenv.ident_envcd.cd_idinletcontainer=(parent :>Identifier.FieldParent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc =Doc_attr.attached_no_tag~warnings_tag:env.warnings_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.Representation infunction|Ttype_abstract->None|Ttype_variantcstrs->letcstrs=List.map(read_constructor_declarationenvparent)cstrsinSome(Variantcstrs)|Ttype_recordlbls->letparent=(parent:>Identifier.FieldParent.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_parameter decl.typ_params inletprivate_ =(decl.typ_private=Private)inletmanifest=opt_map(read_core_typeenvcontainer)decl.typ_manifest inletconstraints=List.map(fun(typ1,typ2,_)->(read_core_type envcontainertyp1,read_core_typeenvcontainertyp2))decl.typ_cstrsin{params;private_;manifest;constraints}letread_type_declarationenvparentdecl=letopenTypeDeclinletid=Env.find_type_identifierenv.ident_envdecl.typ_idinletsource_loc=Noneinletcontainer =(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical =Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonicalcontainerdecl.typ_attributesinletcanonical=matchcanonicalwith|None->None|Somes->Doc_attr.conv_canonical_typesinletequation=read_type_equationenvcontainerdeclinletrepresentation=read_type_kindenviddecl.typ_kindin{id;source_loc;doc;canonical;equation;representation}letread_type_declarations envparentrec_flag decls=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletitems=letopenSignature inList.fold_left(fun(acc,recursive)decl->ifBtype.is_row_name (Ident.namedecl.typ_id)then(acc,recursive)elsebeginletcomments=Doc_attr.standalone_multiplecontainer~warnings_tag:env.warnings_tagdecl.typ_attributesinletcomments=List.map(funcom->Commentcom)commentsinletdecl=read_type_declaration envparentdeclin((Type(recursive,decl))::(List.rev_appendcommentsacc),And)end)([],rec_flag)decls|>fstinList.rev items#if OCAML_VERSION>=(4,8,0)letread_type_substitutionsenvparentdecls=List.map(fundecl->Odoc_model.Lang.Signature.TypeSubstitution(read_type_declarationenvparentdecl))decls#endifletread_extension_constructorenvparentext=letopenExtension.Constructorinlet id=Env.find_extension_identifierenv.ident_envext.ext_idinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.FieldParent.t)inletlabel_container=(container :>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_taglabel_containerext.ext_attributes inmatchext.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;source_loc;doc;args;res}letread_type_extension envparenttyext=letopenExtensioninlettype_path=Env.Path.read_typeenv.ident_envtyext.tyext_pathinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_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)=letopenExceptioninletid=Env.find_exception_identifierenv.ident_envext.ext_idinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.FieldParent.t)inletlabel_container=(container:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_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_argumentsenvcontainer label_container argsinletres=opt_map(read_core_typeenvlabel_container)resin{id;source_loc;doc;args;res}letrecread_class_type_fieldenvparentctf=letopenClassSignatureinletopenOdoc_model.Namesinletcontainer =(parent:Identifier.ClassSignature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tag containerctf.ctf_attributesinmatch ctf.ctf_descwith|Tctf_val(name,mutable_,virtual_,typ)->letopenInstanceVariableinletid=Identifier.Mk.instance_variable(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=Identifier.Mk.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)->letleft=read_core_type envcontainertyp1inletright=read_core_type envcontainertyp2inSome(Constraint{left;right;doc})|Tctf_inheritcltyp->letexpr=read_class_signature envparentcontainercltypinSome(Inherit{expr;doc})|Tctf_attribute attr->matchDoc_attr.standalone container~warnings_tag:env.warnings_tag attrwith|None->None|Somedoc->Some(Commentdoc)andread_self_typeenvcontainertyp=iftyp.ctyp_desc=Ttyp_anythenNoneelseSome(read_core_typeenvcontainer typ)andread_class_signatureenvparentlabel_parentcltyp=letopenClassTypeinmatchcltyp.cltyp_descwith|Tcty_constr(p,_,params)->letp=Env.Path.read_class_typeenv.ident_env pinletparams=List.map(read_core_type envlabel_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=match doc_postwith|{elements=[];_}->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_parent cty#endifletread_class_type_declaration envparentcltd=letopenClassTypeinletid =Env.find_class_type_identifierenv.ident_envcltd.ci_id_class_type inletsource_loc=None inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainer~warnings_tag:env.warnings_tagcltd.ci_attributesinletvirtual_=(cltd.ci_virt=Virtual)inletparams=List.mapread_type_parametercltd.ci_paramsinletexpr=read_class_signature env(id:>Identifier.ClassSignature.t)containercltd.ci_exprin{id;source_loc;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_multiple container~warnings_tag:env.warnings_tagcltd.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_typeenvparent label_parentcty=letopenClassinmatch cty.cltyp_descwith|Tcty_constr _|Tcty_signature_->ClassType(read_class_signatureenvparentlabel_parentcty)|Tcty_arrow(lbl,arg,res)->letlbl=read_labellblinletarg=read_core_typeenvlabel_parent arginletres=read_class_typeenvparentlabel_parentresinArrow(lbl,arg,res)#ifOCAML_VERSION >=(4,8,0)|Tcty_open(_,cty)->read_class_type envparentlabel_parent cty#elifOCAML_VERSION >=(4,6,0)|Tcty_open(_,_,_,_,cty)->read_class_typeenvparentlabel_parentcty#endiflet read_class_description envparentcld=letopenClassinletid=Env.find_class_identifierenv.ident_envcld.ci_id_classinlet source_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc =Doc_attr.attached_no_tagcontainer~warnings_tag:env.warnings_tagcld.ci_attributesinletvirtual_=(cld.ci_virt=Virtual)inletparams =List.mapread_type_parametercld.ci_paramsinlettype_=read_class_typeenv(id:>Identifier.ClassSignature.t)containercld.ci_exprin{id;source_loc;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_multiplecontainer~warnings_tag:env.warnings_tagcld.ci_attributesinletcomments=List.map(funcom->Commentcom)commentsinletcld=read_class_description envparentcld in((Class(recursive,cld))::(List.rev_appendcommentsacc),And)end([],Ordinary)clds|>fst|>List.revletrecread_with_constraintenvglobal_parentparent(_,frag,constr)=let_=global_parentinletopenModuleTypeinmatchconstrwith|Twith_type decl->let frag=Env.Fragment.read_typefrag.Location.txtinleteq=read_type_equationenvparentdeclinTypeEq(frag,eq)|Twith_module(p,_)->letfrag=Env.Fragment.read_modulefrag.Location.txtinlet eq=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_moduleenv.ident_envpinModuleSubst(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=let openModuleTypeinmatchmty.mty_descwith|Tmty_ident(p,_)->Path{p_path=Env.Path.read_module_typeenv.ident_envp;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)->letid,env=matchid_optwith|None->Identifier.Mk.parameter(parent,ModuleName.make_std"_"),env|Someid->lete'=Env.add_parameterparentid(ModuleName.of_identid)env.ident_envinletenv ={envwithident_env=e'}inEnv.find_parameter_identifiere'id,envinletarg=read_module_typeenv(id:>Identifier.Signature.t)label_parentarginNamed{id;expr=arg;},envinletres=read_module_typeenv(Identifier.Mk.resultparent)label_parentresinFunctor(f_parameter,res)#else|Tmty_functor(id,_,arg,res)->letnew_env=Env.add_parameterparentid(ModuleName.of_identid)env.ident_envinletnew_env={envwithident_env=new_env}inletf_parameter=matcharg with|None ->Odoc_model.Lang.FunctorParameter.Unit|Somearg->let id=Ident_env.find_parameter_identifiernew_env.ident_envidinletarg=read_module_type env(id:>Identifier.Signature.t)label_parentarginNamed{FunctorParameter.id;expr=arg}inletres=read_module_type new_env (Identifier.Mk.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_desc with|Tmod_ident(p,_)->letp=Env.Path.read_moduleenv.ident_envpinTypeOf{t_desc=ModPathp;t_original_path=p;t_expansion=None}|Tmod_structure{str_items=[{str_desc=Tstr_include {incl_mod;_};_}];_}->beginmatchTypemod.path_of_module incl_modwith|Somep->letp=Env.Path.read_moduleenv.ident_envpinTypeOf{t_desc=StructIncludep;t_original_path=p;t_expansion=None}|None->!read_module_exprenvparentlabel_parentmexprend|_->!read_module_exprenvparent label_parent mexprindecl|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_typeenv.ident_envmtd.mtd_idinletsource_loc=Noneinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonical containermtd.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=matchcanonicalwith|None->None|Somes->Doc_attr.conv_canonical_module_typesin{id;source_loc;doc;canonical;expr}andread_module_declarationenvparentmd=letopenModule in#ifOCAML_VERSION>=(4,10,0)matchmd.md_idwith|None->None|Someid->letmid=Env.find_module_identifierenv.ident_envidin#elseletmid=Env.find_module_identifier env.ident_envmd.md_idin#endifletid=(mid:>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_attributesinlettype_,canonical=match md.md_type.mty_descwith|Tmty_alias(p,_)->(Alias(Env.Path.read_moduleenv.ident_envp,None),canonical)|_->letexpr,canonical=read_module_type_maybe_canonicalenv(id:>Identifier.Signature.t)container~canonical md.md_typein(ModuleTypeexpr,canonical)inletcanonical=matchcanonicalwith|None->None|Somes->Some(Doc_attr.conv_canonical_modules)inlethidden=#ifOCAML_VERSION>=(4,10,0)matchcanonical,mid.ivwith|None,(`Module(_,n)|`Parameter(_,n)|`Root(_,n))->Odoc_model.Names.ModuleName.is_hiddenn|_,_->false#elsematchcanonical,mid.ivwith|None,(`Module(_,n)|`Parameter(_,n)|`Root (_,n))->Odoc_model.Names.ModuleName.is_hiddenn|_->false#endifinSome{id;source_loc;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_multiplecontainer~warnings_tag:env.warnings_tagmd.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_moduleenv.ident_envp,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=match rec_flagwith|Recursive-> Ordinary|Nonrecursive ->Nonrecin#endifread_type_declarationsenvparentrec_flagdecls|Tsig_typexttyext->[TypExt(read_type_extensionenvparenttyext)]|Tsig_exception ext->#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_declaration envparentmtd)]|Tsig_openo->[Open(read_open env parento)]|Tsig_includeincl->read_includeenvparentincl|Tsig_classcls->read_class_descriptionsenvparentcls|Tsig_class_type cltyps->read_class_type_declarationsenvparentcltyps|Tsig_attributeattr->beginletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inmatchDoc_attr.standalonecontainer~warnings_tag:env.warnings_tagattrwith|None->[]|Somedoc->[Commentdoc]end#ifOCAML_VERSION>=(4,8,0)|Tsig_typesubst tst->read_type_substitutions envparenttst|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_identifier env.ident_envms.ms_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,()=Doc_attr.attached~warnings_tag:env.warnings_tag Odoc_model.Semantics.Expect_nonecontainerms.ms_attributesinletmanifest=Env.Path.read_moduleenv.ident_envms.ms_manifestin{id;doc;manifest}#ifOCAML_VERSION>=(4,13,0)and read_module_type_substitution envparentmtd=letopenModuleTypeSubstitutioninletid=Env.find_module_typeenv.ident_envmtd.mtd_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,()=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_nonecontainermtd.mtd_attributesinletexpr=matchopt_map(read_module_typeenv(id:>Identifier.Signature.t)container)mtd.mtd_typewith|None->assert false|Somex->xin{id;doc;manifest=expr;}#endif#endifandread_includeenvparentincl=letopenIncludeinletloc=Doc_attr.read_locationincl.incl_locinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,status=Doc_attr.attached ~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_statuscontainerincl.incl_attributesinletcontent,shadowed=Cmi.read_signature_noenvenvparent(Odoc_model.Compat.signatureincl.incl_type)inletexpr=read_module_typeenvparentcontainerincl.incl_modinletumty=Odoc_model.Lang.umty_of_mtyexprinletexpansion={content;shadowed;}inmatchumtywith|Someuexpr->letdecl=Include.ModuleTypeuexprin[Include{parent;doc;decl;expansion;status;strengthened=None;loc}]|_->content.itemsandread_openenvparento=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tagcontainer~warnings_tag:env.warnings_tago.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->lete'=Env.add_signature_tree_itemsparentsgenv.ident_envinletenv={envwithident_env=e'}inletitems,(doc,doc_post),tags=letclassifyitem=matchitem.sig_descwith|Tsig_attributeattr->Some(`Attributeattr)|Tsig_open_->Some`Open|_->NoneinDoc_attr.extract_top_commentinternal_tags~warnings_tag:env.warnings_tag~classifyparentsg.sig_itemsinletitems=List.fold_left(funitemsitem->List.rev_append(read_signature_itemenvparentitem)items)[]items|>List.revinmatchdoc_postwith|{elements=[];_}->({Signature.items;compiled=false;removed=[];doc},tags)|_->({Signature.items=Comment(`Docsdoc_post)::items;compiled=false;removed=[];doc},tags)letread_interfacerootname~warnings_tagintf=letid=Identifier.Mk.root(root,Odoc_model.Names.ModuleName.make_stdname)inletsg,canonical=read_signatureOdoc_model.Semantics.Expect_canonical{ident_env=Env.empty();warnings_tag}idintfinletcanonical=matchcanonicalwith|None->None|Somes->Some(Doc_attr.conv_canonical_modules)in(id,sg,canonical)