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 representationincludes it explicitly. *)letarg=match lblwith|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_typeenvcontainerarg#endifinletres=read_core_typeenvcontainerresinArrow(lbl,arg,res)|Ttyp_tupletyps->#ifOCAML_VERSION>=(5,4,0)||defined OXCAMLlettyps=List.map(fun(lbl,x)->lbl,read_core_type envcontainerx)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_typeenv.ident_env pinletparams=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_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_typeenvcontainertyp in#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_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#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;_}->#elifOCAML_VERSION>=(5,4,0)|Ttyp_package{tpt_path=pack_path;tpt_cstrs=pack_fields;_}->#else|Ttyp_package{pack_path;pack_fields;_}->#endifletpkg=read_packageenvcontainerpack_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_typeenvcontainer typ)|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_typeenv containerret_typeinletpackage=read_packageenvcontainerpkg.tpt_path pkg.tpt_constraintsinArrow_functor(lbl,{id;package},ret)#endifandread_package envcontainerpack_pathpack_fields=letopenTypeExpr.Packageinletpath=Env.Path.read_module_typeenv.ident_envpack_pathinletsubstitutions =List.map(fun(frag,typ)->let frag=Env.Fragment.read_typefrag.Location.txtinlettyp=read_core_typeenvcontainertypin(frag,typ))pack_fieldsin{path;substitutions}letread_value_descriptionenvparentvd=letopenSignatureinletid=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_primwith|[]->Value.Abstract|primitives->External primitivesinValue{Value.id;source_loc;doc;type_;value}letread_type_parameter (ctyp,var_and_injectivity)=letopenTypeDeclinletdesc=matchctyp.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_injectivitywith|Covariant->SomePos|Contravariant -> SomeNeg|Invariant->Noneinvar,false#elseletvar=matchfst var_and_injectivitywith|Covariant ->SomePos|Contravariant ->SomeNeg#ifOCAML_VERSION>=(5,4,0)|Bivariant->SomeBivariant#endif|NoVariance->Noneinletinjectivity=matchsndvar_and_injectivitywith|Injective->true|NoInjectivity ->falseinvar,injectivity#endifin{desc;variance;injectivity}#ifdefinedOXCAMLletis_mutable=Types.is_mutable#elseletis_mutableld=ld=Mutable#endifletread_label_declarationenvparentlabel_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_mutable ld.ld_mutableinlettype_=read_core_typeenvlabel_parentld.ld_typein{id;doc;mutable_;type_}letread_unboxed_label_declarationenvparentlabel_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_mutableinlettype_ =read_core_typeenvlabel_parent ld.ld_typein{id;doc;mutable_;type_}letread_constructor_declaration_argumentsenvparentlabel_parent arg =letopenTypeDecl.Constructorin#ifOCAML_VERSION<(4,3,0)ignoreparent;Tuple(List.map(read_core_typeenvlabel_parent)arg)#elsematchargwith|Cstr_tupleargs ->#ifdefinedOXCAMLTuple(List.map(fun arg->read_core_typeenv label_parentarg.ca_type)args)#elseTuple(List.map(funarg->read_core_typeenvlabel_parentarg)args)#endif|Cstr_recordlds->Record(List.map(read_label_declarationenvparentlabel_parent)lds)#endifletread_constructor_declarationenvparentcd=letopen TypeDecl.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.Representationinfunction|Ttype_abstract->None|Ttype_variant cstrs->letcstrs=List.map(read_constructor_declarationenvparent)cstrsinSome(Variantcstrs)|Ttype_record lbls->letparent=(parent:>Identifier.FieldParent.t)inletlabel_parent=(parent:>Identifier.LabelParent.t)inletlbls=List.map(read_label_declarationenvparentlabel_parent)lblsinSome (Recordlbls)#ifdefined OXCAML|Ttype_record_unboxed_productlbls->letparent=(parent :>Identifier.UnboxedFieldParent.t)inletlabel_parent=(parent:>Identifier.LabelParent.t)inletlbls=List.map(read_unboxed_label_declarationenvparentlabel_parent)lblsinSome(Record_unboxed_product lbls)#endif|Ttype_open->SomeExtensible#ifOCAML_VERSION>=(5,5,0)|Ttype_external_->None#endifletread_type_equationenvcontainer decl=letopenTypeDecl.Equationinletparams=List.mapread_type_parameterdecl.typ_paramsinletprivate_=(decl.typ_private=Private)inlet manifest =opt_map(read_core_typeenvcontainer)decl.typ_manifest inletconstraints=List.map(fun(typ1,typ2,_)->(read_core_typeenvcontainer typ1,read_core_typeenvcontainertyp2))#ifOCAML_VERSION>=(5,5,0)decl.typ_constraints#elsedecl.typ_cstrs#endifin{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=matchcanonical with|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=letopenSignatureinList.fold_left(fun(acc,recursive)decl->ifBtype.is_row_name(Ident.namedecl.typ_id)then(acc,recursive)else beginletcomments=Doc_attr.standalone_multiplecontainer~warnings_tag:env.warnings_tag decl.typ_attributes inlet comments=List.map(funcom->Commentcom)commentsinletdecl=read_type_declaration envparentdeclin((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_declarationenvparentdecl))decls#endifletread_extension_constructor env parentext=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_container ext.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;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_constructor envparent)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_argumentsenv containerlabel_containerargsinletres=opt_map (read_core_typeenvlabel_container)resin{id;source_loc;doc;args;res}letrecread_class_type_field envparentctf=letopenClassSignatureinletopenOdoc_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)inlet type_=read_core_typeenvcontainertypinSome(InstanceVariable {id;doc;mutable_;virtual_;type_})|Tctf_method(name,private_,virtual_,typ)->letopenMethodinletid=Identifier.Mk.method_(parent,MethodName.make_std name)inlet private_=(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_typeenvcontainertyp2inSome (Constraint{left;right;doc})|Tctf_inheritcltyp->letexpr=read_class_signatureenv parentcontainercltypinSome(Inherit{expr;doc})|Tctf_attribute attr->matchDoc_attr.standalonecontainer~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_signature envparent label_parentcltyp=letopenClassTypeinmatchcltyp.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_signaturecsig->letopenClassSignatureinletself=read_self_typeenvlabel_parent csig.csig_selfinletitems=List.fold_left(funrestitem->matchread_class_type_fieldenvparentitemwith|None->rest|Someitem->item ::rest)[]csig.csig_fieldsinlet items=List.revitemsinletitems,(doc,doc_post)=Doc_attr.extract_top_comment_class items inlet items=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#elifOCAML_VERSION>=(4,6,0)|Tcty_open(_,_,_,_,cty)->read_class_signatureenvparentlabel_parentcty#endifletread_class_type_declarationenvparentcltd=letopenClassTypeinletid=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_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_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.revlet recread_class_typeenvparentlabel_parentcty=letopenClass inmatchcty.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_typeenvparent label_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_class inletsource_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_descriptionsenvparent clds=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_module env.ident_envpinModuleSubst(frag,p)#ifOCAML_VERSION>=(4,13,0)|Twith_modtypemty->letfrag=Env.Fragment.read_module_typefrag.Location.txtinletmty=read_module_typeenvglobal_parent parent mtyinModuleTypeEq(frag,mty)|Twith_modtypesubstmty->letfrag=Env.Fragment.read_module_typefrag.Location.txtinletmty=read_module_type envglobal_parent parentmtyinModuleTypeSubst(frag,mty)#endifandread_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)#ifdefinedOXCAML|Tmty_functor(parameter,res,_)->#else|Tmty_functor(parameter,res)->#endifletf_parameter,env=matchparameter with|Unit->FunctorParameter.Unit,env#ifdefinedOXCAML|Named(id_opt,_,arg,_)->#else|Named(id_opt,_,arg)->#endifletid,env=matchid_optwith|None->Identifier.Mk.parameter(parent,ModuleName.make_std"_"),env|Some id->lete'=Env.add_parameterparentid(ModuleName.of_identid)env.ident_envinletenv={envwithident_env=e'}inEnv.find_parameter_identifier e'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_parameter parentid(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_identifier new_env.ident_envidinletarg=read_module_typeenv(id:>Identifier.Signature.t)label_parentarginNamed{FunctorParameter.id;expr=arg}inlet res=read_module_typenew_env(Identifier.Mk.resultparent)label_parentresinFunctor(f_parameter,res)#endif|Tmty_with(body,subs)->(letbody=read_module_typeenvparentlabel_parentbodyinletsubs=List.map(read_with_constraintenvparent label_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=match mexpr.mod_descwith|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;_};_}];_}->begin#ifOCAML_VERSION>=(5,5,0)match Typedtree.path_of_moduleincl_modwith#elsematchTypemod.path_of_moduleincl_modwith#endif|Somep->let p=Env.Path.read_moduleenv.ident_envpinTypeOf{t_desc=StructIncludep;t_original_path =p;t_expansion=None}|None->!read_module_exprenvparentlabel_parentmexprend|_->!read_module_exprenvparentlabel_parentmexprindecl|Tmty_alias_->assertfalse#ifdefinedOXCAML|Tmty_strengthen(mty,path,_)->letmty=read_module_typeenvparentlabel_parentmtyinlets_path=Env.Path.read_moduleenv.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. *)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_typeenvparent containermty,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_attributesinletexpr,canonical=matchmtd.mtd_typewith|Some mty->letexpr,canonical =read_module_type_maybe_canonical env(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)matchmd.md_idwith|None->None|Someid->letmid=Env.find_module_identifierenv.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_tagOdoc_model.Semantics.Expect_canonicalcontainermd.md_attributesinlettype_,canonical=matchmd.md_type.mty_descwith|Tmty_alias(p,_)->(Alias(Env.Path.read_module env.ident_env p,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_declarations envparentmds =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=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_exceptionenv parentext.tyexn_constructor)]#else[Exception(read_exceptionenvparentext)]#endif|Tsig_modulemd->beginmatch read_module_declarationenvparentmdwith|Somem->[Module(Ordinary,m)]|None->[]end|Tsig_recmodulemds->read_module_declarationsenvparentmds|Tsig_modtypemtd->[ModuleType(read_module_type_declarationenvparentmtd)]|Tsig_openo->[Open(read_openenv parento)]#ifdefinedOXCAML|Tsig_include (incl,_)->#else|Tsig_includeincl->#endifread_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.standalonecontainer~warnings_tag:env.warnings_tagattrwith|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)]#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)