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_typeenvcontainertyp))#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)->lettyp=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.mapbeginfunfield->#ifOCAML_VERSION>=(4,8,0)matchfield.rf_descwith|Ttag(name,constant,arguments)->letattributes=field.rf_attributesin#elsematchfield with|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_tag~warnings_tag:env.warnings_tagcontainerattributesinConstructor{name;constant;arguments;doc}|Tinherit typ->Type(read_core_typeenvcontainertyp)endinletkind=ifclosed=Asttypes.Openthen Openelsematchpresentwith|None->Fixed|Somenames ->ClosednamesinPolymorphic_variant{kind;elements}|Ttyp_poly([],typ)->read_core_type envcontainertyp|Ttyp_poly(vars,typ)->Poly(vars,read_core_typeenvcontainer typ)|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_typeenvcontainertypin(frag,typ))pack_fieldsinPackage{path;substitutions}#ifOCAML_VERSION>=(5,2,0)|Ttyp_open(_p,_l,t)->(* TODO: adjust model *)read_core_typeenvcontainert#endifletread_value_descriptionenvparentvd=letopenSignatureinletid=Env.find_value_identifierenv.ident_envvd.val_idinletsource_loc=Noneinlet container=(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_primwith|[]->Value.Abstract|primitives->ExternalprimitivesinValue{Value.id;source_loc;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 ->Some Neg|Invariant->Noneinvar,false#elseletvar=match fstvar_and_injectivity with|Covariant->SomePos|Contravariant->SomeNeg|NoVariance->Noneinletinjectivity=matchsndvar_and_injectivitywith|Injective->true|NoInjectivity ->falseinvar,injectivity#endifin{desc;variance;injectivity}letread_label_declarationenv parentlabel_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)ignore parent;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)inlet doc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_taglabel_containercd.cd_attributesinletargs=read_constructor_declaration_argumentsenvcontainerlabel_containercd.cd_argsinletres=opt_map(read_core_type envlabel_container)cd.cd_res in{id;doc;args;res}letread_type_kindenvparent=letopenTypeDecl.Representationinfunction|Ttype_abstract ->None|Ttype_variant cstrs->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_equation envcontainerdecl=let openTypeDecl.Equationinletparams =List.map read_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_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_canonical containerdecl.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_declarationsenvparent rec_flagdecls=let container=(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->Comment com)commentsinletdecl=read_type_declarationenvparentdeclin((Type(recursive,decl))::(List.rev_append commentsacc),And)end)([],rec_flag)decls|>fstinList.revitems#ifOCAML_VERSION>=(4,8,0)let read_type_substitutionsenvparentdecls=List.map(fundecl->Odoc_model.Lang.Signature.TypeSubstitution (read_type_declarationenvparentdecl))decls#endifletread_extension_constructorenvparentext=letopenExtension.Constructorinletid=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_attributesinmatchext.ext_kindwith|Text_rebind _->assertfalse#if OCAML_VERSION>=(4,14,0)|Text_decl(_,args,res)->#else|Text_decl(args,res)->#endifletargs=read_constructor_declaration_argumentsenv containerlabel_containerargsinletres =opt_map(read_core_typeenv label_container)resin{id;source_loc;doc;args;res}letread_type_extensionenvparenttyext=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_tag containertyext.tyext_attributesinlettype_params =List.mapread_type_parameter tyext.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_->assert false#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}letrecread_class_type_fieldenvparentctf=letopenClassSignatureinletopenOdoc_model.Namesinletcontainer=(parent:Identifier.ClassSignature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainerctf.ctf_attributesinmatchctf.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)inlet virtual_=(virtual_=Virtual)inlettype_=read_core_typeenvcontainertypinSome(Method{id;doc;private_;virtual_;type_})|Tctf_constraint(typ1,typ2)->letleft=read_core_typeenvcontainertyp1inletright=read_core_type envcontainertyp2inSome(Constraint{left;right;doc})|Tctf_inherit cltyp->letexpr=read_class_signatureenvparentcontainercltyp inSome(Inherit {expr;doc})|Tctf_attribute attr->matchDoc_attr.standalonecontainer~warnings_tag:env.warnings_tagattrwith|None->None|Somedoc->Some(Commentdoc)andread_self_typeenvcontainertyp=iftyp.ctyp_desc=Ttyp_anythenNoneelseSome(read_core_typeenvcontainertyp)andread_class_signatureenvparentlabel_parentcltyp=letopen ClassType inmatchcltyp.cltyp_descwith|Tcty_constr(p,_,params)->let p=Env.Path.read_class_typeenv.ident_envpinletparams=List.map(read_core_typeenvlabel_parent)paramsinConstr(p,params)|Tcty_signature csig->letopenClassSignatureinletself=read_self_typeenvlabel_parentcsig.csig_selfinletitems=List.fold_left(funrestitem->matchread_class_type_field envparentitemwith|None-> rest|Some item-> item::rest)[]csig.csig_fieldsinletitems=List.revitemsinletitems,(doc,doc_post)=Doc_attr.extract_top_comment_class itemsinletitems=matchdoc_postwith|{elements=[];_}->items|_->Comment (`Docs doc_post)::itemsinSignature{self;items;doc}|Tcty_arrow _-> assertfalse#ifOCAML_VERSION>=(4,8,0)|Tcty_open(_,cty)->read_class_signatureenvparentlabel_parentcty#elif OCAML_VERSION>=(4,6,0)|Tcty_open (_,_,_,_,cty)->read_class_signatureenvparent label_parentcty#endifletread_class_type_declarationenvparentcltd=letopen ClassTypeinletid=Env.find_class_type_identifierenv.ident_envcltd.ci_id_class_typeinletsource_loc=Noneinletcontainer=(parent :Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag container~warnings_tag:env.warnings_tagcltd.ci_attributesinletvirtual_=(cltd.ci_virt=Virtual)inletparams=List.mapread_type_parametercltd.ci_paramsinletexpr=read_class_signatureenv(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_left beginfun(acc,recursive)cltd->letcomments=Doc_attr.standalone_multiplecontainer~warnings_tag:env.warnings_tagcltd.ci_attributesinletcomments=List.map(funcom->Comment com)commentsinletcltd=read_class_type_declarationenvparent cltdin((ClassType(recursive,cltd))::(List.rev_appendcommentsacc),And)end([],Ordinary)cltds|> fst|>List.revletrecread_class_typeenvparentlabel_parentcty=letopenClassinmatchcty.cltyp_desc with|Tcty_constr _|Tcty_signature_->ClassType(read_class_signature env parentlabel_parentcty)|Tcty_arrow(lbl,arg,res)->let lbl=read_labellblinletarg=read_core_type envlabel_parentarginletres=read_class_type envparentlabel_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_identifierenv.ident_envcld.ci_id_classinletsource_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_descriptionenvparentcldin((Class(recursive,cld))::(List.rev_appendcommentsacc),And)end([],Ordinary)clds|>fst|>List.revletrecread_with_constraint envglobal_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.txtinlet eq=read_module_equationenvpinModuleEq(frag,eq)|Twith_typesubstdecl->let frag=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.txt inletmty=read_module_type envglobal_parentparentmtyinModuleTypeSubst(frag,mty)#endifand read_module_typeenvparentlabel_parentmty=letopenModuleTypeinmatchmty.mty_descwith|Tmty_ident(p,_)->Path {p_path=Env.Path.read_module_typeenv.ident_env p;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_type env(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=matchargwith|None->Odoc_model.Lang.FunctorParameter.Unit|Somearg->letid=Ident_env.find_parameter_identifiernew_env.ident_envidinletarg=read_module_typeenv(id:>Identifier.Signature.t)label_parentarginNamed{FunctorParameter.id;expr=arg }inletres=read_module_typenew_env(Identifier.Mk.resultparent)label_parentresinFunctor(f_parameter,res)#endif|Tmty_with(body,subs)->(letbody=read_module_typeenvparentlabel_parentbody inletsubs=List.map(read_with_constraintenv parentlabel_parent)subsinmatchOdoc_model.Lang.umty_of_mtybodywith|Somew_expr->With{w_substitutions=subs;w_expansion=None;w_expr}|None->failwith"error")|Tmty_typeof mexpr ->letdecl=matchmexpr.mod_descwith|Tmod_ident(p,_)->letp=Env.Path.read_moduleenv.ident_envpinTypeOf {t_desc =ModPath p;t_original_path=p;t_expansion =None}|Tmod_structure {str_items=[{str_desc=Tstr_include{incl_mod;_};_}];_}->beginmatch Typemod.path_of_moduleincl_modwith|Somep->letp=Env.Path.read_moduleenv.ident_env pinTypeOf{t_desc=StructIncludep;t_original_path=p;t_expansion=None}|None->!read_module_exprenvparentlabel_parentmexprend|_->!read_module_exprenvparentlabel_parent mexpr indecl|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_signature sg->letsg,canonical=read_signatureOdoc_model.Semantics.Expect_canonicalenvparentsgin(ModuleType.Signaturesg,canonical)|_,_->(read_module_type envparentcontainermty,canonical)andread_module_type_declarationenvparentmtd=letopenModuleTypeinletid=Env.find_module_typeenv.ident_envmtd.mtd_idinletsource_loc =None inletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonicalcontainermtd.mtd_attributes inletexpr,canonical=matchmtd.mtd_typewith|Somemty->letexpr,canonical=read_module_type_maybe_canonicalenv(id:>Identifier.Signature.t)container~canonical mtyin(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=letopenModulein#ifOCAML_VERSION >=(4,10,0)matchmd.md_idwith|None->None|Someid->letmid=Env.find_module_identifierenv.ident_env idin#elseletmid=Env.find_module_identifierenv.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_attributes inlettype_,canonical=matchmd.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~canonicalmd.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(fun com ->Commentcom)commentsinmatchread_module_declarationenvparentmdwith|Somemd->((Module(recursive,md))::(List.rev_appendcommentsacc),And)|None->acc,recursive)([],Rec)mds|>fst|>List.revandread_module_equation envp=letopenModuleinAlias(Env.Path.read_moduleenv.ident_envp,None)andread_signature_itemenvparentitem=letopenSignatureinmatchitem.sig_desc with|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_declarationsenvparent rec_flagdecls|Tsig_typexttyext->[TypExt(read_type_extensionenvparenttyext)]|Tsig_exceptionext->#ifOCAML_VERSION>=(4,8,0)[Exception(read_exception envparentext.tyexn_constructor)]#else[Exception(read_exceptionenvparentext)]#endif|Tsig_modulemd->beginmatchread_module_declarationenvparentmdwith|Somem->[Module(Ordinary,m)]|None->[]end|Tsig_recmodulemds->read_module_declarations envparentmds|Tsig_modtypemtd->[ModuleType(read_module_type_declarationenvparentmtd)]|Tsig_openo->[Open(read_openenvparento)]|Tsig_includeincl->read_includeenvparentincl|Tsig_classcls->read_class_descriptions envparentcls|Tsig_class_typecltyps ->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_substitution envparent ms=letopenModuleSubstitutioninletid=Env.find_module_identifierenv.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_substitutionenvparentmtd=letopenModuleTypeSubstitutioninletid=Env.find_module_type env.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->assertfalse|Somex-> xin{id;doc;manifest=expr;}#endif#endifandread_includeenvparentincl=letopenInclude inlet loc=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)