module Ast_mapper:sig..end
A -ppx rewriter is a program that accepts a serialized abstract syntax tree and outputs another, possibly modified, abstract syntax tree. This module encapsulates the interface between the compiler and the -ppx rewriters, handling such details as the serialization format, forwarding of command-line flags, and storing state.
Ast_mapper.mapper allows to implement AST rewriting using open recursion.
A typical mapper would be based on Ast_mapper.default_mapper, a deep
identity mapper, and will fall back on it for handling the syntax it
does not modify. For example:
open Asttypes
open Parsetree
open Ast_mapper
let test_mapper argv =
{ default_mapper with
expr = fun mapper expr ->
match expr with
| { pexp_desc = Pexp_extension ({ txt = "test" }, PStr [])} ->
Ast_helper.Exp.constant (Const_int 42)
| other -> default_mapper.expr mapper other; }
let () =
register "ppx_test" test_mapper
This -ppx rewriter, which replaces [%test] in expressions with
the constant 42, can be compiled using
ocamlc -o ppx_test -I +compiler-libs ocamlcommon.cma ppx_test.ml.
type mapper = {val default_mapper : mapperval tool_name : unit -> string"ocamlc", "ocamlopt", "ocamldoc", "ocamldep",
"ocaml", ... Some global variables that reflect command-line
options are automatically synchronized between the calling tool
and the ppx preprocessor: Clflags.include_dirs,
Config.load_path, Clflags.open_modules, Clflags.for_package,
Clflags.debug.val apply : source:string -> target:string -> mapper -> unitsource file and put the result in the
target file. The structure or signature field of the mapper
is applied to the implementation or interface.val run_main : (string list -> mapper) -> unitLocation.input_name. This
function implements proper error reporting for uncaught
exceptions.val register_function : (string -> (string list -> mapper) -> unit) ref
val register : string -> (string list -> mapper) -> unitregister_function. The default behavior is to run the
mapper immediately, taking arguments from the process command
line. This is to support a scenario where a mapper is linked as a
stand-alone executable.
It is possible to overwrite the register_function to define
"-ppx drivers", which combine several mappers in a single process.
Typically, a driver starts by defining register_function to a
custom implementation, then lets ppx rewriters (linked statically
or dynamically) register themselves, and then run all or some of
them. It is also possible to have -ppx drivers apply rewriters to
only specific parts of an AST.
The first argument to register is a symbolic name to be used by
the ppx driver.
val map_opt : ('a -> 'b) -> 'a option -> 'b option
val extension_of_error : Location.error -> Parsetree.extensionval attribute_of_warning : Location.t -> string -> Parsetree.attributeval add_ppx_context_str : tool_name:string -> Parsetree.structure -> Parsetree.structureval add_ppx_context_sig : tool_name:string -> Parsetree.signature -> Parsetree.signatureadd_ppx_context_str, but for signatures.val drop_ppx_context_str : restore:bool -> Parsetree.structure -> Parsetree.structurerestore is true, also restore the associated data in the current
process.val drop_ppx_context_sig : restore:bool -> Parsetree.signature -> Parsetree.signaturedrop_ppx_context_str, but for signatures. : string -> Parsetree.expression -> unit
: string -> Parsetree.expression option