1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283openPpxlibletlog_source_position=reffalselet()=Driver.add_arg"-log-source-position"(Setlog_source_position)~doc:" If set, adds a \"pos\" tag with a source code position to every logged message.";;letexpand~level~loc~path:_logmessage_args=letloc={locwithloc_ghost=true}inletpos=Ppx_here_expander.lift_position~locinletmaybe_pos=if!log_source_positionthen[%exprSome[%epos]]else[%exprNone]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[%exprifPpx_log_syntax.would_log[%elog](Some[%elevel])[@merlin.hide]thenPpx_log_syntax.sexp~level:[%elevel]?pos:[%emaybe_pos][%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}inletpos=Ppx_here_expander.lift_position~locinletmaybe_pos=if!log_source_positionthen[%exprSome[%epos]]else[%exprNone]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]?pos:[%emaybe_pos][%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])];;