123456789101112131415161718192021222324252627282930(* Based on https://github.com/jaredly/belt/blob/master/belt_ppx/Belt_ppx.ml,
rewriten in ppxlib register and Context_free.Rule.special_function *)openPpxlibletexpandere=letrecexpander'e=letloc=e.pexp_locinmatche.pexp_descwith|Pexp_apply({pexp_desc=Pexp_ident{txt=Lident"|.";_};pexp_loc_stack;pexp_loc=_;pexp_attributes=_},[(Nolabel,arg);(Nolabel,fn)])->(letfn=Option.value~default:fn(expander'fn)inletarg=Option.value~default:arg(expander'arg)inmatchfnwith|{pexp_desc=Pexp_apply(fn,args);pexp_loc;_}->letargs=List.filter_map(fun(lab,exp)->matchexpander'expwithSomee->Some(lab,e)|None->Some(lab,exp))argsinSome{pexp_desc=Pexp_apply(fn,(Nolabel,arg)::args);pexp_attributes=[];pexp_loc;pexp_loc_stack}|{pexp_desc=Pexp_construct(lident,None);pexp_loc;pexp_loc_stack;pexp_attributes=_}->Some{pexp_desc=Pexp_construct(lident,Somearg);pexp_attributes=[];pexp_loc;pexp_loc_stack}|_->Some(Ast_builder.Default.pexp_apply~locfn[(Nolabel,arg)]))|_->Noneinexpander'eletrule=Context_free.Rule.special_function"( |. )"expander