123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212openResultmoduleError=Odoc_model.Errorletread_stringparent_definitionfilenametext=letlocation=letpos=Lexing.{pos_fname=filename;pos_lnum=1;pos_cnum=0;pos_bol=0}inLocation.{loc_start=pos;loc_end=pos;loc_ghost=true}inError.catch_errors_and_warnings(fun()->Doc_attr.pageparent_definitionlocationtext)letcorruptedfile=Error.raise_exception(Error.filename_only"corrupted"file)letnot_a_typedtreefile=Error.raise_exception(Error.filename_only"not a Typedtree"file)letnot_an_implementationfile=Error.raise_exception(Error.filename_only"not an implementation"file)letnot_an_interfacefile=Error.raise_exception(Error.filename_only"not an interface"file)letwrong_versionfile=Error.raise_exception(Error.filename_only"wrong OCaml version"file)leterror_msgfile(msg:string)=Error.raise_exception(Error.filename_only"%s"msgfile)typemake_root=module_name:string->digest:Digest.t->(Odoc_model.Root.t,[`Msgofstring])resultexceptionCorruptedexceptionNot_an_implementationexceptionNot_an_interfaceexceptionMake_root_errorofstringletread_cmt_infossource_id_optid~filename()=matchCmt_format.read_cmtfilenamewith|exceptionCmi_format.Error_->raiseCorrupted|cmt_info->(matchcmt_info.cmt_annotswith|Implementation_->Implementation.read_cmt_infossource_id_optidcmt_info|_->raiseNot_an_implementation)letmake_compilation_unit~make_root~imports~interface?sourcefile~name~id?canonical?shape_info~source_infocontent=letopenOdoc_model.Lang.Compilation_unitinletinterface,digest=matchinterfacewith|Somedigest->(true,digest)|None->(matchList.assocnameimportswith|Somedigest->(false,digest)|None->raiseCorrupted|exceptionNot_found->raiseCorrupted)inletroot=matchmake_root~module_name:name~digestwith|Okroot->root|Error(`Msgm)->raise(Make_root_errorm)inletimports=List.filter(fun(name',_)->name<>name')importsinletimports=List.map(fun(s,d)->Import.Unresolved(s,d))importsinletsource=matchsourcefilewith|Some(Somefile,Somedigest,build_dir)->Some{Source.file;digest;build_dir}|_->Nonein{id;root;digest;imports;source;interface;hidden=Odoc_model.Root.contains_double_underscorename;content;expansion=None;linked=false;canonical;source_info;shape_info;}letcompilation_unit_of_sig~make_root~imports~interface?sourcefile~name~id?canonical?shape_infosg=letcontent=Odoc_model.Lang.Compilation_unit.Modulesginmake_compilation_unit~make_root~imports~interface?sourcefile~name~id?canonical?shape_infocontentletread_cmti~make_root~parent~filename~cmt_filename_opt~source_id_opt()=letcmt_info=Cmt_format.read_cmtfilenameinmatchcmt_info.cmt_annotswith|Interfaceintf->(matchcmt_info.cmt_interface_digestwith|None->raiseCorrupted|Some_asinterface->letname=cmt_info.cmt_modnameinletsourcefile=(cmt_info.cmt_sourcefile,cmt_info.cmt_source_digest,cmt_info.cmt_builddir)inletid,sg,canonical=Cmti.read_interfaceparentnameintfinletshape_info,source_info=matchcmt_filename_optwith|Somecmt_filename->read_cmt_infossource_id_optid~filename:cmt_filename()|None->(None,None)incompilation_unit_of_sig~make_root~imports:cmt_info.cmt_imports~interface~sourcefile~name~id?shape_info~source_info?canonicalsg)|_->raiseNot_an_interfaceletread_cmt~make_root~parent~filename~source_id_opt()=matchCmt_format.read_cmtfilenamewith|exceptionCmi_format.Error(Not_an_interface_)->raiseNot_an_implementation|cmt_info->(letname=cmt_info.cmt_modnameinletsourcefile=(cmt_info.cmt_sourcefile,cmt_info.cmt_source_digest,cmt_info.cmt_builddir)inletinterface=cmt_info.cmt_interface_digestinletimports=cmt_info.cmt_importsinmatchcmt_info.cmt_annotswith|Packed(_,files)->letid=Odoc_model.Paths.Identifier.Mk.root(parent,Odoc_model.Names.ModuleName.make_stdname)inletitems=List.map(funfile->letpref=Misc.chop_extensionsfileinAstring.String.Ascii.capitalize(Filename.basenamepref))filesinletitems=List.sortString.compareitemsinletitems=List.map(funname->letid=Odoc_model.Paths.Identifier.Mk.module_(id,Odoc_model.Names.ModuleName.make_stdname)inletpath=`Rootnamein{Odoc_model.Lang.Compilation_unit.Packed.id;path})itemsinletcontent=Odoc_model.Lang.Compilation_unit.Packitemsinmake_compilation_unit~make_root~imports~interface~sourcefile~name~id~source_info:Nonecontent|Implementationimpl->letid,sg,canonical=Cmt.read_implementationparentnameimplinletshape_info,source_info=read_cmt_infossource_id_optid~filename()incompilation_unit_of_sig~make_root~imports~interface~sourcefile~name~id?canonical?shape_info~source_infosg|_->raiseNot_an_implementation)letread_cmi~make_root~parent~filename()=letcmi_info=Cmi_format.read_cmifilenameinmatchcmi_info.cmi_crcswith|(name,(Some_asinterface))::importswhenname=cmi_info.cmi_name->letid,sg=Cmi.read_interfaceparentname(Odoc_model.Compat.signaturecmi_info.cmi_sign)incompilation_unit_of_sig~make_root~imports~interface~name~id~source_info:Nonesg|_->raiseCorrupted(** Catch errors from reading the object files and some internal errors *)letwrap_errors~filenamef=Odoc_model.Error.catch_errors_and_warnings(fun()->tryf()with|Cmi_format.Error(Not_an_interface_)->not_an_interfacefilename|Cmt_format.Error(Not_a_typedtree_)->not_a_typedtreefilename|Cmi_format.Error(Wrong_version_interface_)->wrong_versionfilename|Cmi_format.Error(Corrupted_interface_)->corruptedfilename|Corrupted->corruptedfilename|Not_an_implementation->not_an_implementationfilename|Not_an_interface->not_an_interfacefilename|Make_root_errorm->error_msgfilenamem)letread_cmti~make_root~parent~filename~source_id_opt~cmt_filename_opt=wrap_errors~filename(read_cmti~make_root~parent~filename~source_id_opt~cmt_filename_opt)letread_cmt~make_root~parent~filename~source_id_opt=wrap_errors~filename(read_cmt~make_root~parent~filename~source_id_opt)letread_cmi~make_root~parent~filename=wrap_errors~filename(read_cmi~make_root~parent~filename)letread_location=Doc_attr.read_location