1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677open!Importtypet={file_path:string;main_module_name:string;submodule_path:stringloclist;enclosing_module:string;enclosing_value:stringoption;value:stringlocoption;in_expr:bool;}letremove_all_extensionsbasename=matchString.split_on_char~sep:'.'basenamewith|[]->assertfalse(* split_on_char never returns the empty list *)|name::_->namelettop_level~file_path=letmain_module_name=file_path|>Stdlib.Filename.basename|>remove_all_extensions|>String.capitalize_asciiin{file_path;main_module_name;submodule_path=[];enclosing_module=main_module_name;enclosing_value=None;value=None;in_expr=false;}letfile_patht=t.file_pathletmain_module_namet=t.main_module_nameletenclosing_modulet=t.enclosing_moduleletenclosing_valuet=t.enclosing_valueletsubmodule_patht=List.rev_map~f:(funlocated->located.txt)t.submodule_pathletvaluet=Option.map~f:(funlocated->located.txt)t.valueletfully_qualified_patht=letvalue=valuetinletsubmodule_path=List.rev_map~f:(funlocated->Somelocated.txt)t.submodule_pathinletnames=(Somet.main_module_name::submodule_path)@[value]inString.concat~sep:"."@@List.filter_optnamesletenter_exprt={twithin_expr=true}letenter_module~locmodule_namet=ift.in_exprthen{twithenclosing_module=module_name}else{twithsubmodule_path={txt=module_name;loc}::t.submodule_path;enclosing_module=module_name;}letenter_value~locvalue_namet=ift.in_exprthen{twithenclosing_value=Somevalue_name}else{twithvalue=Some{txt=value_name;loc};enclosing_value=Somevalue_name;}letto_string_patht=String.concat~sep:"."(t.file_path::submodule_patht)letwith_string_pathf~loc~path=f~loc~path:(to_string_pathpath);;letmoduleM=structleta="lol"endinM.a