package ppxlib
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=63117b67ea5863935455fe921f88fe333c0530f0483f730313303a93af817efd
sha512=9cfc9587657d17cdee5483e2a03292f872c42886e512bcc7442652e6418ce74c0135c731d8a68288c7fecae7f1b2defd93fe5acf8edb41e25144a8cec2806227
doc/ppxlib/Ppxlib/index.html
Module Ppxlib
Source
Standard library for ppx rewriters
Make sure code using Ppxlib doesn't refer to compiler-libs without being explicit about it
include module type of struct include Ocaml_shadow end
with module Ast_helper := Ocaml_shadow.Ast_helper
with module Asttypes := Ocaml_shadow.Asttypes
with module Docstrings := Ocaml_shadow.Docstrings
with module Identifiable := Ocaml_shadow.Identifiable
with module Lexer := Ocaml_shadow.Lexer
with module Location := Ocaml_shadow.Location
with module Longident := Ocaml_shadow.Longident
with module Parse := Ocaml_shadow.Parse
with module Parsetree := Ocaml_shadow.Parsetree
with module Pprintast := Ocaml_shadow.Pprintast
with module Syntaxerr := Ocaml_shadow.Syntaxerr
Expose some modules from Ppxlib_ast; in particular, overwrite some of the modules above
Include all the Ast definitions since we need them in every single ppx
include module type of struct include Ast end
Auxiliary AST types used by parsetree and typedtree.
Abstract syntax tree produced by parsing
and constant = Astlib.Ast_414.Parsetree.constant =
| Pconst_integer of string * char option
| Pconst_char of char
| Pconst_string of string * location * string option
| Pconst_float of string * char option
Extension points
and payload = Astlib.Ast_414.Parsetree.payload =
| PStr of structure
| PSig of signature
| PTyp of core_type
| PPat of pattern * expression option
Core language
and core_type = Astlib.Ast_414.Parsetree.core_type = {
ptyp_desc : core_type_desc;
ptyp_loc : location;
ptyp_loc_stack : location_stack;
ptyp_attributes : attributes;
}
and core_type_desc = Astlib.Ast_414.Parsetree.core_type_desc =
| Ptyp_any
| Ptyp_var of string
| Ptyp_arrow of arg_label * core_type * core_type
| Ptyp_tuple of core_type list
| Ptyp_constr of longident_loc * core_type list
| Ptyp_object of object_field list * closed_flag
| Ptyp_class of longident_loc * core_type list
| Ptyp_alias of core_type * string
| Ptyp_variant of row_field list * closed_flag * label list option
| Ptyp_poly of string loc list * core_type
| Ptyp_package of package_type
| Ptyp_extension of extension
and row_field = Astlib.Ast_414.Parsetree.row_field = {
prf_desc : row_field_desc;
prf_loc : location;
prf_attributes : attributes;
}
and object_field = Astlib.Ast_414.Parsetree.object_field = {
pof_desc : object_field_desc;
pof_loc : location;
pof_attributes : attributes;
}
and pattern = Astlib.Ast_414.Parsetree.pattern = {
ppat_desc : pattern_desc;
ppat_loc : location;
ppat_loc_stack : location_stack;
ppat_attributes : attributes;
}
and pattern_desc = Astlib.Ast_414.Parsetree.pattern_desc =
| Ppat_any
| Ppat_var of string loc
| Ppat_alias of pattern * string loc
| Ppat_constant of constant
| Ppat_interval of constant * constant
| Ppat_tuple of pattern list
| Ppat_construct of longident_loc * (string loc list * pattern) option
| Ppat_variant of label * pattern option
| Ppat_record of (longident_loc * pattern) list * closed_flag
| Ppat_array of pattern list
| Ppat_or of pattern * pattern
| Ppat_constraint of pattern * core_type
| Ppat_type of longident_loc
| Ppat_lazy of pattern
| Ppat_unpack of string option loc
| Ppat_exception of pattern
| Ppat_extension of extension
| Ppat_open of longident_loc * pattern
and expression = Astlib.Ast_414.Parsetree.expression = {
pexp_desc : expression_desc;
pexp_loc : location;
pexp_loc_stack : location_stack;
pexp_attributes : attributes;
}
and expression_desc = Astlib.Ast_414.Parsetree.expression_desc =
| Pexp_ident of longident_loc
| Pexp_constant of constant
| Pexp_let of rec_flag * value_binding list * expression
| Pexp_function of cases
| Pexp_fun of arg_label * expression option * pattern * expression
| Pexp_apply of expression * (arg_label * expression) list
| Pexp_match of expression * cases
| Pexp_try of expression * cases
| Pexp_tuple of expression list
| Pexp_construct of longident_loc * expression option
| Pexp_variant of label * expression option
| Pexp_record of (longident_loc * expression) list * expression option
| Pexp_field of expression * longident_loc
| Pexp_setfield of expression * longident_loc * expression
| Pexp_array of expression list
| Pexp_ifthenelse of expression * expression * expression option
| Pexp_sequence of expression * expression
| Pexp_while of expression * expression
| Pexp_for of pattern * expression * expression * direction_flag * expression
| Pexp_constraint of expression * core_type
| Pexp_coerce of expression * core_type option * core_type
| Pexp_send of expression * label loc
| Pexp_new of longident_loc
| Pexp_setinstvar of label loc * expression
| Pexp_override of (label loc * expression) list
| Pexp_letmodule of string option loc * module_expr * expression
| Pexp_letexception of extension_constructor * expression
| Pexp_assert of expression
| Pexp_lazy of expression
| Pexp_poly of expression * core_type option
| Pexp_object of class_structure
| Pexp_newtype of string loc * expression
| Pexp_pack of module_expr
| Pexp_open of open_declaration * expression
| Pexp_letop of letop
| Pexp_extension of extension
| Pexp_unreachable
and case = Astlib.Ast_414.Parsetree.case = {
pc_lhs : pattern;
pc_guard : expression option;
pc_rhs : expression;
}
and letop = Astlib.Ast_414.Parsetree.letop = {
let_ : binding_op;
ands : binding_op list;
body : expression;
}
and binding_op = Astlib.Ast_414.Parsetree.binding_op = {
pbop_op : string loc;
pbop_pat : pattern;
pbop_exp : expression;
pbop_loc : location;
}
and value_description = Astlib.Ast_414.Parsetree.value_description = {
pval_name : string loc;
pval_type : core_type;
pval_prim : string list;
pval_attributes : attributes;
pval_loc : location;
}
and type_declaration = Astlib.Ast_414.Parsetree.type_declaration = {
ptype_name : string loc;
ptype_params : (core_type * (variance * injectivity)) list;
ptype_cstrs : (core_type * core_type * location) list;
ptype_kind : type_kind;
ptype_private : private_flag;
ptype_manifest : core_type option;
ptype_attributes : attributes;
ptype_loc : location;
}
and type_kind = Astlib.Ast_414.Parsetree.type_kind =
| Ptype_abstract
| Ptype_variant of constructor_declaration list
| Ptype_record of label_declaration list
| Ptype_open
and label_declaration = Astlib.Ast_414.Parsetree.label_declaration = {
pld_name : string loc;
pld_mutable : mutable_flag;
pld_type : core_type;
pld_loc : location;
pld_attributes : attributes;
}
and constructor_declaration = Astlib.Ast_414.Parsetree.constructor_declaration =
{
pcd_name : string loc;
pcd_vars : string loc list;
pcd_args : constructor_arguments;
pcd_res : core_type option;
pcd_loc : location;
pcd_attributes : attributes;
}
and constructor_arguments = Astlib.Ast_414.Parsetree.constructor_arguments =
| Pcstr_tuple of core_type list
| Pcstr_record of label_declaration list
and type_extension = Astlib.Ast_414.Parsetree.type_extension = {
ptyext_path : longident_loc;
ptyext_params : (core_type * (variance * injectivity)) list;
ptyext_constructors : extension_constructor list;
ptyext_private : private_flag;
ptyext_loc : location;
ptyext_attributes : attributes;
}
and extension_constructor = Astlib.Ast_414.Parsetree.extension_constructor = {
pext_name : string loc;
pext_kind : extension_constructor_kind;
pext_loc : location;
pext_attributes : attributes;
}
and type_exception = Astlib.Ast_414.Parsetree.type_exception = {
ptyexn_constructor : extension_constructor;
ptyexn_loc : location;
ptyexn_attributes : attributes;
}
and extension_constructor_kind =
Astlib.Ast_414.Parsetree.extension_constructor_kind =
| Pext_decl of string loc list * constructor_arguments * core_type option
| Pext_rebind of longident_loc
Class language
and class_type = Astlib.Ast_414.Parsetree.class_type = {
pcty_desc : class_type_desc;
pcty_loc : location;
pcty_attributes : attributes;
}
and class_type_desc = Astlib.Ast_414.Parsetree.class_type_desc =
| Pcty_constr of longident_loc * core_type list
| Pcty_signature of class_signature
| Pcty_arrow of arg_label * core_type * class_type
| Pcty_extension of extension
| Pcty_open of open_description * class_type
and class_signature = Astlib.Ast_414.Parsetree.class_signature = {
pcsig_self : core_type;
pcsig_fields : class_type_field list;
}
and class_type_field = Astlib.Ast_414.Parsetree.class_type_field = {
pctf_desc : class_type_field_desc;
pctf_loc : location;
pctf_attributes : attributes;
}
and class_type_field_desc = Astlib.Ast_414.Parsetree.class_type_field_desc =
| Pctf_inherit of class_type
| Pctf_val of label loc * mutable_flag * virtual_flag * core_type
| Pctf_method of label loc * private_flag * virtual_flag * core_type
| Pctf_constraint of core_type * core_type
| Pctf_attribute of attribute
| Pctf_extension of extension
and 'a class_infos = 'a Astlib.Ast_414.Parsetree.class_infos = {
pci_virt : virtual_flag;
pci_params : (core_type * (variance * injectivity)) list;
pci_name : string loc;
pci_expr : 'a;
pci_loc : location;
pci_attributes : attributes;
}
and class_expr = Astlib.Ast_414.Parsetree.class_expr = {
pcl_desc : class_expr_desc;
pcl_loc : location;
pcl_attributes : attributes;
}
and class_expr_desc = Astlib.Ast_414.Parsetree.class_expr_desc =
| Pcl_constr of longident_loc * core_type list
| Pcl_structure of class_structure
| Pcl_fun of arg_label * expression option * pattern * class_expr
| Pcl_apply of class_expr * (arg_label * expression) list
| Pcl_let of rec_flag * value_binding list * class_expr
| Pcl_constraint of class_expr * class_type
| Pcl_extension of extension
| Pcl_open of open_description * class_expr
and class_structure = Astlib.Ast_414.Parsetree.class_structure = {
pcstr_self : pattern;
pcstr_fields : class_field list;
}
and class_field = Astlib.Ast_414.Parsetree.class_field = {
pcf_desc : class_field_desc;
pcf_loc : location;
pcf_attributes : attributes;
}
and class_field_desc = Astlib.Ast_414.Parsetree.class_field_desc =
| Pcf_inherit of override_flag * class_expr * string loc option
| Pcf_val of label loc * mutable_flag * class_field_kind
| Pcf_method of label loc * private_flag * class_field_kind
| Pcf_constraint of core_type * core_type
| Pcf_initializer of expression
| Pcf_attribute of attribute
| Pcf_extension of extension
and class_field_kind = Astlib.Ast_414.Parsetree.class_field_kind =
| Cfk_virtual of core_type
| Cfk_concrete of override_flag * expression
Module language
and module_type = Astlib.Ast_414.Parsetree.module_type = {
pmty_desc : module_type_desc;
pmty_loc : location;
pmty_attributes : attributes;
}
and module_type_desc = Astlib.Ast_414.Parsetree.module_type_desc =
| Pmty_ident of longident_loc
| Pmty_signature of signature
| Pmty_functor of functor_parameter * module_type
| Pmty_with of module_type * with_constraint list
| Pmty_typeof of module_expr
| Pmty_extension of extension
| Pmty_alias of longident_loc
and functor_parameter = Astlib.Ast_414.Parsetree.functor_parameter =
| Unit
| Named of string option loc * module_type
and signature_item = Astlib.Ast_414.Parsetree.signature_item = {
psig_desc : signature_item_desc;
psig_loc : location;
}
and signature_item_desc = Astlib.Ast_414.Parsetree.signature_item_desc =
| Psig_value of value_description
| Psig_type of rec_flag * type_declaration list
| Psig_typesubst of type_declaration list
| Psig_typext of type_extension
| Psig_exception of type_exception
| Psig_module of module_declaration
| Psig_modsubst of module_substitution
| Psig_recmodule of module_declaration list
| Psig_modtype of module_type_declaration
| Psig_modtypesubst of module_type_declaration
| Psig_open of open_description
| Psig_include of include_description
| Psig_class of class_description list
| Psig_class_type of class_type_declaration list
| Psig_attribute of attribute
| Psig_extension of extension * attributes
and module_declaration = Astlib.Ast_414.Parsetree.module_declaration = {
pmd_name : string option loc;
pmd_type : module_type;
pmd_attributes : attributes;
pmd_loc : location;
}
and module_substitution = Astlib.Ast_414.Parsetree.module_substitution = {
pms_name : string loc;
pms_manifest : longident_loc;
pms_attributes : attributes;
pms_loc : location;
}
and module_type_declaration = Astlib.Ast_414.Parsetree.module_type_declaration =
{
pmtd_name : string loc;
pmtd_type : module_type option;
pmtd_attributes : attributes;
pmtd_loc : location;
}
and 'a open_infos = 'a Astlib.Ast_414.Parsetree.open_infos = {
popen_expr : 'a;
popen_override : override_flag;
popen_loc : location;
popen_attributes : attributes;
}
and 'a include_infos = 'a Astlib.Ast_414.Parsetree.include_infos = {
pincl_mod : 'a;
pincl_loc : location;
pincl_attributes : attributes;
}
and with_constraint = Astlib.Ast_414.Parsetree.with_constraint =
| Pwith_type of longident_loc * type_declaration
| Pwith_module of longident_loc * longident_loc
| Pwith_modtype of longident_loc * module_type
| Pwith_modtypesubst of longident_loc * module_type
| Pwith_typesubst of longident_loc * type_declaration
| Pwith_modsubst of longident_loc * longident_loc
and module_expr = Astlib.Ast_414.Parsetree.module_expr = {
pmod_desc : module_expr_desc;
pmod_loc : location;
pmod_attributes : attributes;
}
and module_expr_desc = Astlib.Ast_414.Parsetree.module_expr_desc =
| Pmod_ident of longident_loc
| Pmod_structure of structure
| Pmod_functor of functor_parameter * module_expr
| Pmod_apply of module_expr * module_expr
| Pmod_constraint of module_expr * module_type
| Pmod_unpack of expression
| Pmod_extension of extension
and structure_item = Astlib.Ast_414.Parsetree.structure_item = {
pstr_desc : structure_item_desc;
pstr_loc : location;
}
and structure_item_desc = Astlib.Ast_414.Parsetree.structure_item_desc =
| Pstr_eval of expression * attributes
| Pstr_value of rec_flag * value_binding list
| Pstr_primitive of value_description
| Pstr_type of rec_flag * type_declaration list
| Pstr_typext of type_extension
| Pstr_exception of type_exception
| Pstr_module of module_binding
| Pstr_recmodule of module_binding list
| Pstr_modtype of module_type_declaration
| Pstr_open of open_declaration
| Pstr_class of class_declaration list
| Pstr_class_type of class_type_declaration list
| Pstr_include of include_declaration
| Pstr_attribute of attribute
| Pstr_extension of extension * attributes
and value_binding = Astlib.Ast_414.Parsetree.value_binding = {
pvb_pat : pattern;
pvb_expr : expression;
pvb_attributes : attributes;
pvb_loc : location;
}
and module_binding = Astlib.Ast_414.Parsetree.module_binding = {
pmb_name : string option loc;
pmb_expr : module_expr;
pmb_attributes : attributes;
pmb_loc : location;
}
Toplevel
and toplevel_phrase = Astlib.Ast_414.Parsetree.toplevel_phrase =
| Ptop_def of structure
| Ptop_dir of toplevel_directive
and toplevel_directive = Astlib.Ast_414.Parsetree.toplevel_directive = {
pdir_name : string loc;
pdir_arg : directive_argument option;
pdir_loc : location;
}
and directive_argument = Astlib.Ast_414.Parsetree.directive_argument = {
pdira_desc : directive_argument_desc;
pdira_loc : location;
}
and directive_argument_desc = Astlib.Ast_414.Parsetree.directive_argument_desc =
| Pdir_string of string
| Pdir_int of string * char option
| Pdir_ident of longident
| Pdir_bool of bool
Helpers for build OCaml AST fragments
First class AST patterns
AST traversal classes
Context free rewriting
Some helpers to annotate the AST so merlin can decide which branches to look at and which branches to ignore.
val core_type_of_type_declaration :
Astlib.Ast_414.Parsetree.type_declaration ->
Astlib.Ast_414.Parsetree.core_type
val name_type_params_in_td :
Astlib.Ast_414.Parsetree.type_declaration ->
Astlib.Ast_414.Parsetree.type_declaration
val combinator_type_of_type_declaration :
Astlib.Ast_414.Parsetree.type_declaration ->
f:
(loc:Location.t ->
Astlib.Ast_414.Parsetree.core_type ->
Astlib.Ast_414.Parsetree.core_type) ->
Astlib.Ast_414.Parsetree.core_type
gen_symbol ?prefix ()
generates a fresh variable name with prefix
.
val get_type_param_name :
(Astlib.Ast_414.Parsetree.core_type
* (Astlib.Ast_414.Asttypes.variance * Astlib.Ast_414.Asttypes.injectivity)) ->
string Loc.t
get_tparam_id tp
returns the string identifier associated with tp
if it is a type parameter.
class type_is_recursive : Astlib.Ast_414.Asttypes.rec_flag -> Astlib.Ast_414.Parsetree.type_declaration
list -> object ... end
(new type_is_recursive rec_flag tds)#go ()
returns whether rec_flag, tds
is really a recursive type. We disregard recursive occurrences appearing in arrow types. You can override the search for certain type expressions by inheriting from this class.
val really_recursive :
Astlib.Ast_414.Asttypes.rec_flag ->
Astlib.Ast_414.Parsetree.type_declaration list ->
Astlib.Ast_414.Asttypes.rec_flag
really_recursive rec_flag tds = (new type_is_recursive rec_flag tds)#go ()
val loc_of_extension :
(string Astlib.Location.loc * Astlib.Ast_414.Parsetree.payload) ->
Location.t
val curry_applications :
Astlib.Ast_414.Parsetree.expression ->
Astlib.Ast_414.Parsetree.expression
convert multi-arg function applications into a cascade of 1-arg applications
Encode a warning message into an 'ocaml.ppwarning' attribute which can be inserted in a generated Parsetree. The compiler will be responsible for reporting the warning.
val is_polymorphic_variant :
Astlib.Ast_414.Parsetree.type_declaration ->
sig_:bool ->
[> `Definitely | `Maybe | `Surely_not ]
val mk_named_sig :
loc:Location.t ->
sg_name:string ->
handle_polymorphic_variant:bool ->
Astlib.Ast_414.Parsetree.type_declaration list ->
Astlib.Ast_414.Parsetree.module_type Astlib.Ast_414.Parsetree.include_infos
option
mk_named_sig ~loc ~sg_name:"Foo" ~handle_polymorphic_variant tds
will generate
include Foo (* or Foo1, Foo2, Foo3 *)
with type (* ('a, 'b, 'c) *) t := (* ('a, 'b, 'c) *) t
when:
- there is only one type declaration
- the type is named t
- there are less than 4 type parameters
- there are no constraints on the type parameters
It will take care of giving fresh names to unnamed type parameters.