package ppx_log
Ppx_sexp_message-like extension nodes for lazily rendering log messages
Install
Dune Dependency
Authors
Maintainers
Sources
ppx_log-v0.15.0.tar.gz
sha256=037aa3c8c4dca5c7ce9154e981c146c92faeeac456931cf3c9496b4f9698763e
doc/src/ppx_log_kernel/ppx_log_kernel.ml.html
Source file ppx_log_kernel.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
open Ppxlib let log_source_position = ref false let () = Driver.add_arg "-log-source-position" (Set log_source_position) ~doc: " If set, adds a \"pos\" tag with a source code position to every logged message." ;; let expand ~level ~loc ~path:_ log message_args = let loc = { loc with loc_ghost = true } in let pos = Ppx_here_expander.lift_position ~loc in let maybe_pos = if !log_source_position then [%expr Some [%e pos]] else [%expr None] in let sexp = Ppx_sexp_message_expander.sexp_of_labelled_exprs ~omit_nil:false ~loc message_args in (* In order to use ppx_metaquot, we pass in a loc parameter to level. *) let level = level loc in [%expr if Ppx_log_syntax.would_log [%e log] (Some [%e level]) [@merlin.hide] then Ppx_log_syntax.sexp ~level:[%e level] ?pos:[%e maybe_pos] [%e log] [%e sexp] else Ppx_log_syntax.default] ;; let pattern = let open Ast_pattern in (* 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) ;; let ext name f = Extension.declare name Extension.Context.expression pattern (expand ~level:(fun loc -> f loc)) ;; (* [Global] has a similar structure to the above code, except that it doesn't bother with parsing out a [log] parameter. *) module Global = struct let expand ~level ~loc ~path message_args = let loc = { loc with loc_ghost = true } in let pos = Ppx_here_expander.lift_position ~loc in let maybe_pos = if !log_source_position then [%expr Some [%e pos]] else [%expr None] in let sexp = Ppx_sexp_message_expander.expand ~omit_nil:false ~path message_args in let level = level loc in [%expr if Ppx_log_syntax.Global.would_log (Some [%e level]) then Ppx_log_syntax.Global.sexp ~level:[%e level] ?pos:[%e maybe_pos] [%e sexp] else Ppx_log_syntax.Global.default] ;; let pattern = Ast_pattern.(single_expr_payload __) let ext name f = Extension.declare name Extension.Context.expression pattern (expand ~level:(fun loc -> f loc)) ;; end let () = Driver.register_transformation "log" ~extensions: [ ext "log.debug" (fun loc -> [%expr `Debug]) ; ext "log.info" (fun loc -> [%expr `Info]) ; ext "log.error" (fun loc -> [%expr `Error]) ; Global.ext "log.global.debug" (fun loc -> [%expr `Debug]) ; Global.ext "log.global.info" (fun loc -> [%expr `Info]) ; Global.ext "log.global.error" (fun loc -> [%expr `Error]) ] ;;
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>