package ocamlformat-lib
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=031494ab770cef10a8f6aa1cbeb5660e46c3aa6c0cd457b110fec859a75e877d
sha512=35c0131f04c2c8ceb94f0f400e4b56690405ddebb482aec0c9962163001d9fd5b593455df08b508394949f2740ba28f1714dff9e1f17b618bdec62fd26fae281
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;
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.