123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990(*
* 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;}letcmti_builddir:string ref=ref""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#ifdefinedOXCAML(* TODO: presumably we want the layout in these first two cases,
eventually *)|Ttyp_var(None,_layout)->Any|Ttyp_var (Some s,_layout)->Vars#else|Ttyp_any->Any|Ttyp_vars->Vars#endif#ifdefinedOXCAML|Ttyp_arrow(lbl,arg,_,res,_)->#else|Ttyp_arrow(lbl,arg,res)->#endifletlbl=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(_))|Some(RawOptional(_))->letarg'=match arg.ctyp_descwith|Ttyp_constr(_,_,param::_)->param|_->arginread_core_type envcontainerarg'#elseletarg=read_core_typeenvcontainerarg#endifinletres=read_core_typeenvcontainerresinArrow(lbl,arg,res)|Ttyp_tupletyps->#ifOCAML_VERSION>=(5,4,0)||definedOXCAMLlettyps=List.map(fun(lbl,x)->lbl,read_core_typeenvcontainerx)typsin#elselettyps=List.map(funx->None,read_core_typeenvcontainerx)typsin#endifTupletyps#ifdefinedOXCAML|Ttyp_unboxed_tupletyps->lettyps=List.map(fun(l,t)->l,read_core_typeenvcontainert)typsinUnboxed_tupletyps#endif|Ttyp_constr(p,_,params)->letp=Env.Path.read_type env.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_type envcontainer typ})#elifOCAML_VERSION<(4,8,0)(function|OTtag(name,_,typ)->Method{name=name.txt;type_ =read_core_typeenvcontainertyp;}|OTinherittyp->Inherit(read_core_type envcontainertyp))#else(function|{of_desc=OTtag(name,typ);_}->Method{name=name.txt;type_=read_core_typeenvcontainertyp;}|{of_desc=OTinherittyp;_}->Inherit(read_core_typeenv containertyp))#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)#ifdefinedOXCAML|Ttyp_alias(typ,var,_layout)->((* TODO: presumably we want the layout, eventually *)#else|Ttyp_alias(typ,var)->(#endiflettyp=read_core_typeenvcontainertypin#ifdefinedOXCAMLmatchvarwith|None -> typ|Somevar->#endif#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#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_tag~warnings_tag:env.warnings_tagcontainer attributesinConstructor{name;constant;arguments;doc}|Tinherittyp->Type(read_core_typeenvcontainer typ)endinletkind=ifclosed=Asttypes.OpenthenOpenelsematchpresentwith|None->Fixed|Somenames->ClosednamesinPolymorphic_variant{kind;elements}|Ttyp_poly([],typ)->read_core_typeenvcontainertyp#ifdefinedOXCAML|Ttyp_poly(vars,typ)->(* TODO: presumably want the layouts, eventually *)Poly(List.mapfstvars,read_core_typeenvcontainertyp)#else|Ttyp_poly(vars,typ)->Poly(vars,read_core_typeenvcontainertyp)#endif#ifOCAML_VERSION>=(5,5,0)|Ttyp_package {tpt_path=pack_path;tpt_constraints=pack_fields;_}->#elif OCAML_VERSION>=(5,4,0)|Ttyp_package{tpt_path =pack_path;tpt_cstrs=pack_fields;_}->#else|Ttyp_package{pack_path;pack_fields;_}->#endifletpkg=read_package envcontainerpack_pathpack_fieldsinPackagepkg#ifOCAML_VERSION>=(5,2,0)|Ttyp_open (_p,_l,t)->(* TODO: adjust model *)read_core_typeenvcontainert#endif#ifdefinedOXCAML|Ttyp_quotetyp->Quote(read_core_typeenvcontainertyp)|Ttyp_splicetyp->Splice(read_core_typeenvcontainertyp)|Ttyp_call_pos->Constr(Env.Path.read_type env.ident_envPredef.path_lexing_position,[])|Ttyp_of_kind_->assertfalse|Ttyp_repr_->Any(* oxcaml: representation annotations are ignored *)#elifOCAML_VERSION>=(5,5,0)|Ttyp_functor(lbl,id,pkg,ret_type)->letlbl=read_labellblinletparent=Identifier.fresh_module_arg_parent()inlete',id=Env.add_module_arg parentid.txt(ModuleName.hidden_of_identid.txt)env.ident_envinletenv={envwithident_env=e'}inletret=read_core_typeenvcontainerret_typeinletpackage =read_package envcontainerpkg.tpt_pathpkg.tpt_constraintsinArrow_functor(lbl,{id;package},ret)#endifandread_packageenvcontainerpack_pathpack_fields=letopenTypeExpr.Packageinletpath=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_fieldsin{path;substitutions}letread_value_descriptionenvparentvd=letopenSignature inletid=Env.find_value_identifierenv.ident_env vd.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_primwith|[]-> Value.Abstract|primitives->ExternalprimitivesinValue{Value.id;source_loc;doc;type_;value}letread_type_parameter(ctyp,var_and_injectivity)=letopenTypeDeclinletdesc=match ctyp.ctyp_descwith#ifdefinedOXCAML(* TODO: presumably we want the layouts below, eventually *)|Ttyp_var (None,_layout)->Any|Ttyp_var(Somes,_layout)->Vars#else|Ttyp_any->Any|Ttyp_vars->Vars#endif|_->assertfalseinletvariance,injectivity =#ifOCAML_VERSION<(4,12,0)letvar=matchvar_and_injectivity with|Covariant ->SomePos|Contravariant->Some Neg|Invariant->Noneinvar,false#elseletvar=matchfstvar_and_injectivitywith|Covariant->SomePos|Contravariant->Some Neg#ifOCAML_VERSION>=(5,4,0)|Bivariant->SomeBivariant#endif|NoVariance->None inletinjectivity=matchsndvar_and_injectivitywith|Injective->true|NoInjectivity->falseinvar,injectivity#endifin{desc;variance;injectivity}#ifdefinedOXCAMLletis_mutable=Types.is_mutable#elseletis_mutableld=ld=Mutable#endifletread_label_declarationenvparent label_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_=is_mutableld.ld_mutableinlettype_=read_core_typeenvlabel_parentld.ld_typein{id;doc;mutable_;type_}letread_unboxed_label_declaration envparentlabel_parentld=letopenTypeDecl.UnboxedFieldinletopenOdoc_model.Namesinletname=Ident.nameld.ld_idinletid=Identifier.Mk.unboxed_field(parent,UnboxedFieldName.make_stdname)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_taglabel_parentld.ld_attributesinletmutable_=is_mutableld.ld_mutable inlettype_=read_core_typeenvlabel_parentld.ld_typein{id;doc;mutable_;type_}letread_constructor_declaration_arguments envparentlabel_parentarg=letopen TypeDecl.Constructorin#ifOCAML_VERSION<(4,3,0)ignoreparent;Tuple(List.map(read_core_typeenvlabel_parent)arg)#elsematchargwith|Cstr_tupleargs ->#ifdefinedOXCAMLTuple(List.map(funarg->read_core_typeenvlabel_parentarg.ca_type)args)#elseTuple(List.map(funarg->read_core_type envlabel_parentarg)args)#endif|Cstr_record lds->Record(List.map(read_label_declarationenvparentlabel_parent)lds)#endifletread_constructor_declarationenvparentcd=letopenTypeDecl.Constructor inletid=Ident_env.find_constructor_identifierenv.ident_envcd.cd_idinletcontainer=(parent :>Identifier.FieldParent.t)inlet label_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_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)inlet lbls=List.map(read_label_declarationenvparentlabel_parent)lblsinSome(Recordlbls)#ifdefinedOXCAML|Ttype_record_unboxed_productlbls->letparent=(parent:>Identifier.UnboxedFieldParent.t)inletlabel_parent=(parent:>Identifier.LabelParent.t)inletlbls =List.map(read_unboxed_label_declaration envparent label_parent)lblsinSome(Record_unboxed_productlbls)#endif|Ttype_open->SomeExtensible#ifOCAML_VERSION>=(5,5,0)|Ttype_external _->None#endifletread_type_equationenvcontainerdecl=letopenTypeDecl.Equationinletparams=List.mapread_type_parameterdecl.typ_paramsinletprivate_=(decl.typ_private=Private)inletmanifest=opt_map(read_core_typeenvcontainer)decl.typ_manifest inletconstraints=List.map(fun(typ1,typ2,_)->(read_core_typeenvcontainertyp1,read_core_typeenvcontainertyp2))#ifOCAML_VERSION >=(5,5,0)decl.typ_constraints#elsedecl.typ_cstrs#endifin{params;private_;manifest;constraints}letread_type_declarationenvparentdecl=letopenTypeDecl inletid=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_declarationsenvparentrec_flagdecls=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletitems=letopenSignatureinList.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_attributes inletcomments=List.map(funcom->Comment com)commentsinletdecl=read_type_declarationenvparentdeclin((Type(recursive,decl))::(List.rev_appendcommentsacc),And)end)([],rec_flag)decls|>fstinList.revitems#ifOCAML_VERSION>=(4,8,0)letread_type_substitutionsenvparentdecls=List.map (fundecl->Odoc_model.Lang.Signature.TypeSubstitution(read_type_declaration envparent decl))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_tag label_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}letread_type_extensionenvparenttyext=letopenExtensioninlettype_path=Env.Path.read_typeenv.ident_envtyext.tyext_path inletcontainer=(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_containerargsinletres=opt_map(read_core_typeenvlabel_container)resin{id;source_loc;doc;args;res}letrecread_class_type_fieldenvparentctf=let openClassSignatureinletopenOdoc_model.Namesinletcontainer=(parent:Identifier.ClassSignature.t:>Identifier.LabelParent.t)inletdoc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_tagcontainerctf.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_typeenvcontainer typinSome(Method{id;doc;private_;virtual_;type_})|Tctf_constraint(typ1,typ2)->letleft=read_core_typeenvcontainertyp1inletright=read_core_type envcontainertyp2inSome(Constraint{left;right;doc})|Tctf_inheritcltyp->letexpr=read_class_signatureenvparentcontainercltypinSome(Inherit {expr;doc})|Tctf_attribute attr->matchDoc_attr.standalone container~warnings_tag:env.warnings_tagattrwith|None->None|Somedoc->Some(Commentdoc)andread_self_type envcontainertyp=matchtyp.ctyp_descwith#ifdefinedOXCAML|Ttyp_var(None,_)->None#else|Ttyp_any->None#endif|_->Some(read_core_typeenvcontainertyp)andread_class_signatureenvparentlabel_parentcltyp=let openClassTypeinmatchcltyp.cltyp_descwith|Tcty_constr(p,_,params)->letp=Env.Path.read_class_typeenv.ident_envpinletparams=List.map(read_core_typeenv label_parent)paramsinConstr(p,params)|Tcty_signaturecsig->letopenClassSignature inletself=read_self_typeenvlabel_parentcsig.csig_selfinletitems=List.fold_left(funrestitem->matchread_class_type_fieldenvparentitemwith|None->rest|Someitem->item::rest)[]csig.csig_fieldsinletitems=List.revitemsinlet items,(doc,doc_post)=Doc_attr.extract_top_comment_classitemsinletitems=matchdoc_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_parentcty#endifletread_class_type_declaration envparentcltd=letopenClassType inletid=Env.find_class_type_identifierenv.ident_env cltd.ci_id_class_typeinletsource_loc=Noneinletcontainer=(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_parameter cltd.ci_paramsinletexpr=read_class_signatureenv(id:>Identifier.ClassSignature.t)container cltd.ci_exprin{id;source_loc;doc;virtual_;params;expr;expansion=None}letread_class_type_declarationsenvparentcltds=letcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inlet openSignatureinList.fold_leftbeginfun(acc,recursive)cltd->letcomments=Doc_attr.standalone_multiplecontainer~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_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_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_parameter cld.ci_paramsinlettype_=read_class_type env(id:>Identifier.ClassSignature.t)containercld.ci_exprin{id;source_loc;doc;virtual_;params;type_;expansion=None}letread_class_descriptions envparentclds=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_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_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=letopenModuleTypeinmatchmty.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_noneenvparentsg inSignaturesg#ifOCAML_VERSION>=(4,10,0)#ifdefinedOXCAML|Tmty_functor(parameter,res,_)->#else|Tmty_functor(parameter,res)->#endifletf_parameter,env =matchparameterwith|Unit-> FunctorParameter.Unit,env#ifdefinedOXCAML|Named(id_opt,_,arg,_)->#else|Named(id_opt,_,arg)->#endifletid,env=matchid_opt with|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=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_typeenvparent label_parentbodyinletsubs=List.map(read_with_constraintenvparentlabel_parent)subsinmatchOdoc_model.Lang.umty_of_mtybodywith|Some w_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_env pinTypeOf{t_desc=ModPathp;t_original_path=p;t_expansion=None}|Tmod_structure {str_items=[{str_desc=Tstr_include{incl_mod;_};_}];_}->begin#ifOCAML_VERSION>=(5,5,0)matchTypedtree.path_of_moduleincl_modwith#elsematchTypemod.path_of_moduleincl_modwith#endif|Some p->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_expr envparentlabel_parentmexprindecl|Tmty_alias_->assertfalse#ifdefinedOXCAML|Tmty_strengthen(mty,path,_)->letmty=read_module_typeenvparentlabel_parentmtyinlets_path=Env.Path.read_module env.ident_envpathinmatchOdoc_model.Lang.umty_of_mtymtywith|Somes_expr->(* We always strengthen with aliases *)Strengthen {s_expr;s_path;s_aliasable=true;s_expansion=None}|None ->failwith"invalid Tmty_strengthen"#endif(** 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. *)and read_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_canonicalcontainermtd.mtd_attributes inletexpr,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=letopenModulein#ifOCAML_VERSION>=(4,10,0)match md.md_idwith|None->None|Someid->letmid=Env.find_module_identifier env.ident_envidin#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_tag Odoc_model.Semantics.Expect_canonicalcontainermd.md_attributesinlettype_,canonical=matchmd.md_type.mty_descwith|Tmty_alias(p,_)->(Alias(Env.Path.read_moduleenv.ident_envp,None),canonical)|_->letexpr,canonical=read_module_type_maybe_canonical env(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#elsematch canonical,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_append comments acc),And)|None ->acc,recursive)([],Rec)mds|>fst|>List.revandread_module_equationenvp=letopenModuleinAlias (Env.Path.read_moduleenv.ident_envp,None)andread_signature_item envparentitem=letopen Signatureinmatchitem.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_declarations envparentrec_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_module md ->beginmatchread_module_declarationenvparentmdwith|Somem->[Module(Ordinary,m)]|None->[]end|Tsig_recmodulemds ->read_module_declarationsenvparent mds|Tsig_modtypemtd->[ModuleType(read_module_type_declarationenvparentmtd)]|Tsig_open o->[Open(read_openenvparento)]#ifdefinedOXCAML|Tsig_include(incl,_)->#else|Tsig_includeincl->#endifread_includeenvparentincl|Tsig_classcls->read_class_descriptions envparentcls|Tsig_class_typecltyps->read_class_type_declarations envparent cltyps|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_substitutionsenvparenttst|Tsig_modsubstmst->[ModuleSubstitution (read_module_substitutionenvparentmst)]#ifOCAML_VERSION>=(4,13,0)|Tsig_modtypesubstmtst->[ModuleTypeSubstitution(read_module_type_substitutionenvparentmtst)]#endif#ifdefinedOXCAML|Tsig_jkind_->[]#endifandread_module_substitutionenvparentms=letopenModuleSubstitutioninletid=Env.find_module_identifierenv.ident_envms.ms_idinletcontainer=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,()=Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_nonecontainerms.ms_attributesinletmanifest=Env.Path.read_moduleenv.ident_envms.ms_manifestin{id;doc;manifest}#ifOCAML_VERSION>=(4,13,0)andread_module_type_substitutionenvparentmtd=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->assertfalse|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)in(* Use a synthetic parent for the include's module type expression to avoid
identifier conflicts with items in the enclosing signature. Items inside
the include expression (like TypeSubstitutions) will get identifiers under
this synthetic parent, which won't clash with the real parent's items. *)letinclude_parent=Identifier.fresh_include_parentparentinletinclude_container=(include_parent:>Identifier.LabelParent.t)inletexpr=read_module_typeenvinclude_parentinclude_containerincl.incl_modinletumty=Odoc_model.Lang.umty_of_mtyexprinletexpansion={content;shadowed;}in#ifdefinedOXCAMLmatchumty,incl.incl_kindwith|Someuexpr,Tincl_structure->#elsematchumtywith|Someuexpr->#endifletdecl=Include.ModuleTypeuexprin[Include{parent;doc;decl;expansion;status;strengthened=None;loc}]|_->(* TODO: Handle [include functor] *)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)