123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103(** This module provides helper functions for [ppx_marshal] *)openPpxlibopenAst_builder.Default(** Generate an attribute to ignore the given warning ID *)letignore_warn~locwarn=attribute~loc~name:(Loc.make~loc"warning")~payload:(PStr[pstr_eval~loc(estring~loc("-"^Int.to_stringwarn))[]])(** Generate an attribute triggering a warning *)letwarn~loc?(prefix="@@marshal")str=attribute~loc~name:(Loc.make~loc"ppwarning")~payload:(PStr[pstr_eval~loc(estring~loc("["^prefix^"] "^str))[]])(** Generate a function with an unlabeled argument *)letfun_'~loc=pexp_fun~locNolabelNone(** Generate a function with an unlabeled argument variable *)letfun_~locarg=pvar~locarg|>fun_'~loc(** Generate a function with an unlabeled unpacked module variable *)letfun_m~locarg=Somearg|>Loc.make~loc|>ppat_unpack~loc|>fun_'~loc(** Generate a longident Loc.t from a string *)letlident_t~locx=lidentx|>Loc.make~loc(** Generate a longident Loc.t from a string Loc.t *)letlident_t'x=lidentx.txt|>Loc.make~loc:x.loc(** Generate a dotted expression *)letdot~locl=letrecdot_rec=function|[]->failwith"Unreachable"|hd::[]->lidenthd|hd::tl->Ldot(dot_rectl,hd)inList.revl|>dot_rec|>Loc.make~loc|>pexp_ident~loc(** Generate a function application to unlabelled args *)letapply~locnameargs=List.map(funarg->(Nolabel,arg))args|>pexp_apply~locname(** Generate a function application in the form [f ~v arg] *)letapply_v~locnameargarg'=pexp_apply~locname[(Labelled"v",arg);(Nolabel,arg')](** Generate a simple expression or a tuple, depending on the argument size *)lettuple_e~loc=function|[]->failwith"tuple_e"|hd::[]->hd|l->pexp_tuple~locl(** Generate a construct expression a bit more cleverly *)letconstruct_e~locname=letf=pexp_construct~loc(lident_t~locname)infunction|[]->fNone|l->Some(tuple_e~locl)|>f(** Generate a construct pattern a bit more cleverly *)letconstruct_p~locname=letf=ppat_construct~loc(lident_t~locname)infunction|[]->fNone|hd::[]->Somehd|>f|l->Some(ppat_tuple~locl)|>f(** Error generators *)leterr=Location.error_extensionf"[%s] %s"leteerrf~locstr=f~locstr|>pexp_extension~locleterr_ma=err"@@marshal"leteerr_ma=eerrerr_maletterr_ma~locstr=err_ma~locstr|>ptyp_extension~locleterr_me=err"%marshal"leteerr_me=eerrerr_meletserrf~locstr=letpayload=f~locstrinpstr_extension~locpayload[](** Build a list cons *)letcons~lochdtl=construct_e~loc"::"[hd;tl](** Capitalize a string *)letcap=String.capitalize_ascii(** Uncapitalize a string *)letuncap=String.uncapitalize_ascii(** Gendarmize a module name *)letgendarmizem="Gendarme_"^uncapm(** Wrap a value into a unit function *)letwrap~loc=pexp_fun~locNolabelNone(construct_p~loc"()"[])(** Unwrap a previously wrapped function *)letunwrap~loce=pexp_apply~loce[Nolabel,construct_e~loc"()"[]](** Generate a let expression *)letlet'~locflagpatexpr=pexp_let~locflag[value_binding~loc~pat~expr](** Default guard *)letguard=None(** Generate a raise expression *)letraise_~locnameargs=apply~loc(evar~loc"raise")[construct_e~locnameargs]