12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667openPpxlibletexpand~level~loc~path:_logmessage_args=letloc={locwithloc_ghost=true}inletsexp=Ppx_sexp_message_expander.sexp_of_labelled_exprs~omit_nil:false~locmessage_argsin(* In order to use ppx_metaquot, we pass in a loc parameter to level. *)letlevel=levellocin[%exprif(Ppx_log_syntax.would_log[%elog](Some[%elevel])[@merlin.hide])thenPpx_log_syntax.sexp~level:[%elevel][%elog][%esexp]elsePpx_log_syntax.default];;letpattern=letopenAst_patternin(* this grabs the first argument from the apply and
then passes it into Log.sexp's [log] parameter.
All the arguments of apply are parsed as a message. *)pstr(pstr_eval(pexp_apply____)nil^::nil);;letextnamef=Extension.declarenameExtension.Context.expressionpattern(expand~level:(funloc->floc));;(* [Global] has a similar structure to the above code, except that
it doesn't bother with parsing out a [log] parameter. *)moduleGlobal=structletexpand~level~loc~pathmessage_args=letloc={locwithloc_ghost=true}inletsexp=Ppx_sexp_message_expander.expand~omit_nil:false~pathmessage_argsinletlevel=levellocin[%exprifPpx_log_syntax.Global.would_log(Some[%elevel])thenPpx_log_syntax.Global.sexp~level:[%elevel][%esexp]elsePpx_log_syntax.Global.default];;letpattern=Ast_pattern.(single_expr_payload__)letextnamef=Extension.declarenameExtension.Context.expressionpattern(expand~level:(funloc->floc));;endlet()=Driver.register_transformation"log"~extensions:[ext"log.debug"(funloc->[%expr`Debug]);ext"log.info"(funloc->[%expr`Info]);ext"log.error"(funloc->[%expr`Error]);Global.ext"log.global.debug"(funloc->[%expr`Debug]);Global.ext"log.global.info"(funloc->[%expr`Info]);Global.ext"log.global.error"(funloc->[%expr`Error])];;