Parser_extended.Ast_mapperSourceThe interface of a -ppx rewriter
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.
mapper enables AST rewriting using open recursion. A typical mapper would be based on 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_mapperThis -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.
Warning: this module is unstable and part of compiler-libs.
type mapper = {attribute : mapper -> Parsetree.attribute -> Parsetree.attribute;attributes : mapper -> Parsetree.attribute list -> Parsetree.attribute list;binding_op : mapper -> Parsetree.binding_op -> Parsetree.binding_op;case : mapper -> Parsetree.case -> Parsetree.case;cases : mapper -> Parsetree.case list -> Parsetree.case list;class_declaration : mapper ->
Parsetree.class_declaration ->
Parsetree.class_declaration;class_description : mapper ->
Parsetree.class_description ->
Parsetree.class_description;class_expr : mapper -> Parsetree.class_expr -> Parsetree.class_expr;class_field : mapper -> Parsetree.class_field -> Parsetree.class_field;class_signature : mapper ->
Parsetree.class_signature ->
Parsetree.class_signature;class_structure : mapper ->
Parsetree.class_structure ->
Parsetree.class_structure;class_type : mapper -> Parsetree.class_type -> Parsetree.class_type;class_type_declaration : mapper ->
Parsetree.class_type_declaration ->
Parsetree.class_type_declaration;class_type_field : mapper ->
Parsetree.class_type_field ->
Parsetree.class_type_field;constant : mapper -> Parsetree.constant -> Parsetree.constant;constructor_declaration : mapper ->
Parsetree.constructor_declaration ->
Parsetree.constructor_declaration;expr : mapper -> Parsetree.expression -> Parsetree.expression;extension : mapper -> Parsetree.extension -> Parsetree.extension;extension_constructor : mapper ->
Parsetree.extension_constructor ->
Parsetree.extension_constructor;include_declaration : mapper ->
Parsetree.include_declaration ->
Parsetree.include_declaration;include_description : mapper ->
Parsetree.include_description ->
Parsetree.include_description;label_declaration : mapper ->
Parsetree.label_declaration ->
Parsetree.label_declaration;let_binding : mapper -> Parsetree.let_binding -> Parsetree.let_binding;let_bindings : mapper -> Parsetree.let_bindings -> Parsetree.let_bindings;location : mapper -> Ocaml_common.Location.t -> Ocaml_common.Location.t;module_binding : mapper ->
Parsetree.module_binding ->
Parsetree.module_binding;module_declaration : mapper ->
Parsetree.module_declaration ->
Parsetree.module_declaration;module_substitution : mapper ->
Parsetree.module_substitution ->
Parsetree.module_substitution;module_expr : mapper -> Parsetree.module_expr -> Parsetree.module_expr;module_type : mapper -> Parsetree.module_type -> Parsetree.module_type;module_type_declaration : mapper ->
Parsetree.module_type_declaration ->
Parsetree.module_type_declaration;open_declaration : mapper ->
Parsetree.open_declaration ->
Parsetree.open_declaration;open_description : mapper ->
Parsetree.open_description ->
Parsetree.open_description;pat : mapper -> Parsetree.pattern -> Parsetree.pattern;payload : mapper -> Parsetree.payload -> Parsetree.payload;signature : mapper -> Parsetree.signature -> Parsetree.signature;signature_item : mapper ->
Parsetree.signature_item ->
Parsetree.signature_item;structure : mapper -> Parsetree.structure -> Parsetree.structure;structure_item : mapper ->
Parsetree.structure_item ->
Parsetree.structure_item;typ : mapper -> Parsetree.core_type -> Parsetree.core_type;type_declaration : mapper ->
Parsetree.type_declaration ->
Parsetree.type_declaration;type_extension : mapper ->
Parsetree.type_extension ->
Parsetree.type_extension;type_exception : mapper ->
Parsetree.type_exception ->
Parsetree.type_exception;type_kind : mapper -> Parsetree.type_kind -> Parsetree.type_kind;value_description : mapper ->
Parsetree.value_description ->
Parsetree.value_description;with_constraint : mapper ->
Parsetree.with_constraint ->
Parsetree.with_constraint;directive_argument : mapper ->
Parsetree.directive_argument ->
Parsetree.directive_argument;toplevel_directive : mapper ->
Parsetree.toplevel_directive ->
Parsetree.toplevel_directive;toplevel_phrase : mapper ->
Parsetree.toplevel_phrase ->
Parsetree.toplevel_phrase;repl_phrase : mapper -> Parsetree.repl_phrase -> Parsetree.repl_phrase;}A mapper record implements one "method" per syntactic category, using an open recursion style: each method takes as its first argument the mapper to be applied to children in the syntax tree.