123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800openOdoc_model.PathsopenOdoc_model.NamesopenReferenceopenUtils.ResultMonadtypemodule_lookup_result=Resolved.Module.t*Cpath.Resolved.module_*Component.Module.ttypemodule_type_lookup_result=Resolved.ModuleType.t*Cpath.Resolved.module_type*Component.ModuleType.ttypesignature_lookup_result=Resolved.Signature.t*Cpath.Resolved.parent*Component.Signature.ttypedatatype_lookup_result=Resolved.DataType.t*Component.TypeDecl.ttypeclass_lookup_result=Resolved.Class.t*Component.Class.ttypeclass_type_lookup_result=Resolved.ClassType.t*Component.ClassType.ttypepage_lookup_result=Resolved.Page.t*Odoc_model.Lang.Page.ttypetype_lookup_result=[`Tofdatatype_lookup_result|`Cofclass_lookup_result|`CTofclass_type_lookup_result]typelabel_parent_lookup_result=[`Sofsignature_lookup_result|type_lookup_result|`Pofpage_lookup_result]type'aref_result=('a,Errors.Tools_error.reference_lookup_error)Result.result(** The result type for every functions in this module. *)letkind_of_find_result=function|`S_->`S|`T_->`T|`C_->`C|`CT_->`CT|`P_->`Pageletwrong_kind_errorexpectedr=Error(`Wrong_kind(expected,kind_of_find_resultr))letsignature_lookup_result_of_label_parent:label_parent_lookup_result->_=function|`Sr->Okr|r->wrong_kind_error[`S]rletclass_lookup_result_of_type:type_lookup_result->_=function|`Cr->Okr|r->wrong_kind_error[`C]rletclass_type_lookup_result_of_type:type_lookup_result->_=function|`CTr->Okr|r->wrong_kind_error[`CT]rletref_kind_of_element=function|`Module_->"module"|`ModuleType_->"module-type"|`Type_->"type"|`Value_->"val"|`Label_->"section"|`Class_->"class"|`ClassType_->"class-type"|`Constructor_->"constructor"|`Exception_->"exception"|`Extension_->"extension"|`Field_->"field"|`Page_->"page"letref_kind_of_find=function|`FModule_|`FModule_subst_->"module"|`FModuleType_|`FModuleType_subst_->"module-type"|`FType_|`FType_subst_->"type"|`FValue_->"val"|`FLabel_->"section"|`FClass_->"class"|`FClassType_->"class-type"|`FConstructor_|`In_type(_,_,`FConstructor_)->"constructor"|`FExn_->"exception"|`FExt_->"extension"|`FField_|`In_type(_,_,`FField_)->"field"|`FMethod_->"method"|`FInstance_variable_->"instance-variable"letambiguous_generic_ref_warningnameresults=(* Sort the results to make sure the result is reproducible. *)letresults=List.sortString.compareresultsinletpp_seppp()=Format.fprintfpp", "andpp_kindppr=Format.fprintfpp"%s-%s"rnameinLookup_failures.report_warning"Reference to '%s' is ambiguous. Please specify its kind: %a."name(Format.pp_print_list~pp_seppp_kind)resultsletambiguous_label_warningname(labels:Component.Element.anylist)=(* Sort the results to make sure the result is reproducible. *)letpp_kindppr=matchrwith|`Label(_,l)->Odoc_model.Location_.pp_span_startppl.Component.Label.location|_->()inLookup_failures.report_warning"@[<2>Multiple sections named '%s' found. Please alter one to ensure \
reference is unambiguous. Locations:@ %a@]"name(Format.pp_print_list~pp_sep:Format.pp_force_newlinepp_kind)labelsletambiguous_warningname(results:[<Component.Element.any]list)=letresults=(results:>Component.Element.anylist)inifList.for_all(function`Label_->true|_->false)resultsthenambiguous_label_warningnameresultselseambiguous_generic_ref_warningname(List.mapref_kind_of_elementresults)letenv_lookup_by_name?(kind=`Any)scopenameenv=matchEnv.lookup_by_namescopenameenvwith|Okx->Okx|Error(`Ambiguous(hd,tl))->ambiguous_warningname(hd::tl);Okhd|Error`Not_found->Error(`Lookup_by_name(kind,name))letfind_ambiguous?(kind=`Any)findsgname=matchfindsgnamewith|[x]->Okx|x::_asresults->ambiguous_generic_ref_warningname(List.mapref_kind_of_findresults);Okx|[]->Error(`Find_by_name(kind,name))letfindfindsgname=matchfindsgnamewith|Somex->Okx|None->Error(`Find_by_name(`Any,name))letmodule_lookup_to_signature_lookupenv(ref,cp,m)=Tools.signature_of_moduleenvm|>map_error(fune->`Parent(`Parent_sige))>>=funsg->Ok((ref:>Resolved.Signature.t),`Modulecp,sg)letmodule_type_lookup_to_signature_lookupenv(ref,cp,m)=Tools.signature_of_module_typeenvm|>map_error(fune->`Parent(`Parent_sige))>>=funsg->Ok((ref:>Resolved.Signature.t),`ModuleTypecp,sg)lettype_lookup_to_class_signature_lookup=letresolvedp'cs=Ok((p':>Resolved.ClassSignature.t),cs)infunenv->function|`T_asr->wrong_kind_error[`C;`CT]r|`C(p',c)->Tools.class_signature_of_classenvc|>of_option~error:(`Parent(`Parent_type`OpaqueClass))>>=resolvedp'|`CT(p',ct)->Tools.class_signature_of_class_typeenvct|>of_option~error:(`Parent(`Parent_type`OpaqueClass))>>=resolvedp'moduleM=struct(** Module *)typet=module_lookup_resultletof_componentenvmbase_path'base_ref':t=letbase_path,base_ref=ifm.Component.Module.hiddenthen(`Hiddenbase_path',`Hiddenbase_ref')else(base_path',base_ref')inletp,r=matchTools.get_module_path_modifiersenv~add_canonical:truemwith|None->(base_path,base_ref)|Some(`Aliasedcp)->letcp=Tools.reresolve_moduleenvcpinletp=Lang_of.(Path.resolved_module(empty())cp)in(`Alias(cp,base_path),`Alias(p,base_ref))|Some(`SubstMTcp)->letcp=Tools.reresolve_module_typeenvcpin(`Subst(cp,base_path),base_ref)in(r,p,m)letin_signatureenv((parent,parent_cp,sg):signature_lookup_result)name=letparent_cp=Tools.reresolve_parentenvparent_cpinletsg=Tools.prefix_signature(parent_cp,sg)infindFind.module_in_sigsgname>>=fun(`FModule(name,m))->Ok(of_componentenvm(`Module(parent_cp,name))(`Module(parent,name)))letof_elementenv(`Module(id,m)):t=letm=Component.Delayed.getminletbase=`Identifier(id:>Identifier.Path.Module.t)inof_componentenvmbasebaseletin_envenvname=matchenv_lookup_by_nameEnv.s_modulenameenvwith|Oke->Ok(of_elementenve)|Error_->Error(`Parent(`Parent_module(`Lookup_failure_rootname)))endmoduleMT=struct(** Module type *)typet=module_type_lookup_resultletof_componentenvmtbase_pathbase_ref:t=matchTools.get_module_type_path_modifiersenv~add_canonical:truemtwith|None->(base_ref,base_path,mt)|Some(`AliasModuleTypecp)->letcp=Tools.reresolve_module_typeenvcpinletp=Lang_of.(Path.resolved_module_type(empty())cp)in(`AliasModuleType(p,base_ref),`AliasModuleType(cp,base_path),mt)letin_signatureenv((parent',parent_cp,sg):signature_lookup_result)name=letsg=Tools.prefix_signature(parent_cp,sg)infindFind.module_type_in_sigsgname>>=fun(`FModuleType(name,mt))->Ok(of_componentenvmt(`ModuleType(parent_cp,name))(`ModuleType(parent',name)))letof_elementenv(`ModuleType(id,mt)):t=of_componentenvmt(`Identifierid)(`Identifierid)letin_envenvname=env_lookup_by_nameEnv.s_module_typenameenv>>=fune->Ok(of_elementenve)endmoduleCL=struct(** Class *)typet=class_lookup_resultletof_element_env(`Class(id,t)):t=(`Identifierid,t)letin_envenvname=env_lookup_by_nameEnv.s_classnameenv>>=fune->Ok(of_elementenve)letof_component_envc~parent_refname=Ok(`Class(parent_ref,name),c)endmoduleCT=structtypet=class_type_lookup_resultletof_element_env(`ClassType(id,t)):t=((`Identifierid:>Resolved.ClassType.t),t)letin_envenvname=env_lookup_by_nameEnv.s_class_typenameenv>>=fune->Ok(of_elementenve)letof_component_envct~parent_refname=Ok(`ClassType(parent_ref,name),ct)endmoduleDT=struct(** Datatype *)typet=datatype_lookup_resultletof_component_envt~parent_refname=Ok(`Type(parent_ref,name),t)letof_element_env(`Type(id,t)):t=(`Identifierid,t)letin_envenvname=env_lookup_by_nameEnv.s_typenameenv>>=fune->Ok(of_elementenve)letin_signature_env((parent',parent_cp,sg):signature_lookup_result)name=letsg=Tools.prefix_signature(parent_cp,sg)infindFind.datatype_in_sigsgname>>=fun(`FType(name,t))->Ok(`Type(parent',name),t)endmoduleT=struct(** Type *)typet=type_lookup_resultletof_elementenv:_->t=function|`Type_ase->`T(DT.of_elementenve)|`Class_ase->`C(CL.of_elementenve)|`ClassType_ase->`CT(CT.of_elementenve)letin_envenvname=env_lookup_by_nameEnv.s_datatypenameenv>>=fune->Ok(of_elementenve)(* Don't handle name collisions between class, class types and type decls *)letin_signature_env((parent',parent_cp,sg):signature_lookup_result)name=letsg=Tools.prefix_signature(parent_cp,sg)infindFind.type_in_sigsgname>>=function|`FType(name,t)->Ok(`T(`Type(parent',name),t))|`FClass(name,c)->Ok(`C(`Class(parent',name),c))|`FClassType(name,ct)->Ok(`CT(`ClassType(parent',name),ct))endmoduleV=struct(** Value *)typet=Resolved.Value.tletin_envenvname:tref_result=env_lookup_by_nameEnv.s_valuenameenv>>=fun(`Value(id,_x))->Ok(`Identifierid)letof_component_env~parent_refname=Ok(`Value(parent_ref,name))letin_signature_env((parent',_,sg):signature_lookup_result)name=find_ambiguous~kind:`SFind.value_in_sigsg(ValueName.to_stringname)>>=fun_->Ok(`Value(parent',name))endmoduleL=struct(** Label *)typet=Resolved.Label.tletin_envenvname:tref_result=env_lookup_by_nameEnv.s_labelnameenv>>=fun(`Label(id,_))->Ok(`Identifierid)letin_page_env(`P(_,p))name=letrecfind=function|hd::tl->(matchOdoc_model.Location_.valuehdwith|`Heading(_,(`Label(_,name')aslabel),_)whenname=LabelName.to_stringname'->Ok(`Identifierlabel)|_->findtl)|[]->Error(`Find_by_name(`Page,name))infindp.Odoc_model.Lang.Page.contentletof_component_env~parent_reflabel=Ok(`Label((parent_ref:>Resolved.LabelParent.t),Ident.Name.typed_labellabel.Component.Label.label))letin_label_parentenv(parent:label_parent_lookup_result)name=matchparentwith|`S(p,_,sg)->find_ambiguous~kind:`LabelFind.label_in_sigsg(LabelName.to_stringname)>>=fun_->Ok(`Label((p:>Resolved.LabelParent.t),name))|(`T_|`C_|`CT_)asr->wrong_kind_error[`S;`Page]r|`P_aspage->in_pageenvpage(LabelName.to_stringname)endmoduleEC=struct(** Extension constructor *)typet=Resolved.Constructor.tletin_envenvname=env_lookup_by_nameEnv.s_extensionnameenv>>=fun(`Extension(id,_))->Ok(`Identifierid:>t)letof_component_env~parent_refname=Ok(`Extension(parent_ref,ExtensionName.make_stdname))letin_signature_env((parent',parent_cp,sg):signature_lookup_result)name=letsg=Tools.prefix_signature(parent_cp,sg)infindFind.extension_in_sigsg(ExtensionName.to_stringname)>>=fun_->Ok(`Extension(parent',name))endmoduleEX=struct(** Exception *)typet=Resolved.Exception.tletin_envenvname:tref_result=env_lookup_by_nameEnv.s_exceptionnameenv>>=fun(`Exception(id,_))->Ok(`Identifierid)letof_component_env~parent_refname=Ok(`Exception(parent_ref,name))letin_signature_env((parent',parent_cp,sg):signature_lookup_result)name=letsg=Tools.prefix_signature(parent_cp,sg)infindFind.exception_in_sigsg(ExceptionName.to_stringname)>>=fun_->Ok(`Exception(parent',name))endmoduleCS=struct(** Constructor *)typet=Resolved.Constructor.tletin_envenvname=env_lookup_by_nameEnv.s_constructornameenv>>=fun(`Constructor(id,_))->Ok(`Identifierid:>t)letin_datatype_env((parent',t):datatype_lookup_result)name=letname_s=ConstructorName.to_stringnameinfindFind.any_in_typetname_s>>=function|`FConstructor_->Ok(`Constructor(parent',name))|`FField_->Error(`Find_by_name(`Cons,name_s))letof_component_envparentname=Ok(`Constructor(parent,ConstructorName.make_stdname))endmoduleF=struct(** Field *)typet=Resolved.Field.tletin_envenvname=env_lookup_by_nameEnv.s_fieldnameenv>>=fun(`Field(id,_))->Ok(`Identifierid:>t)letgot_a_constructorname=(* Let's pretend we didn't see the constructor and say we didn't find anything. *)Error(`Find_by_name(`Field,name))letin_parent_env(parent:label_parent_lookup_result)name=letname_s=FieldName.to_stringnameinmatchparentwith|`S(parent',parent_cp,sg)->(letsg=Tools.prefix_signature(parent_cp,sg)infind_ambiguousFind.any_in_type_in_sigsgname_s>>=function|`In_type(_,_,`FConstructor_)->got_a_constructorname_s|`In_type(typ_name,_,`FField_)->Ok(`Field(`Type(parent',typ_name),name)))|`T(parent',t)->(findFind.any_in_typetname_s>>=function|`FConstructor_->got_a_constructorname_s|`FField_->Ok(`Field((parent':>Resolved.Parent.t),name)))|(`C_|`CT_|`P_)asr->wrong_kind_error[`S;`T]rletof_component_envparentname=Ok(`Field((parent:Resolved.DataType.t:>Resolved.Parent.t),FieldName.make_stdname))endmoduleMM=struct(** Method *)typet=Resolved.Method.t(* TODO: Resolve methods in env *)letin_env_envname:tref_result=Error(`Lookup_by_name(`Any,name))letin_class_signature_env(parent',cs)name=findFind.method_in_class_signaturecs(MethodName.to_stringname)>>=fun_->Ok(`Method(parent',name))letof_component_envparent'name=Ok(`Method(parent',name))endmoduleMV=struct(** Instance variable *)typet=Resolved.InstanceVariable.t(* TODO: Resolve instance variables in env *)letin_env_envname:tref_result=Error(`Lookup_by_name(`Any,name))letin_class_signature_env(parent',cs)name=findFind.instance_variable_in_class_signaturecs(InstanceVariableName.to_stringname)>>=fun_->Ok(`InstanceVariable(parent',name))letof_component_envparent'name=Ok(`InstanceVariable(parent',name))endmodulePage=structtypet=page_lookup_resultletin_envenvname:tref_result=matchEnv.lookup_pagenameenvwith|Somep->Ok(`Identifierp.Odoc_model.Lang.Page.name,p)|None->Error(`Lookup_by_name(`Page,name))letof_element_env(`Page(id,page)):t=(`Identifierid,page)endmoduleLP=struct(** Label parent *)typet=label_parent_lookup_resultletof_elementenv:_->tref_result=function|`Module_ase->M.of_elementenve|>module_lookup_to_signature_lookupenv>>=funr->Ok(`Sr)|`ModuleType_ase->MT.of_elementenve|>module_type_lookup_to_signature_lookupenv>>=funr->Ok(`Sr)|`Type_ase->Ok(`T(DT.of_elementenve))|`Class_ase->Ok(`C(CL.of_elementenve))|`ClassType_ase->Ok(`CT(CT.of_elementenve))|`Page_ase->Ok(`P(Page.of_elementenve))letin_envenvname=env_lookup_by_nameEnv.s_label_parentnameenv>>=of_elementenvletin_signatureenv((parent',parent_cp,sg):signature_lookup_result)name=letsg=Tools.prefix_signature(parent_cp,sg)infind_ambiguousFind.label_parent_in_sigsgname>>=function|`FModule(name,m)->module_lookup_to_signature_lookupenv(M.of_componentenvm(`Module(parent_cp,name))(`Module(parent',name)))>>=funs->Ok(`Ss)|`FModuleType(name,mt)->module_type_lookup_to_signature_lookupenv(MT.of_componentenvmt(`ModuleType(parent_cp,name))(`ModuleType(parent',name)))>>=funs->Ok(`Ss)|`FType(name,t)->DT.of_componentenv~parent_ref:parent'tname>>=funt->Ok(`Tt)|`FClass(name,c)->CL.of_componentenv~parent_ref:parent'cname>>=func->Ok(`Cc)|`FClassType(name,ct)->CT.of_componentenv~parent_ref:parent'ctname>>=funct->Ok(`CTct)endletrecresolve_label_parent_referenceenvr=letlabel_parent_res_of_type_res:type_lookup_result->_=funr->Ok(r:>label_parent_lookup_result)inmatchrwith|`Resolved_->failwith"unimplemented"|`Root(name,`TUnknown)->LP.in_envenvname|(`Module_|`ModuleType_|`Root(_,(`TModule|`TModuleType)))assr->resolve_signature_referenceenvsr>>=funs->Ok(`Ss)|`Root(name,`TType)->T.in_envenvname>>=label_parent_res_of_type_res|`Type(parent,name)->resolve_signature_referenceenvparent>>=funp->T.in_signatureenvp(TypeName.to_stringname)>>=label_parent_res_of_type_res|`Root(name,`TClass)->CL.in_envenvname>>=funr->Ok(`Cr)|`Class(parent,name)->resolve_signature_referenceenvparent>>=funp->T.in_signatureenvp(ClassName.to_stringname)>>=class_lookup_result_of_type>>=funr->Ok(`Cr)|`Root(name,`TClassType)->CT.in_envenvname>>=funr->Ok(`CTr)|`ClassType(parent,name)->resolve_signature_referenceenvparent>>=funp->T.in_signatureenvp(ClassTypeName.to_stringname)>>=class_type_lookup_result_of_type>>=funr->Ok(`CTr)|`Dot(parent,name)->resolve_label_parent_referenceenvparent>>=signature_lookup_result_of_label_parent>>=funp->LP.in_signatureenvpname|`Root(name,`TPage)|`Root(name,`TChildPage)->Page.in_envenvname>>=funr->Ok(`Pr)|`Root(name,`TChildModule)->resolve_signature_referenceenv(`Root(name,`TModule))>>=funs->Ok(`Ss)andresolve_signature_reference:Env.t->Signature.t->signature_lookup_resultref_result=funenv'r->letresolveenv=matchrwith|`Resolved_r->failwith"What's going on here then?"(* Some (resolve_resolved_signature_reference env r ~add_canonical) *)|`Root(name,`TModule)->M.in_envenvname>>=module_lookup_to_signature_lookupenv|`Module(parent,name)->resolve_signature_referenceenvparent>>=funp->M.in_signatureenvp(ModuleName.to_stringname)>>=module_lookup_to_signature_lookupenv|`Root(name,`TModuleType)->MT.in_envenvname>>=module_type_lookup_to_signature_lookupenv|`ModuleType(parent,name)->resolve_signature_referenceenvparent>>=funp->MT.in_signatureenvp(ModuleTypeName.to_stringname)>>=module_type_lookup_to_signature_lookupenv|`Root(name,`TUnknown)->(env_lookup_by_nameEnv.s_signaturenameenv>>=function|`Module(_,_)ase->module_lookup_to_signature_lookupenv(M.of_elementenve)|`ModuleType(_,_)ase->module_type_lookup_to_signature_lookupenv(MT.of_elementenve))|`Dot(parent,name)->(resolve_label_parent_referenceenvparent>>=signature_lookup_result_of_label_parent>>=fun(parent,parent_cp,sg)->letparent_cp=Tools.reresolve_parentenvparent_cpinletsg=Tools.prefix_signature(parent_cp,sg)infind_ambiguous~kind:`SFind.signature_in_sigsgname>>=function|`FModule(name,m)->module_lookup_to_signature_lookupenv(M.of_componentenvm(`Module(parent_cp,name))(`Module(parent,name)))|`FModuleType(name,mt)->module_type_lookup_to_signature_lookupenv(MT.of_componentenvmt(`ModuleType(parent_cp,name))(`ModuleType(parent,name))))inresolveenv'andresolve_datatype_reference:Env.t->DataType.t->datatype_lookup_resultref_result=funenvr->matchrwith|`Resolved_->failwith"TODO"|`Root(name,(`TType|`TUnknown))->DT.in_envenvname|`Type(parent,name)->resolve_signature_referenceenvparent>>=funp->DT.in_signatureenvp(TypeName.to_stringname)|`Dot(parent,name)->resolve_label_parent_referenceenvparent>>=signature_lookup_result_of_label_parent>>=funp->DT.in_signatureenvpnameandresolve_module_referenceenv(r:Module.t):M.tref_result=matchrwith|`Resolved_r->failwith"What's going on!?"(* Some (resolve_resolved_module_reference env r ~add_canonical)*)|`Dot(parent,name)->resolve_label_parent_referenceenvparent>>=signature_lookup_result_of_label_parent>>=funp->M.in_signatureenvpname|`Module(parent,name)->resolve_signature_referenceenvparent>>=funp->M.in_signatureenvp(ModuleName.to_stringname)|`Root(name,_)->M.in_envenvnameletresolve_class_signature_referenceenv(r:ClassSignature.t)=(* Casting from ClassSignature to LabelParent.
TODO: Add [resolve_class_signature_reference] when it's easier to implement. *)resolve_label_parent_referenceenv(r:>LabelParent.t)>>=function|(`T_|`C_|`CT_)asp->type_lookup_to_class_signature_lookupenvp|(`S_|`P_)asr->wrong_kind_error[`T;`C;`CT]r(***)letresolved1r=Ok(r:>Resolved.t)letresolved3(r,_,_)=resolved1randresolved2(r,_)=resolved1rletresolved_type_lookup=function|`T(r,_)->resolved1r|`C(r,_)->resolved1r|`CT(r,_)->resolved1rletresolve_reference_dot_sgenv~parent_path~parent_ref~parent_sgname=letparent_path=Tools.reresolve_parentenvparent_pathinletparent_sg=Tools.prefix_signature(parent_path,parent_sg)infind_ambiguousFind.any_in_sigparent_sgname>>=function|`FModule(name,m)->resolved3(M.of_componentenvm(`Module(parent_path,name))(`Module(parent_ref,name)))|`FModuleType(name,mt)->resolved3(MT.of_componentenvmt(`ModuleType(parent_path,name))(`ModuleType(parent_ref,name)))|`FType(name,t)->DT.of_componentenvt~parent_refname>>=resolved2|`FClass(name,c)->CL.of_componentenvc~parent_refname>>=resolved2|`FClassType(name,ct)->CT.of_componentenvct~parent_refname>>=resolved2|`FValue(name,_)->V.of_componentenv~parent_refname>>=resolved1|`FLabellabel->L.of_componentenv~parent_reflabel>>=resolved1|`FExn(name,_)->EX.of_componentenv~parent_refname>>=resolved1|`FExt_->EC.of_componentenv~parent_refname>>=resolved1|`In_type(typ_name,_,r)->(letparent=`Type(parent_ref,typ_name)inmatchrwith|`FConstructor_->CS.of_componentenvparentname>>=resolved1|`FField_->F.of_componentenvparentname>>=resolved1)|`FModule_subst_|`FType_subst_|`FModuleType_subst_->Error(`Find_by_name(`Any,name))letresolve_reference_dot_pageenvpagename=L.in_pageenvpagename>>=resolved1letresolve_reference_dot_typeenv~parent_reftname=findFind.any_in_typetname>>=function|`FConstructor_->CS.of_componentenvparent_refname>>=resolved1|`FField_->F.of_componentenvparent_refname>>=resolved1letresolve_reference_dot_classenvpname=type_lookup_to_class_signature_lookupenvp>>=fun(parent_ref,cs)->find_ambiguousFind.any_in_class_signaturecsname>>=function|`FMethod(name,_)->MM.of_componentenvparent_refname>>=resolved1|`FInstance_variable(name,_)->MV.of_componentenvparent_refname>>=resolved1letresolve_reference_dotenvparentname=resolve_label_parent_referenceenvparent>>=function|`S(parent_ref,parent_path,parent_sg)->resolve_reference_dot_sg~parent_path~parent_ref~parent_sgenvname|`T(parent_ref,t)->resolve_reference_dot_typeenv~parent_reftname|(`C_|`CT_)asp->resolve_reference_dot_classenvpname|`P_aspage->resolve_reference_dot_pageenvpagename(** Warnings may be generated with [Error.implicit_warning] *)letresolve_reference=letresolved=resolved3infunenvr->matchrwith|`Root(name,`TUnknown)->(letidentifierid=Ok(`Identifier(id:>Identifier.t))inenv_lookup_by_nameEnv.s_anynameenv>>=function|`Module(_,_)ase->resolved(M.of_elementenve)|`ModuleType(_,_)ase->resolved(MT.of_elementenve)|`Value(id,_)->identifierid|`Type(id,_)->identifierid|`Label(id,_)->identifierid|`Class(id,_)->identifierid|`ClassType(id,_)->identifierid|`Constructor(id,_)->identifierid|`Exception(id,_)->identifierid|`Extension(id,_)->identifierid|`Field(id,_)->identifierid|`Page(id,_)->identifierid)|`Resolvedr->Okr|`Root(name,(`TModule|`TChildModule))->M.in_envenvname>>=resolved|`Module(parent,name)->resolve_signature_referenceenvparent>>=funp->M.in_signatureenvp(ModuleName.to_stringname)>>=resolved|`Root(name,`TModuleType)->MT.in_envenvname>>=resolved|`ModuleType(parent,name)->resolve_signature_referenceenvparent>>=funp->MT.in_signatureenvp(ModuleTypeName.to_stringname)>>=resolved|`Root(name,`TType)->T.in_envenvname>>=resolved_type_lookup|`Type(parent,name)->resolve_signature_referenceenvparent>>=funp->T.in_signatureenvp(TypeName.to_stringname)>>=resolved_type_lookup|`Root(name,`TClass)->CL.in_envenvname>>=resolved2|`Class(parent,name)->resolve_signature_referenceenvparent>>=funp->T.in_signatureenvp(ClassName.to_stringname)>>=class_lookup_result_of_type>>=resolved2|`Root(name,`TClassType)->CT.in_envenvname>>=resolved2|`ClassType(parent,name)->resolve_signature_referenceenvparent>>=funp->T.in_signatureenvp(ClassTypeName.to_stringname)>>=class_type_lookup_result_of_type>>=resolved2|`Root(name,`TValue)->V.in_envenvname>>=resolved1|`Value(parent,name)->resolve_signature_referenceenvparent>>=funp->V.in_signatureenvpname>>=resolved1|`Root(name,`TLabel)->L.in_envenvname>>=resolved1|`Label(parent,name)->resolve_label_parent_referenceenvparent>>=funp->L.in_label_parentenvpname>>=resolved1|`Root(name,(`TPage|`TChildPage))->Page.in_envenvname>>=resolved2|`Dot(parent,name)->resolve_reference_dotenvparentname|`Root(name,`TConstructor)->CS.in_envenvname>>=resolved1|`Constructor(parent,name)->resolve_datatype_referenceenvparent>>=funp->CS.in_datatypeenvpname>>=resolved1|`Root(name,`TException)->EX.in_envenvname>>=resolved1|`Exception(parent,name)->resolve_signature_referenceenvparent>>=funp->EX.in_signatureenvpname>>=resolved1|`Root(name,`TExtension)->EC.in_envenvname>>=resolved1|`Extension(parent,name)->resolve_signature_referenceenvparent>>=funp->EC.in_signatureenvpname>>=resolved1|`Root(name,`TField)->F.in_envenvname>>=resolved1|`Field(parent,name)->resolve_label_parent_referenceenv(parent:Parent.t:>LabelParent.t)>>=funp->F.in_parentenvpname>>=resolved1|`Root(name,`TMethod)->MM.in_envenvname>>=resolved1|`Method(parent,name)->resolve_class_signature_referenceenvparent>>=funp->MM.in_class_signatureenvpname>>=resolved1|`Root(name,`TInstanceVariable)->MV.in_envenvname>>=resolved1|`InstanceVariable(parent,name)->resolve_class_signature_referenceenvparent>>=funp->MV.in_class_signatureenvpname>>=resolved1letresolve_module_referenceenvm=Odoc_model.Error.catch_warnings(fun()->resolve_module_referenceenvm)letresolve_referenceenvm=Odoc_model.Error.catch_warnings(fun()->resolve_referenceenvm)