Module Ppx_core.Context_free.Rule

Local rewriting rules.

This module lets you define local rewriting rules, such as extension point expanders. It is not completely generic and you cannot define any kind of rewriting, it currently focuses on what is commonly used. New scheme can be added on demand.

We have some ideas to make this fully generic, but this hasn't been a priority so far.

type t
val extension : Extension.t ‑> t

Rewrite an extension point

val special_function : Ppx_core__.Import.string ‑> (Ppx_core__.Import.expression ‑> Ppx_core__.Import.expression Ppx_core__.Import.option) ‑> t

special_function id expand is a rule to rewrite a function call at parsing time. id is the identifier to match on and expand is used to expand the full function application (it gets the Pexp_apply node). If the function is found in the tree without being applied, expand gets only the identifier (Pexp_ident node) so you should handle both cases.

expand must decide whether the expression it receive can be rewritten or not. Especially ppx_core makes the assumption that expand is idempotent. It will loop if it is not.

The rest of this API is for rewriting rules that apply when a certain attribute is present. The API is not complete and is currently only enough to implement type_conv.

type ('a, 'b, 'c) attr_group_inline = ('b'cAttribute.t ‑> (loc:Location.t ‑> path:Ppx_core__.Import.string ‑> Ppx_core__.Import.Asttypes.rec_flag ‑> 'b Ppx_core__.Import.list ‑> 'c Ppx_core__.Import.option Ppx_core__.Import.list ‑> 'a Ppx_core__.Import.list) ‑> t

Match the attribute on a group of items, such as a group of recursive type definitions (Pstr_type, Psig_type). The expander will be triggered if any of the item has the attribute. The expander is called as follow:

expand ~loc ~path rec_flag items values

where values is the list of values associated to the attribute for each item in items. expand must return a list of element to add after the group. For instance a list of structure item to add after a group of type definitions.

val attr_str_type_decl : (Ppx_core__.Import.structure_itemPpx_core__.Import.type_declaration_attr_group_inline
val attr_sig_type_decl : (Ppx_core__.Import.signature_itemPpx_core__.Import.type_declaration_attr_group_inline
val attr_str_type_decl_expect : (Ppx_core__.Import.structure_itemPpx_core__.Import.type_declaration_attr_group_inline

The _expect variants are for producing code that is compared to what the user wrote in the source code.

val attr_sig_type_decl_expect : (Ppx_core__.Import.signature_itemPpx_core__.Import.type_declaration_attr_group_inline
type ('a, 'b, 'c) attr_inline = ('b'cAttribute.t ‑> (loc:Location.t ‑> path:Ppx_core__.Import.string ‑> 'b ‑> 'c ‑> 'a Ppx_core__.Import.list) ‑> t

Same as attr_group_inline but for elements that are not part of a group, such as exceptions and type extensions

val attr_str_type_ext : (Ppx_core__.Import.structure_itemPpx_core__.Import.type_extension_attr_inline
val attr_sig_type_ext : (Ppx_core__.Import.signature_itemPpx_core__.Import.type_extension_attr_inline
val attr_str_type_ext_expect : (Ppx_core__.Import.structure_itemPpx_core__.Import.type_extension_attr_inline
val attr_sig_type_ext_expect : (Ppx_core__.Import.signature_itemPpx_core__.Import.type_extension_attr_inline
val attr_str_exception : (Ppx_core__.Import.structure_itemPpx_core__.Import.extension_constructor_attr_inline
val attr_sig_exception : (Ppx_core__.Import.signature_itemPpx_core__.Import.extension_constructor_attr_inline
val attr_str_exception_expect : (Ppx_core__.Import.structure_itemPpx_core__.Import.extension_constructor_attr_inline
val attr_sig_exception_expect : (Ppx_core__.Import.signature_itemPpx_core__.Import.extension_constructor_attr_inline