123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800(*
* 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.
*)openOdoc_model.PathsopenOdoc_model.LangopenOdoc_model.PredefinedopenOdoc_model.NamesopenIdentifiermoduleStringTbl=Map.Make(String)typetype_ident=Odoc_model.Paths_types.Identifier.path_typetypeconstructor_ident=Odoc_model.Paths_types.Identifier.reference_constructortypeextension_ident=Odoc_model.Paths_types.Identifier.reference_extensiontypeclass_type_ident=Odoc_model.Paths_types.Identifier.reference_class_typetypeparent_ident=[Odoc_model.Paths_types.Identifier.path_any|Odoc_model.Paths_types.Identifier.page]typesignature_ident=[Odoc_model.Paths_types.Identifier.reference_module|Odoc_model.Paths_types.Identifier.reference_module_type]typet={modules:Module.tStringTbl.t;module_types:ModuleType.tStringTbl.t;types:type_identStringTbl.t;constructors:constructor_identStringTbl.t;fields:Field.tStringTbl.t;extensions:extension_identStringTbl.t;exceptions:Exception.tStringTbl.t;values:Value.tStringTbl.t;classes:Class.tStringTbl.t;class_types:class_type_identStringTbl.t;methods:Method.tStringTbl.t;instance_variables:InstanceVariable.tStringTbl.t;labels:Label.tStringTbl.t;parents:parent_identStringTbl.t;elements:Identifier.tStringTbl.t;titles:Odoc_model.Comment.link_contentStringTbl.t;(* Hack *)signatures:signature_identStringTbl.t;}letempty={modules=StringTbl.empty;module_types=StringTbl.empty;types=StringTbl.empty;constructors=StringTbl.empty;fields=StringTbl.empty;extensions=StringTbl.empty;exceptions=StringTbl.empty;values=StringTbl.empty;classes=StringTbl.empty;class_types=StringTbl.empty;methods=StringTbl.empty;instance_variables=StringTbl.empty;labels=StringTbl.empty;parents=StringTbl.empty;elements=StringTbl.empty;titles=StringTbl.empty;signatures=StringTbl.empty}letadd_label_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Identifier.Label.t:>Identifier.t)env.elementsinletlabels=StringTbl.addnameidenv.labelsin{envwithelements;labels}letadd_value_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Identifier.Value.t:>Identifier.t)env.elementsinletvalues=StringTbl.addnameidenv.valuesin{envwithelements;values}letadd_external_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Identifier.Value.t:>Identifier.t)env.elementsinletvalues=StringTbl.addnameidenv.valuesin{envwithelements;values}letadd_constructor_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Identifier.Constructor.t:>Identifier.t)env.elementsinletconstructors=StringTbl.addname(id:>constructor_ident)env.constructorsin{envwithelements;constructors}letadd_field_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Identifier.Field.t:>Identifier.t)env.elementsinletfields=StringTbl.addnameidenv.fieldsin{envwithelements;fields}letadd_type_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Identifier.Type.t:>Identifier.t)env.elementsinletparents=StringTbl.addname(id:>parent_ident)env.parentsinlettypes=StringTbl.addname(id:>type_ident)env.typesin{envwithelements;parents;types}letadd_extension_constructor_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Extension.t:>Identifier.t)env.elementsinletconstructors=StringTbl.addname(id:>constructor_ident)env.constructorsinletextensions=StringTbl.addname(id:>extension_ident)env.extensionsin{envwithelements;constructors;extensions}letadd_exception_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Exception.t:>Identifier.t)env.elementsinletconstructors=StringTbl.addname(id:>constructor_ident)env.constructorsinletextensions=StringTbl.addname(id:>extension_ident)env.extensionsinletexceptions=StringTbl.addnameidenv.exceptionsin{envwithelements;constructors;extensions;exceptions}letadd_class_type_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:ClassType.t:>Identifier.t)env.elementsinletparents=StringTbl.addname(id:>parent_ident)env.parentsinlettypes=StringTbl.addname(id:>type_ident)env.typesinletclass_types=StringTbl.addname(id:>class_type_ident)env.class_typesin{envwithelements;parents;types;class_types}letadd_class_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Class.t:>Identifier.t)env.elementsinletparents=StringTbl.addname(id:>parent_ident)env.parentsinlettypes=StringTbl.addname(id:>type_ident)env.typesinletclass_types=StringTbl.addname(id:>class_type_ident)env.class_typesinletclasses=StringTbl.addnameidenv.classesin{envwithelements;parents;types;class_types;classes}letadd_module_type_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:ModuleType.t:>Identifier.t)env.elementsinletparents=StringTbl.addname(id:>parent_ident)env.parentsinletmodule_types=StringTbl.addnameidenv.module_typesinletsignatures=StringTbl.addname(id:>signature_ident)env.signaturesin{envwithelements;parents;module_types;signatures}letadd_module_identidenv=letname=Identifier.nameidinletelements=StringTbl.addname(id:Module.t:>Identifier.t)env.elementsinletparents=StringTbl.addname(id:>parent_ident)env.parentsinletmodules=StringTbl.addname(id:>Module.t)env.modulesinletsignatures=StringTbl.addname(id:>signature_ident)env.signaturesin{envwithelements;parents;modules;signatures}letadd_page_identidenv=letname=Identifier.nameidinletparents=StringTbl.addname(id:Page.t:>parent_ident)env.parentsin{envwithparents}letopt_foldfoacc=matchowith|None->acc|Somex->fxaccletadd_label_ident_titleidtxtenv=letname=Identifier.nameidinlettitles=StringTbl.addnametxtenv.titlesin{envwithtitles}letadd_documentationdocenv=List.fold_right(funelementenv->matchelement.Odoc_model.Location_.valuewith|`Heading(_,label,nested_elements)->letenv=add_label_identlabelenvinletenv=add_label_ident_titlelabelnested_elementsenvinenv|_->env)docenvletadd_commentcomenv=matchcomwith|`Docsdoc->add_documentationdocenv|`Stop->envletadd_valuevlenv=letopenOdoc_model.Lang.Valueinletenv=add_documentationvl.docenvinadd_value_identvl.idenvletadd_externalxtenv=letopenExternalinletenv=add_documentationxt.docenvinadd_external_identxt.idenvletadd_constructorcstrenv=letopenTypeDecl.Constructorinletenv=add_documentationcstr.docenvinadd_constructor_identcstr.idenvletadd_fieldfieldenv=letopenTypeDecl.Fieldinletenv=add_documentationfield.docenvinadd_field_identfield.idenvletadd_representationreprenv=letopenTypeDecl.Representationinmatchreprwith|Variantcstrs->List.fold_rightadd_constructorcstrsenv|Recordfields->List.fold_rightadd_fieldfieldsenv|Extensible->envletadd_type_decldeclenv=letopenTypeDeclinletenv=add_documentationdecl.docenvinletenv=opt_foldadd_representationdecl.representationenvinadd_type_identdecl.idenvletadd_extension_constructorextenv=letopenOdoc_model.Lang.Extension.Constructorinletenv=add_documentationext.docenvinadd_extension_constructor_identext.idenvletadd_extensiontyextenv=letopenOdoc_model.Lang.Extensioninletenv=add_documentationtyext.docenvinletenv=List.fold_rightadd_extension_constructortyext.constructorsenvinenvletadd_exceptionexnenv=letopenOdoc_model.Lang.Exceptioninletenv=add_documentationexn.docenvinadd_exception_identexn.idenvletadd_class_typecltypenv=letopenOdoc_model.Lang.ClassTypeinletenv=add_documentationcltyp.docenvinadd_class_type_identcltyp.idenvletadd_classclenv=letopenOdoc_model.Lang.Classinletenv=add_documentationcl.docenvinadd_class_identcl.idenvletadd_module_typemtypenv=letopenOdoc_model.Lang.ModuleTypeinletenv=add_documentationmtyp.docenvinadd_module_type_identmtyp.idenvletadd_modulemdenv=letopenOdoc_model.Lang.Moduleinletenv=add_documentationmd.docenvinadd_module_identmd.idenvletadd_module_substitutionmenv=letopenOdoc_model.Lang.ModuleSubstitutioninletenv=add_documentationm.docenvinadd_module_identm.idenvletadd_unitunitenv=letopenCompilation_unitinletenv=add_documentationunit.docenvinadd_module_identunit.idenvletadd_pagepageenv=letopenOdoc_model.Lang.Pageinletenv=add_documentationpage.contentenvinadd_page_identpage.nameenvletrecadd_includeinclenv=letopenIncludeinletenv=add_documentationincl.docenvinadd_signature_itemsincl.expansion.contentenvandadd_signature_itemitemenv=letopenOdoc_model.Lang.Signatureinmatchitemwith|Module(_,md)->add_modulemdenv|ModuleTypemtyp->add_module_typemtypenv|Type(_,decl)->add_type_decldeclenv|TypExttyext->add_extensiontyextenv|Exceptionexn->add_exceptionexnenv|Valuevl->add_valuevlenv|Externalext->add_externalextenv|Class(_,cl)->add_classclenv|ClassType(_,cltyp)->add_class_typecltypenv|Includeincl->add_includeinclenv|Commentcom->add_commentcomenv|ModuleSubstitutionm->add_module_substitutionmenv|TypeSubstitutiont->add_type_decltenvandadd_signature_itemssgenv=List.fold_rightadd_signature_itemsgenvletrecadd_module_type_expr_itemsexprenv=letopenOdoc_model.Lang.ModuleTypeinmatchexprwith|Path_->env|Signaturesg->add_signature_itemssgenv|Functor(Unit,expr)->add_module_type_expr_itemsexprenv|Functor(Named{FunctorParameter.id;_},expr)->add_module_identid(add_module_type_expr_itemsexprenv)|With(expr,_)->add_module_type_expr_itemsexprenv|TypeOfdecl->add_module_decl_itemsdeclenvandadd_module_decl_itemsdeclenv=letopenOdoc_model.Lang.Moduleinmatchdeclwith|Alias_->env|ModuleTypeexpr->add_module_type_expr_itemsexprenvletadd_methodmethenv=letopenOdoc_model.Lang.Methodinletenv=add_documentationmeth.docenvinletname=Identifier.namemeth.idinletelements=StringTbl.addname(meth.id:>Identifier.t)env.elementsinletmethods=StringTbl.addnamemeth.idenv.methodsin{envwithelements;methods}letadd_instance_variableinstenv=letopenOdoc_model.Lang.InstanceVariableinletenv=add_documentationinst.docenvinletname=Identifier.nameinst.idinletelements=StringTbl.addname(inst.id:>Identifier.t)env.elementsinletinstance_variables=StringTbl.addnameinst.idenv.instance_variablesin{envwithelements;instance_variables}letadd_class_signature_itemitemenv=letopenOdoc_model.Lang.ClassSignatureinmatchitemwith|Methodmeth->add_methodmethenv|InstanceVariableinst->add_instance_variableinstenv|Constraint_->env|Inherit_->env|Commentcom->add_commentcomenvletadd_class_signature_itemsclsigenv=letopenOdoc_model.Lang.ClassSignatureinList.fold_rightadd_class_signature_itemclsig.itemsenvletadd_class_type_expr_itemsexprenv=letopenOdoc_model.Lang.ClassTypeinmatchexprwith|Constr_->env|Signatureclsig->add_class_signature_itemsclsigenvletrecadd_class_decl_itemsdeclenv=letopenOdoc_model.Lang.Classinmatchdeclwith|ClassTypeexpr->add_class_type_expr_itemsexprenv|Arrow(_,_,decl)->add_class_decl_itemsdeclenvopenOdoc_model.Paths.Referenceletlookup_signature_identenvname:Signature.t=tryletid=StringTbl.findnameenv.signaturesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TUnknown)letlookup_module_identenvname:Module.t=tryletid=StringTbl.findnameenv.modulesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TModule)letlookup_module_type_identenvname:ModuleType.t=tryletid=StringTbl.findnameenv.module_typesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TModuleType)letlookup_type_identenvname:Type.t=tryletid=StringTbl.findnameenv.typesin`Resolved(`Identifierid)withNot_found->matchcore_type_identifiernamewith|Someid->`Resolved(`Identifier(id:>type_ident))|None->`Root(UnitName.of_stringname,`TType)letlookup_constructor_identenvname:Constructor.t=tryletid=StringTbl.findnameenv.constructorsin`Resolved(`Identifierid)withNot_found->matchcore_constructor_identifiernamewith|Someid->`Resolved(`Identifier(id:>Odoc_model.Paths_types.Identifier.reference_constructor))|None->matchcore_exception_identifiernamewith|Someid->`Resolved(`Identifier(id:>Odoc_model.Paths_types.Identifier.reference_constructor))|None->`Root(UnitName.of_stringname,`TConstructor)letlookup_field_identenvname:Field.t=tryletid=StringTbl.findnameenv.fieldsin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TField)letlookup_extension_identenvname:Extension.t=tryletid=StringTbl.findnameenv.extensionsin`Resolved(`Identifierid)withNot_found->matchcore_exception_identifiernamewith|Someid->`Resolved(`Identifier(id:>extension_ident))|None->`Root(UnitName.of_stringname,`TExtension)letlookup_exception_identenvname:Exception.t=tryletid=StringTbl.findnameenv.exceptionsin`Resolved(`Identifierid)withNot_found->matchcore_exception_identifiernamewith|Someid->`Resolved(`Identifierid)|None->`Root(UnitName.of_stringname,`TException)letlookup_value_identenvname:Value.t=tryletid=StringTbl.findnameenv.valuesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TValue)letlookup_class_identenvname:Class.t=tryletid=StringTbl.findnameenv.classesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TClass)letlookup_class_type_identenvname:ClassType.t=tryletid=StringTbl.findnameenv.class_typesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TClassType)letlookup_method_identenvname:Method.t=tryletid=StringTbl.findnameenv.methodsin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TMethod)letlookup_instance_variable_identenvname:InstanceVariable.t=tryletid=StringTbl.findnameenv.instance_variablesin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TInstanceVariable)letlookup_label_identenvname:Label.t=tryletid=StringTbl.findnameenv.labelsin`Resolved(`Identifierid)withNot_found->`Root(UnitName.of_stringname,`TLabel)letlookup_parent_identenvname:Reference.Parent.t=matchStringTbl.findnameenv.parentswith|`Page_->assertfalse|`Root_|`Module_|`Argument_|`ModuleType_|`Type_|`CoreType_|`Class_|`ClassType_asid->`Resolved(`Identifierid)|exceptionNot_found->matchcore_type_identifiernamewith|Someid->`Resolved(`Identifier(id:>Identifier.Parent.t))|None->`Root(UnitName.of_stringname,`TUnknown)letlookup_label_parent_identenvname:Reference.LabelParent.t=tryletid=StringTbl.findnameenv.parentsin`Resolved(`Identifierid)withNot_found->matchcore_type_identifiernamewith|Someid->`Resolved(`Identifier(id:>Identifier.LabelParent.t))|None->`Root(UnitName.of_stringname,`TUnknown)letlookup_element_identenvname=tryletid=StringTbl.findnameenv.elementsin`Resolved(`Identifierid)withNot_found->matchcore_type_identifiernamewith|Someid->`Resolved(`Identifier(id:>Identifier.t))|None->matchcore_constructor_identifiernamewith|Someid->`Resolved(`Identifier(id:>Identifier.t))|None->matchcore_exception_identifiernamewith|Someid->`Resolved(`Identifier(id:>Identifier.t))|None->`Root(UnitName.of_stringname,`TUnknown)letreclookup_parentenv:Reference.Parent.t->Reference.Parent.t=function|`Resolved_asr->r|`Root(s,`TUnknown)->lookup_parent_identenv(UnitName.to_strings)|`Root(s,`TModule)->(lookup_module_identenv(UnitName.to_strings):>Reference.Parent.t)|`Root(s,`TModuleType)->(lookup_module_type_identenv(UnitName.to_strings):>Reference.Parent.t)|`Root(s,`TType)asr->beginmatchlookup_type_identenv(UnitName.to_strings)with|`Type_|`Class_|`ClassType_|`Dot_->(* can't go from Root to any of these. *)assertfalse|`Root_->r|`Resolved(`Identifier(`CoreType_|`Type_)|`Type_)asresolved->(resolved:>Reference.Parent.t)|`Resolved(`Identifier(`Class_|`ClassType_)|`Class_|`ClassType_)asr->rend|`Root(s,`TClass)->(lookup_class_identenv(UnitName.to_strings):>Reference.Parent.t)|`Root(s,`TClassType)->(lookup_class_type_identenv(UnitName.to_strings):>Reference.Parent.t)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Module(r,s)->`Module(lookup_signatureenvr,s)|`ModuleType(r,s)->`ModuleType(lookup_signatureenvr,s)|`Type(r,s)->`Type(lookup_signatureenvr,s)|`Class(r,s)->`Class(lookup_signatureenvr,s)|`ClassType(r,s)->`ClassType(lookup_signatureenvr,s)andlookup_label_parentenv:Reference.LabelParent.t->Reference.LabelParent.t=function|`Resolved_asr->r|`Root(s,`TUnknown)->lookup_label_parent_identenv(UnitName.to_strings)|`Root(_,`TPage)asr->r(* there are no local pages. *)|`Root(s,`TModule)->(lookup_module_identenv(UnitName.to_strings):>LabelParent.t)|`Root(s,`TModuleType)->(lookup_module_type_identenv(UnitName.to_strings):>LabelParent.t)|`Root(s,`TType)asr->beginmatchlookup_type_identenv(UnitName.to_strings)with|`Type_|`Class_|`ClassType_|`Dot_->(* can't go from Root to any of these. *)assertfalse|`Root_->r|`Resolved(`Identifier(`CoreType_|`Type_|`Class_|`ClassType_)|`Type_|`Class_|`ClassType_)asresolved->(resolved:>LabelParent.t)end|`Root(s,`TClass)->(lookup_class_identenv(UnitName.to_strings):>LabelParent.t)|`Root(s,`TClassType)->(lookup_class_type_identenv(UnitName.to_strings):>LabelParent.t)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Module(r,s)->`Module(lookup_signatureenvr,s)|`ModuleType(r,s)->`ModuleType(lookup_signatureenvr,s)|`Type(r,s)->`Type(lookup_signatureenvr,s)|`Class(r,s)->`Class(lookup_signatureenvr,s)|`ClassType(r,s)->`ClassType(lookup_signatureenvr,s)andlookup_signatureenv:Reference.Signature.t->Reference.Signature.t=function|`Resolved_asr->r|`Root(s,`TUnknown)->lookup_signature_identenv(UnitName.to_strings)|`Root(s,`TModule)->(lookup_module_identenv(UnitName.to_strings):>Reference.Signature.t)|`Root(s,`TModuleType)->(lookup_module_type_identenv(UnitName.to_strings):>Reference.Signature.t)|`Dot(p,s)->`Dot(lookup_label_parentenvp,s)|`Module(p,s)->`Module(lookup_signatureenvp,s)|`ModuleType(p,s)->`ModuleType(lookup_signatureenvp,s)letlookup_moduleenv:Reference.Module.t->Reference.Module.t=function|`Resolved_asr->r|`Root(s,_)->lookup_module_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Module(p,s)->`Module(lookup_signatureenvp,s)letlookup_module_typeenv:Reference.ModuleType.t->Reference.ModuleType.t=function|`Resolved_asr->r|`Root(s,_)->lookup_module_type_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`ModuleType(p,s)->`ModuleType(lookup_signatureenvp,s)letlookup_typeenv:Reference.Type.t->Reference.Type.t=function|`Resolved_asr->r|`Root(s,_)->lookup_type_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Type(r,s)->`Type(lookup_signatureenvr,s)|`Class(r,s)->`Class(lookup_signatureenvr,s)|`ClassType(r,s)->`ClassType(lookup_signatureenvr,s)letlookup_datatypeenv:Reference.DataType.t->Reference.DataType.t=function|`Resolved_asr->r|`Root(s,_)asr->beginmatchlookup_type_identenv(UnitName.to_strings)with|`Type_|`Class_|`ClassType_|`Dot_->(* can't go from Root to any of these. *)assertfalse|`Root_->r|`Resolved(`Identifier(`CoreType_|`Type_)|`Type_)asresolved->resolved|`Resolved(`Identifier(`Class_|`ClassType_)|`Class_|`ClassType_)->rend|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Type(r,s)->`Type(lookup_signatureenvr,s)letlookup_constructorenv:Reference.Constructor.t->Reference.Constructor.t=function|`Resolved_asr->r|`Root(s,_)->lookup_constructor_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Constructor(r,s)->`Constructor(lookup_datatypeenvr,s)|`Extension(r,s)->`Extension(lookup_signatureenvr,s)|`Exception(r,s)->`Exception(lookup_signatureenvr,s)letlookup_fieldenv:Reference.Field.t->Reference.Field.t=function|`Resolved_asr->r|`Root(s,_)->lookup_field_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Field(r,s)->`Field(lookup_parentenvr,s)letlookup_extensionenv:Reference.Extension.t->Reference.Extension.t=function|`Resolved_asr->r|`Root(s,_)->lookup_extension_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Extension(r,s)->`Extension(lookup_signatureenvr,s)|`Exception(r,s)->`Exception(lookup_signatureenvr,s)letlookup_exceptionenv:Reference.Exception.t->Reference.Exception.t=function|`Resolved_asr->r|`Root(s,_)->lookup_exception_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Exception(r,s)->`Exception(lookup_signatureenvr,s)letlookup_valueenv:Reference.Value.t->Reference.Value.t=function|`Resolved_asr->r|`Root(s,_)->lookup_value_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Value(r,s)->`Value(lookup_signatureenvr,s)letlookup_classenv:Reference.Class.t->Reference.Class.t=function|`Resolved_asr->r|`Root(s,_)->lookup_class_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Class(r,s)->`Class(lookup_signatureenvr,s)letlookup_class_typeenv:Reference.ClassType.t->Reference.ClassType.t=function|`Resolved_asr->r|`Root(s,_)->lookup_class_type_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Class(r,s)->`Class(lookup_signatureenvr,s)|`ClassType(r,s)->`ClassType(lookup_signatureenvr,s)letlookup_methodenv:Reference.Method.t->Reference.Method.t=function|`Resolved_asr->r|`Root(s,_)->lookup_method_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Method(r,s)->`Method(lookup_class_typeenvr,s)letlookup_instance_variableenv:Reference.InstanceVariable.t->Reference.InstanceVariable.t=function|`Resolved_asr->r|`Root(s,_)->lookup_instance_variable_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`InstanceVariable(r,s)->`InstanceVariable(lookup_class_typeenvr,s)letlookup_labelenv:Reference.Label.t->Reference.Label.t=function|`Resolved_asr->r|`Root(s,_)->lookup_label_identenv(UnitName.to_strings)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Label(r,s)->`Label(lookup_label_parentenvr,s)letlookup_elementenv:Reference.t->Reference.t=function|`Resolved_asr->r|`Root(s,`TUnknown)->(lookup_element_identenv(UnitName.to_strings):>Reference.t)|`Root(_,`TPage)asr->r(* there are no local pages. *)|`Root(s,`TModule)->(lookup_module_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TModuleType)->(lookup_module_type_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TType)->(lookup_type_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TConstructor)->(lookup_constructor_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TField)->(lookup_field_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TExtension)->(lookup_extension_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TException)->(lookup_exception_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TValue)->(lookup_value_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TClass)->(lookup_class_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TClassType)->(lookup_class_type_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TMethod)->(lookup_method_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TInstanceVariable)->(lookup_instance_variable_identenv(UnitName.to_strings):>Reference.t)|`Root(s,`TLabel)->(lookup_label_identenv(UnitName.to_strings):>Reference.t)|`Dot(r,s)->`Dot(lookup_label_parentenvr,s)|`Module_asr->(lookup_moduleenvr:>Reference.t)|`ModuleType_asr->(lookup_module_typeenvr:>Reference.t)|`Type_asr->(lookup_typeenvr:>Reference.t)|`Constructor_asr->(lookup_constructorenvr:>Reference.t)|`Field_asr->(lookup_fieldenvr:>Reference.t)|`Extension_asr->(lookup_extensionenvr:>Reference.t)|`Exception_asr->(lookup_exceptionenvr:>Reference.t)|`Value_asr->(lookup_valueenvr:>Reference.t)|`Class_asr->(lookup_classenvr:>Reference.t)|`ClassType_asr->(lookup_class_typeenvr:>Reference.t)|`Method_asr->(lookup_methodenvr:>Reference.t)|`InstanceVariable_asr->(lookup_instance_variableenvr:>Reference.t)|`Label_asr->(lookup_labelenvr:>Reference.t)letlookup_section_titleenvlbl=matchlblwith|`Identifierid->letlbl=Identifier.nameidinbeginmatchStringTbl.findlblenv.titleswith|txt->Sometxt|exceptionNot_found->Noneend|_->None