123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191(** Used inside Dune and in the outside library dune_site.plugin *)moduleMake(Stdune:sigmoduleLoc:sigtypetvalof_lexbuf:Lexing.lexbuf->tendmoduleLib_name:sigtypetvalparse_string_exn:Loc.t*string->tendmodulePp:sigtype+'tagtvaltext:string->_tendmoduleUser_message:sigmoduleStyle:sigtypetendmoduleAnnots:sigtypetendendmoduleUser_error:sigvalraise:?loc:Loc.t->?hints:User_message.Style.tPp.tlist->?annots:User_message.Annots.t->User_message.Style.tPp.tlist->_endend)=structopenStdunetypet={name:Lib_name.toption;entries:entrylist}andentry=|Commentofstring|Ruleofrule|Packageoftandrule={var:string;predicates:predicatelist;action:action;value:string}andaction=|Set|Addandpredicate=|Posofstring|Negofstringletadd_versionst~get_version=letrecmap_entries~rev_path~has_version~has_rules=function|[]->ifhas_version||nothas_rulesthen[]else(matchget_version(List.revrev_path)with|None->[]|Somev->[Rule{var="version";predicates=[];action=Set;value=v}])|entry::entries->(matchentrywith|Comment_->entry::map_entriesentries~rev_path~has_version~has_rules|Rulerule->entry::map_entriesentries~rev_path~has_version:(has_version||String.equalrule.var"version")~has_rules:true|Packaget->Package(map_packaget~rev_path)::map_entriesentries~rev_path~has_version~has_rules)andmap_packaget~rev_path=letrev_path=matcht.namewith|None->rev_path|Somen->n::rev_pathin{twithentries=map_entriest.entries~rev_path~has_version:false~has_rules:false}inmap_packaget~rev_path:[];;moduleParse=structleterrorlexbufmsg=User_error.raise~loc:(Loc.of_lexbuflexbuf)[Pp.textmsg]letnext=letuser_errorlexbufmsg=Stdune.User_error.raise~loc:(Stdune.Loc.of_lexbuflexbuf)[Stdune.Pp.textmsg]inMeta_lexer.token{user_error};;letpackage_namelb=matchnextlbwith|Strings->ifString.containss'.'thenerrorlb"'.' not allowed in sub-package names";letloc=Loc.of_lexbuflbinLib_name.parse_string_exn(loc,s)|_->errorlb"package name expected";;letstringlb=matchnextlbwith|Strings->s|_->errorlb"string expected";;letlparenlb=matchnextlbwith|Lparen->()|_->errorlb"'(' expected";;letactionlb=matchnextlbwith|Equal->Set|Plus_equal->Add|_->errorlb"'=' or '+=' expected";;letrecpredicates_and_actionlbacc=matchnextlbwith|Rparen->List.revacc,actionlb|Namen->after_predicatelb(Posn::acc)|Minus->letn=matchnextlbwith|Namep->p|_->errorlb"name expected"inafter_predicatelb(Negn::acc)|_->errorlb"name, '-' or ')' expected"andafter_predicatelbacc=matchnextlbwith|Rparen->List.revacc,actionlb|Comma->predicates_and_actionlbacc|_->errorlb"')' or ',' expected";;letrecentrieslbdepthacc=matchnextlbwith|Rparen->ifdepth>0thenList.revaccelseerrorlb"closing parenthesis without matching opening one"|Eof->ifdepth=0thenList.revaccelseerrorlb(Printf.sprintf"%d closing parentheses missing"depth)|Name"package"->letname=package_namelbinlparenlb;letsub_entries=entrieslb(depth+1)[]inentrieslbdepth(Package{name=Somename;entries=sub_entries}::acc)|Namevar->letpredicates,action=matchnextlbwith|Equal->[],Set|Plus_equal->[],Add|Lparen->predicates_and_actionlb[]|_->errorlb"'=', '+=' or '(' expected"inletvalue=stringlbinentrieslbdepth(Rule{var;predicates;action;value}::acc)|_->errorlb"'package' or variable name expected";;endend