package ocamlformat-lib
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=dc8f2a330ca3930b36cacb2623bb360ed8bdf6e4a8acd293dbd9e2241a6fd33d
sha512=b28f545425fb5375447c90022d065dc7fd51ed2f66d8c1f65a71a6ad2465d039a8686e8f18249e5ad3a2362fee6149c855ef30eb45fb9d06d743a53d26b3e26f
doc/ocamlformat-lib.parser_extended/Parser_extended/Ast_mapper/index.html
Module Parser_extended.Ast_mapperSource
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_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.
A generic Parsetree mapper
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.