package ocamlformat-lib
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=2e4f596bf7aa367a844fe83ba0f6b0bf14b2a65179ddc082363fe9793d0375c5
sha512=b03d57462e65b11aa9f78dd5c4548251e8d1c5a1c9662f7502bdb10472aeb9df33c1d407350767a5223fbff9c01d53de85bafacd0274b49abc4b43701b159bee
doc/ocamlformat-lib.parser_extended/Parser_extended/Ast_mapper/index.html
Module Parser_extended.Ast_mapper
Source
The 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_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
.
Warning: this module is unstable and part of compiler-libs.
A generic Parsetree mapper
type mapper = {
arg_label : mapper -> Asttypes.arg_label -> Asttypes.arg_label;
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;
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_binding : mapper -> Parsetree.value_binding -> Parsetree.value_binding;
value_bindings : mapper -> Parsetree.value_bindings -> Parsetree.value_bindings;
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.