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)->letopen TypeExpr.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.OpenthenOpenelsematchpresent with|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_typeenvcontainer typ)#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_type envcontainert#endif#ifdefinedOXCAML|Ttyp_quotetyp->Quote(read_core_typeenvcontainertyp)|Ttyp_splicetyp->Splice(read_core_typeenvcontainertyp)|Ttyp_call_pos->Constr(Env.Path.read_typeenv.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_argparentid.txt(ModuleName.hidden_of_identid.txt)env.ident_envinletenv={envwithident_env=e'}inletret=read_core_typeenv containerret_typeinletpackage=read_packageenvcontainerpkg.tpt_pathpkg.tpt_constraintsinArrow_functor(lbl,{id;package},ret)#endifandread_packageenv container pack_pathpack_fields=letopen TypeExpr.Packageinletpath=Env.Path.read_module_typeenv.ident_envpack_pathinletsubstitutions =List.map(fun(frag,typ)->letfrag=Env.Fragment.read_typefrag.Location.txtinlettyp=read_core_type env container typin(frag,typ))pack_fieldsin{path;substitutions}letread_value_descriptionenvparentvd=letopenSignatureinletid=Env.find_value_identifierenv.ident_envvd.val_idinletsource_loc=None inletcontainer=(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_desc with#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|_->assert falseinletvariance,injectivity =#ifOCAML_VERSION<(4,12,0)letvar=matchvar_and_injectivitywith|Covariant ->SomePos|Contravariant->SomeNeg|Invariant->Noneinvar,false#elseletvar=matchfstvar_and_injectivity with|Covariant->SomePos|Contravariant ->SomeNeg#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_declarationenvparentlabel_parentld=letopenTypeDecl.FieldinletopenOdoc_model.Namesinletname=Ident.name ld.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_mutableinlet type_=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_attributes inletmutable_=is_mutableld.ld_mutableinlettype_=read_core_typeenvlabel_parentld.ld_typein{id;doc;mutable_;type_}letread_constructor_declaration_arguments envparentlabel_parentarg=letopenTypeDecl.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_parent arg.ca_type)args)#elseTuple(List.map(funarg->read_core_typeenvlabel_parentarg)args)#endif|Cstr_recordlds->Record(List.map(read_label_declarationenvparent label_parent)lds)#endifletread_constructor_declaration envparentcd=letopenTypeDecl.Constructorinletid=Ident_env.find_constructor_identifierenv.ident_envcd.cd_id inletcontainer=(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_typeenvlabel_container)cd.cd_resin{id;doc;args;res}letread_type_kindenvparent=letopenTypeDecl.Representationinfunction|Ttype_abstract->None|Ttype_variantcstrs->letcstrs=List.map(read_constructor_declarationenvparent)cstrsinSome(Variant cstrs)|Ttype_record lbls->letparent=(parent:>Identifier.FieldParent.t)inletlabel_parent =(parent:>Identifier.LabelParent.t)inletlbls=List.map(read_label_declarationenvparentlabel_parent)lbls inSome(Recordlbls)#ifdefinedOXCAML|Ttype_record_unboxed_productlbls->letparent=(parent:>Identifier.UnboxedFieldParent.t)inletlabel_parent=(parent:>Identifier.LabelParent.t)inletlbls=List.map(read_unboxed_label_declaration envparentlabel_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_params inletprivate_=(decl.typ_private=Private)inletmanifest=opt_map(read_core_typeenvcontainer)decl.typ_manifestinletconstraints=List.map(fun(typ1,typ2,_)->(read_core_typeenvcontainertyp1,read_core_type envcontainertyp2))#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=Noneinlet container=(parent:Identifier.Signature.t:>Identifier.LabelParent.t)inletdoc,canonical =Doc_attr.attached~warnings_tag:env.warnings_tagOdoc_model.Semantics.Expect_canonicalcontainerdecl.typ_attributesinlet canonical=matchcanonicalwith|None->None|Somes->Doc_attr.conv_canonical_typesinletequation=read_type_equationenvcontainer declinlet representation=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=letopen SignatureinList.fold_left(fun(acc,recursive)decl->ifBtype.is_row_name(Ident.namedecl.typ_id)then(acc,recursive)elsebeginletcomments=Doc_attr.standalone_multiplecontainer~warnings_tag:env.warnings_tagdecl.typ_attributesinletcomments =List.map(funcom->Commentcom)comments inletdecl=read_type_declarationenvparentdeclin((Type(recursive,decl))::(List.rev_appendcommentsacc),And)end)([],rec_flag)decls|>fstinList.revitems#ifOCAML_VERSION>=(4,8,0)letread_type_substitutions envparentdecls =List.map(fundecl ->Odoc_model.Lang.Signature.TypeSubstitution(read_type_declaration envparentdecl))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)inlet doc=Doc_attr.attached_no_tag~warnings_tag:env.warnings_taglabel_containerext.ext_attributesinmatchext.ext_kind with|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}let read_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_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_env ext.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_attributesinmatch ext.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}letrecread_class_type_fieldenvparentctf=letopenClassSignatureinletopenOdoc_model.Namesinlet container=(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)inletvirtual_ =(virtual_ =Virtual)inlettype_ =read_core_typeenvcontainertypinSome(Method{id;doc;private_;virtual_;type_})|Tctf_constraint(typ1,typ2)->letleft=read_core_typeenvcontainertyp1inletright=read_core_typeenvcontainertyp2inSome (Constraint{left;right;doc})|Tctf_inherit cltyp->letexpr=read_class_signatureenvparentcontainercltypinSome(Inherit{expr;doc})|Tctf_attributeattr->match Doc_attr.standalonecontainer~warnings_tag:env.warnings_tag attr with|None->None|Somedoc->Some(Commentdoc)andread_self_typeenvcontainertyp=match typ.ctyp_descwith#ifdefinedOXCAML|Ttyp_var(None,_)->None#else|Ttyp_any ->None#endif|_->Some(read_core_type envcontainertyp)and read_class_signatureenvparentlabel_parentcltyp=letopenClassTypeinmatchcltyp.cltyp_descwith|Tcty_constr(p,_,params)->letp=Env.Path.read_class_typeenv.ident_envpinletparams=List.map(read_core_typeenvlabel_parent)paramsinConstr(p,params)|Tcty_signaturecsig->letopenClassSignatureinletself=read_self_typeenvlabel_parentcsig.csig_selfinletitems =List.fold_left(funrestitem->matchread_class_type_fieldenvparentitemwith|None->rest|Someitem->item::rest)[]csig.csig_fieldsinletitems=List.revitemsinletitems,(doc,doc_post)=Doc_attr.extract_top_comment_classitemsinletitems=matchdoc_postwith|{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_declarationenvparentcltd=letopenClassTypeinletid=Env.find_class_type_identifierenv.ident_envcltd.ci_id_class_typeinlet source_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)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.revletrec read_class_typeenvparentlabel_parentcty=letopenClassinmatchcty.cltyp_descwith|Tcty_constr_|Tcty_signature_->ClassType(read_class_signatureenvparentlabel_parentcty)|Tcty_arrow(lbl,arg,res)->let lbl=read_labellblinletarg=read_core_typeenvlabel_parentarginletres=read_class_typeenvparentlabel_parentresinArrow(lbl,arg,res)#ifOCAML_VERSION>=(4,8,0)|Tcty_open(_,cty)->read_class_type envparentlabel_parentcty#elifOCAML_VERSION>=(4,6,0)|Tcty_open(_,_,_,_,cty)->read_class_typeenvparentlabel_parentcty#endifletread_class_descriptionenv parentcld=letopenClassinletid=Env.find_class_identifierenv.ident_env cld.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_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_parentparentmtyinModuleTypeEq(frag,mty)|Twith_modtypesubstmty->letfrag=Env.Fragment.read_module_typefrag.Location.txtinletmty=read_module_typeenvglobal_parentparentmtyinModuleTypeSubst(frag,mty)#endifandread_module_type envparentlabel_parent mty=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_noneenvparentsginSignaturesg#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_optwith|None-> Identifier.Mk.parameter(parent,ModuleName.make_std"_"),env|Someid->lete'=Env.add_parameter parentid(ModuleName.of_identid)env.ident_env inletenv={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_parent resinFunctor (f_parameter,res)#else|Tmty_functor(id,_,arg,res)->letnew_env=Env.add_parameterparentid(ModuleName.of_ident id)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_constraintenvparent label_parent)subsinmatchOdoc_model.Lang.umty_of_mtybodywith|Somew_expr->With{w_substitutions=subs;w_expansion=None;w_expr}|None->failwith "error")|Tmty_typeofmexpr->letdecl=matchmexpr.mod_descwith|Tmod_ident(p,_)->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)matchTypedtree.path_of_moduleincl_modwith#elsematchTypemod.path_of_moduleincl_mod with#endif|Somep->letp=Env.Path.read_moduleenv.ident_envpinTypeOf{t_desc=StructIncludep;t_original_path=p;t_expansion=None}|None->!read_module_exprenvparentlabel_parentmexprend|_->!read_module_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_mty mtywith|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_typeenvparentcontainermty,canonical)andread_module_type_declarationenvparentmtd=letopenModuleTypeinletid=Env.find_module_typeenv.ident_envmtd.mtd_idinlet source_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_type with|Somemty->letexpr,canonical=read_module_type_maybe_canonicalenv(id:>Identifier.Signature.t)container~canonical mtyin(Someexpr,canonical)|None ->(None,canonical)inletcanonical=matchcanonical with|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_identifier env.ident_envmd.md_idin#endifletid=(mid :>Identifier.Module.t)inletsource_loc=Noneinlet container=(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_desc with|Tmty_alias (p,_)->(Alias(Env.Path.read_module env.ident_envp,None),canonical)|_->letexpr,canonical=read_module_type_maybe_canonical env(id:>Identifier.Signature.t)container~canonicalmd.md_typein(ModuleTypeexpr,canonical)inletcanonical=matchcanonical with|None->None|Some s->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)inletopen SignatureinList.fold_left(fun(acc,recursive)md->letcomments=Doc_attr.standalone_multiplecontainer~warnings_tag:env.warnings_tagmd.md_attributesinletcomments=List.map(funcom->Comment com)commentsinmatchread_module_declarationenvparentmdwith|Some md->((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_item envparentitem=letopenSignatureinmatchitem.sig_descwith|Tsig_valuevd->[read_value_descriptionenvparent vd]#ifOCAML_VERSION<(4,3,0)|Tsig_type decls->letrec_flag=Ordinaryin#else|Tsig_type (rec_flag,decls)->letrec_flag=match rec_flag with|Recursive->Ordinary|Nonrecursive->Nonrecin#endifread_type_declarationsenvparentrec_flag decls|Tsig_typexttyext->[TypExt(read_type_extension envparenttyext)]|Tsig_exceptionext->#ifOCAML_VERSION>=(4,8,0)[Exception(read_exceptionenvparentext.tyexn_constructor)]#else[Exception(read_exceptionenvparentext)]#endif|Tsig_modulemd->beginmatchread_module_declarationenvparentmdwith|Somem->[Module(Ordinary,m)]|None->[]end|Tsig_recmodule mds->read_module_declarationsenvparentmds|Tsig_modtypemtd->[ModuleType(read_module_type_declaration envparentmtd)]|Tsig_openo->[Open(read_openenvparento)]#ifdefined OXCAML|Tsig_include (incl,_)->#else|Tsig_include incl->#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)