PpxlibStandard library for ppx rewriters
ppxlib is meant to be opened globally in your PPX source files.
Opening it comes with two advantages. First, it will shadow the compiler-libs modules. The compiler-libs modules are unstable and aren't meant to be used, so shadowing them is a good protection mechanism. In case you don't want to open Ppxlib, you can open Ocaml_shadow to get the same protection. Second, it will bring several modules in scope, that are useful to have when writing a rewriter:
ppxlib modules, such as modules to help manipulate the AST (Ast_builder, Ast_pattern), and a few functions.Ast_helper or Pprintast,including the Ast module).ppxlib entriesmodule Ast_builder : sig ... endAst_builder is a module to generate OCaml AST fragments. It provides a shorter syntax than directly using the Parsetree constructors, as well as a better stability than the constructors.
module Ast_pattern : sig ... endThis module implements first class AST patterns. It allows to destruct and extract values from AST fragments. This gives the same functionality as a pattern-match, but with simpler syntax and more stability than directly pattern-matching on the Parsetree constructors.
module Ast_traverse : sig ... endThis module provides AST traversal classes, such as maps, iterations, folds, etc. on the Parsetree types.
module Context_free : sig ... endContext free rewriting, to define local rewriting rules that will all be applied at once by the driver.
module Deriving : sig ... endDeriving code from type declarations.
module Extension : sig ... endDeclare extenders to rewrite extension nodes.
module Expansion_context : sig ... endThe context given to rewriting rules when expanding.
module Code_path : sig ... endThis module contains type and functions for representing and manipulating path to AST nodes.
module Expansion_helpers : sig ... endVarious helpers for expansion, such as quoting expressions in their context, or mangling names.
module Merlin_helpers : sig ... endSome helpers to annotate the AST so merlin can decide which branches to look at and which branches to ignore.
module Spellcheck : sig ... endHelpers to provide hints to PPX users for typos or spellchecks.
module Keyword : sig ... endSmall module to check if a string is an OCaml keyword.
module Pp_ast : sig ... endThis module implements pretty printers for the OCaml AST's version used by ppxlib.
module Driver : sig ... endInteraction with the driver, such as getting/seeting cookies, adding arguments.
module Caller_id : sig ... endSmall helper to find out who is the caller of a function
module Ast_io : sig ... endA small module to help read bin-annots generated files.
module Attribute : sig ... endThis module provides hygiene for attributes. The goal is to report misuses of attributes to the user as soon as possible so that no mistyped attribute get silently ignored.
module Reserved_namespaces : sig ... endSmall module to reserve namespaces in attribute names.
val lident : string -> Longident.tval core_type_of_type_declaration :
Astlib.Ast_500.Parsetree.type_declaration ->
Astlib.Ast_500.Parsetree.core_typeval name_type_params_in_td_res :
Astlib.Ast_500.Parsetree.type_declaration ->
(Astlib.Ast_500.Parsetree.type_declaration,
Location.Error.t Stdppx.NonEmptyList.t)
resultval name_type_params_in_td :
Astlib.Ast_500.Parsetree.type_declaration ->
Astlib.Ast_500.Parsetree.type_declarationval combinator_type_of_type_declaration :
Astlib.Ast_500.Parsetree.type_declaration ->
f:
(loc:Location.t ->
Astlib.Ast_500.Parsetree.core_type ->
Astlib.Ast_500.Parsetree.core_type) ->
Astlib.Ast_500.Parsetree.core_typegen_symbol ?prefix () generates a fresh variable name with prefix.
val string_of_core_type : Astlib.Ast_500.Parsetree.core_type -> stringval assert_no_attributes : Astlib.Ast_500.Parsetree.attribute list -> unitval attributes_errors :
Astlib.Ast_500.Parsetree.attribute list ->
Location.Error.t listval collect_attributes_errors :
Location.Error.t list Ppxlib__.Ast_traverse0.foldval get_type_param_name_res :
(Astlib.Ast_500.Parsetree.core_type
* (Astlib.Ast_500.Asttypes.variance * Astlib.Ast_500.Asttypes.injectivity)) ->
(string Loc.t, Location.Error.t Stdppx.NonEmptyList.t) resultget_type_param_name_res tp returns the string identifier associated with tp if it is a type parameter, as a result.
val get_type_param_name :
(Astlib.Ast_500.Parsetree.core_type
* (Astlib.Ast_500.Asttypes.variance * Astlib.Ast_500.Asttypes.injectivity)) ->
string Loc.tSee get_type_param_name_res. Raises a located error in case of failure.
class type_is_recursive : Astlib.Ast_500.Asttypes.rec_flag -> Astlib.Ast_500.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_500.Asttypes.rec_flag ->
Astlib.Ast_500.Parsetree.type_declaration list ->
Astlib.Ast_500.Asttypes.rec_flagreally_recursive rec_flag tds = (new type_is_recursive rec_flag tds)#go ()
val loc_of_payload : Astlib.Ast_500.Parsetree.attribute -> Location.tval loc_of_attribute : Astlib.Ast_500.Parsetree.attribute -> Location.tval loc_of_extension :
(string Astlib.Location.loc * Astlib.Ast_500.Parsetree.payload) ->
Location.tval curry_applications :
Astlib.Ast_500.Parsetree.expression ->
Astlib.Ast_500.Parsetree.expressionconvert multi-arg function applications into a cascade of 1-arg applications
val attribute_of_warning :
Location.t ->
string ->
Astlib.Ast_500.Parsetree.attributeEncode 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_500.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_500.Parsetree.type_declaration list ->
Astlib.Ast_500.Parsetree.module_type Astlib.Ast_500.Parsetree.include_infos
optionmk_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) *) twhen:
It will take care of giving fresh names to unnamed type parameters.
val exn_to_loc_error : exn -> Location.Error.tConvert exn to a located error if possible or reraise it otherwise
module With_errors : sig ... endExpose some modules from Ppxlib_ast.
module Ast = Ppxlib_ast.Astmodule Ast_helper = Ppxlib_ast.Ast_helpermodule Asttypes = Ppxlib_ast.Asttypesmodule Parse = Ppxlib_ast.Parsemodule Parsetree = Ppxlib_ast.Parsetreemodule Pprintast = Ppxlib_ast.Pprintastmodule Selected_ast = Ppxlib_ast.Selected_astmodule Location : sig ... endOverrides the Location module of OCaml
module Longident : sig ... endOverrides the Longident module of OCaml
module Loc : sig ... endLocated items
Include all the Ast definitions since we need them in every single ppx
include module type of struct include Ast endand location_stack = location listand longident = Astlib.Longident.t = Auxiliary AST types used by parsetree and typedtree.
and arg_label = Astlib.Ast_500.Asttypes.arg_label = Abstract syntax tree produced by parsing
and constant = Astlib.Ast_500.Parsetree.constant = | Pconst_integer of string * char optionInteger constants such as 3 3l 3L 3n.
Suffixes [g-z][G-Z] are accepted by the parser. Suffixes except 'l', 'L' and 'n' are rejected by the typechecker
| Pconst_char of charCharacter such as 'c'.
| Pconst_string of string * location * string optionConstant string such as "constant" or {delim|other constant|delim}.
The location span the content of the string, without the delimiters.
*)| Pconst_float of string * char optionFloat constant such as 3.4, 2e5 or 1.4e-4.
Suffixes g-zG-Z are accepted by the parser. Suffixes are rejected by the typechecker.
Attributes such as [@id ARG] and [@@id ARG].
Metadata containers passed around within the AST. The compiler ignores unknown attributes.
Extension points such as [%id ARG] and [%%id ARG].
Sub-language placeholder -- rejected by the typechecker.
and attributes = attribute listand payload = Astlib.Ast_500.Parsetree.payload = | PStr of structure| PSig of signature: SIG in an attribute or an extension point
| PTyp of core_type: T in an attribute or an extension point
| PPat of pattern * expression option? P or ? P when E, in an attribute or an extension point
and core_type = Astlib.Ast_500.Parsetree.core_type = {ptyp_desc : core_type_desc;ptyp_loc : location;ptyp_loc_stack : location_stack;ptyp_attributes : attributes;... [@id1] [@id2]
}and core_type_desc = Astlib.Ast_500.Parsetree.core_type_desc = | Ptyp_any_
| Ptyp_var of stringA type variable such as 'a
| Ptyp_arrow of arg_label * core_type * core_type| Ptyp_tuple of core_type listPtyp_tuple([T1 ; ... ; Tn]) represents a product type T1 * ... * Tn.
Invariant: n >= 2.
| Ptyp_constr of longident_loc * core_type listPtyp_constr(lident, l) represents:
tconstr when l=[],T tconstr when l=[T],(T1, ..., Tn) tconstr when l=[T1 ; ... ; Tn].| Ptyp_object of object_field list * closed_flag| Ptyp_class of longident_loc * core_type listPtyp_class(tconstr, l) represents:
#tconstr when l=[],T #tconstr when l=[T],(T1, ..., Tn) #tconstr when l=[T1 ; ... ; Tn].| Ptyp_alias of core_type * stringT as 'a.
| Ptyp_variant of row_field list * closed_flag * label list option| Ptyp_poly of string loc list * core_type'a1 ... 'an. T
Can only appear in the following context:
core_type of a Ppat_constraint node corresponding to a constraint on a let-binding: let x : 'a1 ... 'an. T = e ...Cfk_virtual for methods (not values).core_type of a Pctf_method node.pld_type field of a label_declaration.core_type of a Ptyp_object node.pval_type field of a value_description.| Ptyp_package of package_type(module S).
| Ptyp_extension of extension[%id].
and package_type = longident_loc * (longident_loc * core_type) listAs package_type typed values:
(S, []) represents (module S),(S, [(t1, T1) ; ... ; (tn, Tn)]) represents (module S with type t1 = T1 and ... and tn = Tn).and row_field = Astlib.Ast_500.Parsetree.row_field = {prf_desc : row_field_desc;prf_loc : location;prf_attributes : attributes;}and row_field_desc = Astlib.Ast_500.Parsetree.row_field_desc = | Rtag of label loc * bool * core_type listRtag(`A, b, l) represents:
`A when b is true and l is [],`A of T when b is false and l is [T],`A of T1 & .. & Tn when b is false and l is [T1;...Tn],`A of & T1 & .. & Tn when b is true and l is [T1;...Tn].bool field is true if the tag contains a constant (empty) constructor.& occurs when several types are used for the same constructor (see 4.2 in the manual)| Rinherit of core_type[ | t ]
and object_field = Astlib.Ast_500.Parsetree.object_field = {pof_desc : object_field_desc;pof_loc : location;pof_attributes : attributes;}and object_field_desc = Astlib.Ast_500.Parsetree.object_field_desc = and pattern = Astlib.Ast_500.Parsetree.pattern = {ppat_desc : pattern_desc;ppat_loc : location;ppat_loc_stack : location_stack;ppat_attributes : attributes;... [@id1] [@id2]
}and pattern_desc = Astlib.Ast_500.Parsetree.pattern_desc = | Ppat_anyThe pattern _.
| Ppat_var of string locA variable pattern such as x
| Ppat_alias of pattern * string locAn alias pattern such as P as 'a
| Ppat_constant of constantPatterns such as 1, 'a', "true", 1.0, 1l, 1L, 1n
| Ppat_interval of constant * constantPatterns such as 'a'..'z'.
Other forms of interval are recognized by the parser but rejected by the type-checker.
*)| Ppat_tuple of pattern listPatterns (P1, ..., Pn).
Invariant: n >= 2
| Ppat_construct of longident_loc * (string loc list * pattern) optionPpat_construct(C, args) represents:
C when args is None,C P when args is Some ([], P)C (P1, ..., Pn) when args is Some ([], Ppat_tuple [P1; ...; Pn])C (type a b) P when args is Some ([a; b], P)| Ppat_variant of label * pattern optionPpat_variant(`A, pat) represents:
`A when pat is None,`A P when pat is Some P| Ppat_record of (longident_loc * pattern) list * closed_flag| Ppat_array of pattern listPattern [| P1; ...; Pn |]
| Ppat_or of pattern * patternPattern P1 | P2
| Ppat_constraint of pattern * core_typePattern (P : T)
| Ppat_type of longident_locPattern #tconst
| Ppat_lazy of patternPattern lazy P
| Ppat_unpack of string option locPpat_unpack(s) represents:
(module P) when s is Some "P"(module _) when s is NoneNote: (module P : S) is represented as Ppat_constraint(Ppat_unpack(Some "P"), Ptyp_package S)
| Ppat_exception of patternPattern exception P
| Ppat_extension of extensionPattern [%id]
| Ppat_open of longident_loc * patternPattern M.(P)
and expression = Astlib.Ast_500.Parsetree.expression = {pexp_desc : expression_desc;pexp_loc : location;pexp_loc_stack : location_stack;pexp_attributes : attributes;... [@id1] [@id2]
}and expression_desc = Astlib.Ast_500.Parsetree.expression_desc = | Pexp_ident of longident_locIdentifiers such as x and M.x
| Pexp_constant of constantExpressions constant such as 1, 'a', "true", 1.0, 1l, 1L, 1n
| Pexp_let of rec_flag * value_binding list * expressionPexp_let(flag, [(P1,E1) ; ... ; (Pn,En)], E) represents:
let P1 = E1 and ... and Pn = EN in E when flag is Nonrecursive,let rec P1 = E1 and ... and Pn = EN in E when flag is Recursive.| Pexp_function of casesfunction P1 -> E1 | ... | Pn -> En
| Pexp_fun of arg_label * expression option * pattern * expressionPexp_fun(lbl, exp0, P, E1) represents:
fun P -> E1 when lbl is Nolabel and exp0 is Nonefun ~l:P -> E1 when lbl is Labelled l and exp0 is Nonefun ?l:P -> E1 when lbl is Optional l and exp0 is Nonefun ?l:(P = E0) -> E1 when lbl is Optional l and exp0 is Some E0Notes:
E0 is provided, only Optional is allowed.fun P1 P2 .. Pn -> E1 is represented as nested Pexp_fun.let f P = E is represented using Pexp_fun.| Pexp_apply of expression * (arg_label * expression) list| Pexp_match of expression * casesmatch E0 with P1 -> E1 | ... | Pn -> En
| Pexp_try of expression * casestry E0 with P1 -> E1 | ... | Pn -> En
| Pexp_tuple of expression listExpressions (E1, ..., En)
Invariant: n >= 2
| Pexp_construct of longident_loc * expression optionPexp_construct(C, exp) represents:
C when exp is None,C E when exp is Some E,C (E1, ..., En) when exp is Some (Pexp_tuple[E1;...;En])| Pexp_variant of label * expression optionPexp_variant(`A, exp) represents
`A when exp is None`A E when exp is Some E| Pexp_record of (longident_loc * expression) list * expression optionPexp_record([(l1,P1) ; ... ; (ln,Pn)], exp0) represents
{ l1=P1; ...; ln=Pn } when exp0 is None{ E0 with l1=P1; ...; ln=Pn } when exp0 is Some E0Invariant: n > 0
| Pexp_field of expression * longident_locE.l
| Pexp_setfield of expression * longident_loc * expressionE1.l <- E2
| Pexp_array of expression list[| E1; ...; En |]
| Pexp_ifthenelse of expression * expression * expression optionif E1 then E2 else E3
| Pexp_sequence of expression * expressionE1; E2
| Pexp_while of expression * expressionwhile E1 do E2 done
| Pexp_for of pattern * expression * expression * direction_flag * expression| Pexp_constraint of expression * core_type(E : T)
| Pexp_coerce of expression * core_type option * core_typePexp_coerce(E, from, T) represents
(E :> T) when from is None,(E : T0 :> T) when from is Some T0.| Pexp_send of expression * label locE # m
| Pexp_new of longident_locnew M.c
| Pexp_setinstvar of label loc * expressionx <- 2
| Pexp_override of (label loc * expression) list{< x1 = E1; ...; xn = En >}
| Pexp_letmodule of string option loc * module_expr * expressionlet module M = ME in E
| Pexp_letexception of extension_constructor * expressionlet exception C in E
| Pexp_assert of expressionassert E.
Note: assert false is treated in a special way by the type-checker.
| Pexp_lazy of expressionlazy E
| Pexp_poly of expression * core_type optionUsed for method bodies.
Can only be used as the expression under Cfk_concrete for methods (not values).
| Pexp_object of class_structureobject ... end
| Pexp_newtype of string loc * expressionfun (type t) -> E
| Pexp_pack of module_expr(module ME).
(module ME : S) is represented as Pexp_constraint(Pexp_pack ME, Ptyp_package S)
| Pexp_open of open_declaration * expressionM.(E)let open M in Elet open! M in E| Pexp_letop of letoplet* P = E0 in E1let* P0 = E00 and* P1 = E01 in E1| Pexp_extension of extension[%id]
| Pexp_unreachable.
and case = Astlib.Ast_500.Parsetree.case = {pc_lhs : pattern;pc_guard : expression option;pc_rhs : expression;}Values of type case represents (P -> E) or (P when E0 -> E)
and letop = Astlib.Ast_500.Parsetree.letop = {let_ : binding_op;ands : binding_op list;body : expression;}and binding_op = Astlib.Ast_500.Parsetree.binding_op = {pbop_op : string loc;pbop_pat : pattern;pbop_exp : expression;pbop_loc : location;}and value_description = Astlib.Ast_500.Parsetree.value_description = {pval_name : string loc;pval_type : core_type;pval_prim : string list;pval_attributes : attributes;... [@@id1] [@@id2]
pval_loc : location;}Values of type value_description represents:
and type_declaration = Astlib.Ast_500.Parsetree.type_declaration = {ptype_name : string loc;ptype_params : (core_type * (variance * injectivity)) list;('a1,...'an) t
ptype_cstrs : (core_type * core_type * location) list;... constraint T1=T1' ... constraint Tn=Tn'
ptype_kind : type_kind;ptype_private : private_flag;for = private ...
ptype_manifest : core_type option;represents = T
ptype_attributes : attributes;... [@@id1] [@@id2]
ptype_loc : location;}Here are type declarations and their representation, for various ptype_kind and ptype_manifest values:
type t when type_kind is Ptype_abstract, and manifest is None,type t = T0 when type_kind is Ptype_abstract, and manifest is Some T0,type t = C of T | ... when type_kind is Ptype_variant, and manifest is None,type t = T0 = C of T | ... when type_kind is Ptype_variant, and manifest is Some T0,type t = {l: T; ...} when type_kind is Ptype_record, and manifest is None,type t = T0 = {l : T; ...} when type_kind is Ptype_record, and manifest is Some T0,type t = .. when type_kind is Ptype_open, and manifest is None.and type_kind = Astlib.Ast_500.Parsetree.type_kind = | Ptype_abstract| Ptype_variant of constructor_declaration list| Ptype_record of label_declaration listInvariant: non-empty list
*)| Ptype_openand label_declaration = Astlib.Ast_500.Parsetree.label_declaration = {pld_name : string loc;pld_mutable : mutable_flag;pld_type : core_type;pld_loc : location;pld_attributes : attributes;l : T [@id1] [@id2]
}{ ...; l: T; ... } when pld_mutable is Immutable,{ ...; mutable l: T; ... } when pld_mutable is Mutable.Note: T can be a Ptyp_poly.
and constructor_declaration = Astlib.Ast_500.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;C of ... [@id1] [@id2]
}and constructor_arguments = Astlib.Ast_500.Parsetree.constructor_arguments = | Pcstr_tuple of core_type list| Pcstr_record of label_declaration listValues of type constructor_declaration represents the constructor arguments of:
C of T1 * ... * Tn when res = None, and args = Pcstr_tuple [T1; ... ; Tn],C: T0 when res = Some T0, and args = Pcstr_tuple [],C: T1 * ... * Tn -> T0 when res = Some T0, and args = Pcstr_tuple [T1; ... ; Tn],C of {...} when res = None, and args = Pcstr_record [...],C: {...} -> T0 when res = Some T0, and args = Pcstr_record [...].and type_extension = Astlib.Ast_500.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;... @@id1 @@id2
}Definition of new extensions constructors for the extensive sum type t (type t += ...).
and extension_constructor = Astlib.Ast_500.Parsetree.extension_constructor = {pext_name : string loc;pext_kind : extension_constructor_kind;pext_loc : location;pext_attributes : attributes;C of ... [@id1] [@id2]
}and type_exception = Astlib.Ast_500.Parsetree.type_exception = {ptyexn_constructor : extension_constructor;ptyexn_loc : location;ptyexn_attributes : attributes;... [@@id1] [@@id2]
}Definition of a new exception (exception E).
and extension_constructor_kind =
Astlib.Ast_500.Parsetree.extension_constructor_kind =
| Pext_decl of string loc list * constructor_arguments * core_type optionPext_decl(existentials, c_args, t_opt) describes a new extension constructor. It can be:
C of T1 * ... * Tn when:
existentials is [],c_args is [T1; ...; Tn],t_opt is None.C: T0 when
existentials is [],c_args is [],t_opt is Some T0.C: T1 * ... * Tn -> T0 when
existentials is [],c_args is [T1; ...; Tn],t_opt is Some T0.C: 'a... . T1 * ... * Tn -> T0 when
existentials is ['a;...],c_args is [T1; ... ; Tn],t_opt is Some T0.| Pext_rebind of longident_locPext_rebind(D) re-export the constructor D with the new name C
and class_type = Astlib.Ast_500.Parsetree.class_type = {pcty_desc : class_type_desc;pcty_loc : location;pcty_attributes : attributes;... [@id1] [@id2]
}and class_type_desc = Astlib.Ast_500.Parsetree.class_type_desc = | Pcty_constr of longident_loc * core_type listc['a1, ..., 'an] c| Pcty_signature of class_signatureobject ... end
| Pcty_arrow of arg_label * core_type * class_typePcty_arrow(lbl, T, CT) represents:
T -> CT when lbl is Nolabel,~l:T -> CT when lbl is Labelled l,?l:T -> CT when lbl is Optional l.| Pcty_extension of extension%id
| Pcty_open of open_description * class_typelet open M in CT
and class_signature = Astlib.Ast_500.Parsetree.class_signature = {pcsig_self : core_type;pcsig_fields : class_type_field list;}Values of type class_signature represents:
object('selfpat) ... endobject ... end when pcsig_self is Ptyp_anyand class_type_field = Astlib.Ast_500.Parsetree.class_type_field = {pctf_desc : class_type_field_desc;pctf_loc : location;pctf_attributes : attributes;... [@@id1] [@@id2]
}and class_type_field_desc = Astlib.Ast_500.Parsetree.class_type_field_desc = | Pctf_inherit of class_typeinherit CT
| Pctf_val of label loc * mutable_flag * virtual_flag * core_typeval x: T
| Pctf_method of label loc * private_flag * virtual_flag * core_type| Pctf_constraint of core_type * core_typeconstraint T1 = T2
| Pctf_attribute of attribute[@@@id]
| Pctf_extension of extension[%%id]
and 'a class_infos = 'a Astlib.Ast_500.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;... [@@id1] [@@id2]
}Values of type class_expr class_infos represents:
class c = ...class ['a1,...,'an] c = ...class virtual c = ...They are also used for "class type" declaration.
and class_description = class_type class_infosand class_type_declaration = class_type class_infosand class_expr = Astlib.Ast_500.Parsetree.class_expr = {pcl_desc : class_expr_desc;pcl_loc : location;pcl_attributes : attributes;... [@id1] [@id2]
}and class_expr_desc = Astlib.Ast_500.Parsetree.class_expr_desc = | Pcl_constr of longident_loc * core_type listc and ['a1, ..., 'an] c
| Pcl_structure of class_structureobject ... end
| Pcl_fun of arg_label * expression option * pattern * class_exprPcl_fun(lbl, exp0, P, CE) represents:
fun P -> CE when lbl is Nolabel and exp0 is None,fun ~l:P -> CE when lbl is Labelled l and exp0 is None,fun ?l:P -> CE when lbl is Optional l and exp0 is None,fun ?l:(P = E0) -> CE when lbl is Optional l and exp0 is Some E0.| Pcl_apply of class_expr * (arg_label * expression) listPcl_apply(CE, [(l1,E1) ; ... ; (ln,En)]) represents CE ~l1:E1 ... ~ln:En. li can be empty (non labeled argument) or start with ? (optional argument).
Invariant: n > 0
| Pcl_let of rec_flag * value_binding list * class_exprPcl_let(rec, [(P1, E1); ... ; (Pn, En)], CE) represents:
let P1 = E1 and ... and Pn = EN in CE when rec is Nonrecursive,let rec P1 = E1 and ... and Pn = EN in CE when rec is Recursive.| Pcl_constraint of class_expr * class_type(CE : CT)
| Pcl_extension of extension[%id]
| Pcl_open of open_description * class_exprlet open M in CE
and class_structure = Astlib.Ast_500.Parsetree.class_structure = {pcstr_self : pattern;pcstr_fields : class_field list;}Values of type class_structure represents:
object(selfpat) ... endobject ... end when pcstr_self is Ppat_anyand class_field = Astlib.Ast_500.Parsetree.class_field = {pcf_desc : class_field_desc;pcf_loc : location;pcf_attributes : attributes;... [@@id1] [@@id2]
}and class_field_desc = Astlib.Ast_500.Parsetree.class_field_desc = | Pcf_inherit of override_flag * class_expr * string loc option| Pcf_val of label loc * mutable_flag * class_field_kindPcf_val(x,flag, kind) represents:
val x = E when flag is Immutable and kind is Cfk_concrete(Fresh, E)val virtual x: T when flag is Immutable and kind is Cfk_virtual(T)val mutable x = E when flag is Mutable and kind is Cfk_concrete(Fresh, E)val mutable virtual x: T when flag is Mutable and kind is Cfk_virtual(T)| Pcf_method of label loc * private_flag * class_field_kind| Pcf_constraint of core_type * core_typeconstraint T1 = T2
| Pcf_initializer of expressioninitializer E
| Pcf_attribute of attribute[@@@id]
| Pcf_extension of extension[%%id]
and class_field_kind = Astlib.Ast_500.Parsetree.class_field_kind = | Cfk_virtual of core_type| Cfk_concrete of override_flag * expressionand class_declaration = class_expr class_infosand module_type = Astlib.Ast_500.Parsetree.module_type = {pmty_desc : module_type_desc;pmty_loc : location;pmty_attributes : attributes;... [@id1] [@id2]
}and module_type_desc = Astlib.Ast_500.Parsetree.module_type_desc = | Pmty_ident of longident_locPmty_ident(S) represents S
| Pmty_signature of signaturesig ... end
| Pmty_functor of functor_parameter * module_typefunctor(X : MT1) -> MT2
| Pmty_with of module_type * with_constraint listMT with ...
| Pmty_typeof of module_exprmodule type of ME
| Pmty_extension of extension[%id]
| Pmty_alias of longident_loc(module M)
and functor_parameter = Astlib.Ast_500.Parsetree.functor_parameter = | Unit()
| Named of string option loc * module_typeNamed(name, MT) represents:
(X : MT) when name is Some X,(_ : MT) when name is Noneand signature = signature_item listand signature_item = Astlib.Ast_500.Parsetree.signature_item = {psig_desc : signature_item_desc;psig_loc : location;}and signature_item_desc = Astlib.Ast_500.Parsetree.signature_item_desc = | Psig_value of value_descriptionval x: Texternal x: T = "s1" ... "sn"| Psig_type of rec_flag * type_declaration listtype t1 = ... and ... and tn = ...
| Psig_typesubst of type_declaration listtype t1 := ... and ... and tn := ...
| Psig_typext of type_extensiontype t1 += ...
| Psig_exception of type_exceptionexception C of T
| Psig_module of module_declarationmodule X = M and module X : MT
| Psig_modsubst of module_substitutionmodule X := M
| Psig_recmodule of module_declaration listmodule rec X1 : MT1 and ... and Xn : MTn
| Psig_modtype of module_type_declarationmodule type S = MT and module type S
| Psig_modtypesubst of module_type_declarationmodule type S := ...
| Psig_open of open_descriptionopen X
| Psig_include of include_descriptioninclude MT
| Psig_class of class_description listclass c1 : ... and ... and cn : ...
| Psig_class_type of class_type_declaration listclass type ct1 = ... and ... and ctn = ...
| Psig_attribute of attribute[@@@id]
| Psig_extension of extension * attributes[%%id]
and module_declaration = Astlib.Ast_500.Parsetree.module_declaration = {pmd_name : string option loc;pmd_type : module_type;pmd_attributes : attributes;... [@@id1] [@@id2]
pmd_loc : location;}Values of type module_declaration represents S : MT
and module_substitution = Astlib.Ast_500.Parsetree.module_substitution = {pms_name : string loc;pms_manifest : longident_loc;pms_attributes : attributes;... [@@id1] [@@id2]
pms_loc : location;}Values of type module_substitution represents S := M
and module_type_declaration = Astlib.Ast_500.Parsetree.module_type_declaration =
{pmtd_name : string loc;pmtd_type : module_type option;pmtd_attributes : attributes;... [@@id1] [@@id2]
pmtd_loc : location;}Values of type module_type_declaration represents:
S = MT,S for abstract module type declaration, when pmtd_type is None.and 'a open_infos = 'a Astlib.Ast_500.Parsetree.open_infos = {popen_expr : 'a;popen_override : override_flag;popen_loc : location;popen_attributes : attributes;}Values of type 'a open_infos represents:
open! X when popen_override is Override (silences the "used identifier shadowing" warning)open X when popen_override is Freshand open_description = longident_loc open_infosValues of type open_description represents:
open M.Nopen M(N).Oand open_declaration = module_expr open_infosValues of type open_declaration represents:
open M.Nopen M(N).Oopen struct ... endand 'a include_infos = 'a Astlib.Ast_500.Parsetree.include_infos = {pincl_mod : 'a;pincl_loc : location;pincl_attributes : attributes;}and include_description = module_type include_infosValues of type include_description represents include MT
and include_declaration = module_expr include_infosValues of type include_declaration represents include ME
and with_constraint = Astlib.Ast_500.Parsetree.with_constraint = | Pwith_type of longident_loc * type_declarationwith type X.t = ...
Note: the last component of the longident must match the name of the type_declaration.
*)| Pwith_module of longident_loc * longident_locwith module X.Y = Z
| Pwith_modtype of longident_loc * module_typewith module type X.Y = Z
| Pwith_modtypesubst of longident_loc * module_typewith module type X.Y := sig end
| Pwith_typesubst of longident_loc * type_declarationwith type X.t := ..., same format as [Pwith_type]
| Pwith_modsubst of longident_loc * longident_locwith module X.Y := Z
and module_expr = Astlib.Ast_500.Parsetree.module_expr = {pmod_desc : module_expr_desc;pmod_loc : location;pmod_attributes : attributes;... [@id1] [@id2]
}and module_expr_desc = Astlib.Ast_500.Parsetree.module_expr_desc = | Pmod_ident of longident_locX
| Pmod_structure of structurestruct ... end
| Pmod_functor of functor_parameter * module_exprfunctor(X : MT1) -> ME
| Pmod_apply of module_expr * module_exprME1(ME2)
| Pmod_constraint of module_expr * module_type(ME : MT)
| Pmod_unpack of expression(val E)
| Pmod_extension of extension[%id]
and structure = structure_item listand structure_item = Astlib.Ast_500.Parsetree.structure_item = {pstr_desc : structure_item_desc;pstr_loc : location;}and structure_item_desc = Astlib.Ast_500.Parsetree.structure_item_desc = | Pstr_eval of expression * attributesE
| Pstr_value of rec_flag * value_binding listPstr_value(rec, [(P1, E1 ; ... ; (Pn, En))]) represents:
let P1 = E1 and ... and Pn = EN when rec is Nonrecursive,let rec P1 = E1 and ... and Pn = EN when rec is Recursive.| Pstr_primitive of value_descriptionval x: Texternal x: T = "s1" ... "sn" | Pstr_type of rec_flag * type_declaration listtype t1 = ... and ... and tn = ...
| Pstr_typext of type_extensiontype t1 += ...
| Pstr_exception of type_exceptionexception C of Texception C = M.X| Pstr_module of module_bindingmodule X = ME
| Pstr_recmodule of module_binding listmodule rec X1 = ME1 and ... and Xn = MEn
| Pstr_modtype of module_type_declarationmodule type S = MT
| Pstr_open of open_declarationopen X
| Pstr_class of class_declaration listclass c1 = ... and ... and cn = ...
| Pstr_class_type of class_type_declaration listclass type ct1 = ... and ... and ctn = ...
| Pstr_include of include_declarationinclude ME
| Pstr_attribute of attribute[@@@id]
| Pstr_extension of extension * attributes[%%id]
and value_binding = Astlib.Ast_500.Parsetree.value_binding = {pvb_pat : pattern;pvb_expr : expression;pvb_attributes : attributes;pvb_loc : location;}and module_binding = Astlib.Ast_500.Parsetree.module_binding = {pmb_name : string option loc;pmb_expr : module_expr;pmb_attributes : attributes;pmb_loc : location;}Values of type module_binding represents module X = ME
and toplevel_phrase = Astlib.Ast_500.Parsetree.toplevel_phrase = | Ptop_def of structure| Ptop_dir of toplevel_directive#use, #load ...
and toplevel_directive = Astlib.Ast_500.Parsetree.toplevel_directive = {pdir_name : string loc;pdir_arg : directive_argument option;pdir_loc : location;}and directive_argument = Astlib.Ast_500.Parsetree.directive_argument = {pdira_desc : directive_argument_desc;pdira_loc : location;}and directive_argument_desc = Astlib.Ast_500.Parsetree.directive_argument_desc =
| Pdir_string of string| Pdir_int of string * char option| Pdir_ident of longident| Pdir_bool of booland cases = case listclass virtual map : object ... endclass virtual iter : object ... endclass virtual 'acc fold : object ... endclass virtual 'acc fold_map : object ... endclass virtual 'ctx map_with_context : object ... endclass virtual 'res lift : object ... endclass virtual ['ctx, 'res] lift_map_with_context : object ... endMake sure code using Ppxlib doesn't refer to compiler-libs without being explicit about it:
include sig ... endinclude 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.Syntaxerrmodule Do_not_use_directly = Ocaml_shadow.Do_not_use_directlymodule Afl_instrument = Ocaml_shadow.Afl_instrumentmodule Alias_analysis = Ocaml_shadow.Alias_analysismodule Allocated_const = Ocaml_shadow.Allocated_constmodule Annot = Ocaml_shadow.Annotmodule Arch = Ocaml_shadow.Archmodule Arg_helper = Ocaml_shadow.Arg_helpermodule Asmgen = Ocaml_shadow.Asmgenmodule Asmlibrarian = Ocaml_shadow.Asmlibrarianmodule Asmlink = Ocaml_shadow.Asmlinkmodule Asmpackager = Ocaml_shadow.Asmpackagermodule Ast_invariants = Ocaml_shadow.Ast_invariantsmodule Ast_iterator = Ocaml_shadow.Ast_iteratormodule Ast_mapper = Ocaml_shadow.Ast_mappermodule Attr_helper = Ocaml_shadow.Attr_helpermodule Augment_specialised_args = Ocaml_shadow.Augment_specialised_argsmodule Backend_intf = Ocaml_shadow.Backend_intfmodule Backend_var = Ocaml_shadow.Backend_varmodule Binutils = Ocaml_shadow.Binutilsmodule Branch_relaxation = Ocaml_shadow.Branch_relaxationmodule Branch_relaxation_intf = Ocaml_shadow.Branch_relaxation_intfmodule Btype = Ocaml_shadow.Btypemodule Build_export_info = Ocaml_shadow.Build_export_infomodule Build_path_prefix_map = Ocaml_shadow.Build_path_prefix_mapmodule Builtin_attributes = Ocaml_shadow.Builtin_attributesmodule Bytegen = Ocaml_shadow.Bytegenmodule Bytelibrarian = Ocaml_shadow.Bytelibrarianmodule Bytelink = Ocaml_shadow.Bytelinkmodule Bytepackager = Ocaml_shadow.Bytepackagermodule Bytesections = Ocaml_shadow.Bytesectionsmodule CSE = Ocaml_shadow.CSEmodule CSEgen = Ocaml_shadow.CSEgenmodule CamlinternalMenhirLib = Ocaml_shadow.CamlinternalMenhirLibmodule Ccomp = Ocaml_shadow.Ccompmodule Clambda = Ocaml_shadow.Clambdamodule Clambda_primitives = Ocaml_shadow.Clambda_primitivesmodule Clflags = Ocaml_shadow.Clflagsmodule Closure = Ocaml_shadow.Closuremodule Closure_conversion = Ocaml_shadow.Closure_conversionmodule Closure_conversion_aux = Ocaml_shadow.Closure_conversion_auxmodule Closure_element = Ocaml_shadow.Closure_elementmodule Closure_id = Ocaml_shadow.Closure_idmodule Closure_middle_end = Ocaml_shadow.Closure_middle_endmodule Closure_offsets = Ocaml_shadow.Closure_offsetsmodule Closure_origin = Ocaml_shadow.Closure_originmodule Cmi_format = Ocaml_shadow.Cmi_formatmodule Cmm = Ocaml_shadow.Cmmmodule Cmm_helpers = Ocaml_shadow.Cmm_helpersmodule Cmm_invariants = Ocaml_shadow.Cmm_invariantsmodule Cmmgen = Ocaml_shadow.Cmmgenmodule Cmmgen_state = Ocaml_shadow.Cmmgen_statemodule Cmo_format = Ocaml_shadow.Cmo_formatmodule Cmt2annot = Ocaml_shadow.Cmt2annotmodule Cmt_format = Ocaml_shadow.Cmt_formatmodule Cmx_format = Ocaml_shadow.Cmx_formatmodule Cmxs_format = Ocaml_shadow.Cmxs_formatmodule Coloring = Ocaml_shadow.Coloringmodule Comballoc = Ocaml_shadow.Comballocmodule Compenv = Ocaml_shadow.Compenvmodule Compilation_unit = Ocaml_shadow.Compilation_unitmodule Compile = Ocaml_shadow.Compilemodule Compile_common = Ocaml_shadow.Compile_commonmodule Compilenv = Ocaml_shadow.Compilenvmodule Compmisc = Ocaml_shadow.Compmiscmodule Compression = Ocaml_shadow.Compressionmodule Config = Ocaml_shadow.Configmodule Config_boot = Ocaml_shadow.Config_bootmodule Config_main = Ocaml_shadow.Config_mainmodule Consistbl = Ocaml_shadow.Consistblmodule Convert_primitives = Ocaml_shadow.Convert_primitivesmodule Ctype = Ocaml_shadow.Ctypemodule Dataflow = Ocaml_shadow.Dataflowmodule Datarepr = Ocaml_shadow.Datareprmodule Deadcode = Ocaml_shadow.Deadcodemodule Debuginfo = Ocaml_shadow.Debuginfomodule Depend = Ocaml_shadow.Dependmodule Diffing = Ocaml_shadow.Diffingmodule Diffing_with_keys = Ocaml_shadow.Diffing_with_keysmodule Dll = Ocaml_shadow.Dllmodule Domainstate = Ocaml_shadow.Domainstatemodule Effect_analysis = Ocaml_shadow.Effect_analysismodule Emit = Ocaml_shadow.Emitmodule Emitaux = Ocaml_shadow.Emitauxmodule Emitcode = Ocaml_shadow.Emitcodemodule Emitenv = Ocaml_shadow.Emitenvmodule Env = Ocaml_shadow.Envmodule Envaux = Ocaml_shadow.Envauxmodule Errors = Ocaml_shadow.Errorsmodule Errortrace = Ocaml_shadow.Errortracemodule Export_id = Ocaml_shadow.Export_idmodule Export_info = Ocaml_shadow.Export_infomodule Export_info_for_pack = Ocaml_shadow.Export_info_for_packmodule Expunge = Ocaml_shadow.Expungemodule Extract_projections = Ocaml_shadow.Extract_projectionsmodule Find_recursive_functions = Ocaml_shadow.Find_recursive_functionsmodule Flambda = Ocaml_shadow.Flambdamodule Flambda_invariants = Ocaml_shadow.Flambda_invariantsmodule Flambda_iterators = Ocaml_shadow.Flambda_iteratorsmodule Flambda_middle_end = Ocaml_shadow.Flambda_middle_endmodule Flambda_to_clambda = Ocaml_shadow.Flambda_to_clambdamodule Flambda_utils = Ocaml_shadow.Flambda_utilsmodule Freshening = Ocaml_shadow.Fresheningmodule Genprintval = Ocaml_shadow.Genprintvalmodule Id_types = Ocaml_shadow.Id_typesmodule Ident = Ocaml_shadow.Identmodule Import_approx = Ocaml_shadow.Import_approxmodule Includeclass = Ocaml_shadow.Includeclassmodule Includecore = Ocaml_shadow.Includecoremodule Includemod = Ocaml_shadow.Includemodmodule Includemod_errorprinter = Ocaml_shadow.Includemod_errorprintermodule Inconstant_idents = Ocaml_shadow.Inconstant_identsmodule Initialize_symbol_to_let_symbol =
Ocaml_shadow.Initialize_symbol_to_let_symbolmodule Inline_and_simplify = Ocaml_shadow.Inline_and_simplifymodule Inline_and_simplify_aux = Ocaml_shadow.Inline_and_simplify_auxmodule Inlining_cost = Ocaml_shadow.Inlining_costmodule Inlining_decision = Ocaml_shadow.Inlining_decisionmodule Inlining_decision_intf = Ocaml_shadow.Inlining_decision_intfmodule Inlining_stats = Ocaml_shadow.Inlining_statsmodule Inlining_stats_types = Ocaml_shadow.Inlining_stats_typesmodule Inlining_transforms = Ocaml_shadow.Inlining_transformsmodule Instruct = Ocaml_shadow.Instructmodule Int_replace_polymorphic_compare =
Ocaml_shadow.Int_replace_polymorphic_comparemodule Interf = Ocaml_shadow.Interfmodule Internal_variable_names = Ocaml_shadow.Internal_variable_namesmodule Interval = Ocaml_shadow.Intervalmodule Invariant_params = Ocaml_shadow.Invariant_paramsmodule Lambda = Ocaml_shadow.Lambdamodule Lazy_backtrack = Ocaml_shadow.Lazy_backtrackmodule Lift_code = Ocaml_shadow.Lift_codemodule Lift_constants = Ocaml_shadow.Lift_constantsmodule Lift_let_to_initialize_symbol =
Ocaml_shadow.Lift_let_to_initialize_symbolmodule Linear = Ocaml_shadow.Linearmodule Linear_format = Ocaml_shadow.Linear_formatmodule Linearize = Ocaml_shadow.Linearizemodule Linkage_name = Ocaml_shadow.Linkage_namemodule Linscan = Ocaml_shadow.Linscanmodule Liveness = Ocaml_shadow.Livenessmodule Load_path = Ocaml_shadow.Load_pathmodule Local_store = Ocaml_shadow.Local_storemodule Mach = Ocaml_shadow.Machmodule Main = Ocaml_shadow.Mainmodule Main_args = Ocaml_shadow.Main_argsmodule Maindriver = Ocaml_shadow.Maindrivermodule Makedepend = Ocaml_shadow.Makedependmodule Matching = Ocaml_shadow.Matchingmodule Meta = Ocaml_shadow.Metamodule Misc = Ocaml_shadow.Miscmodule Mtype = Ocaml_shadow.Mtypemodule Mutable_variable = Ocaml_shadow.Mutable_variablemodule Numbers = Ocaml_shadow.Numbersmodule Opcodes = Ocaml_shadow.Opcodesmodule Oprint = Ocaml_shadow.Oprintmodule Optcompile = Ocaml_shadow.Optcompilemodule Opterrors = Ocaml_shadow.Opterrorsmodule Optmain = Ocaml_shadow.Optmainmodule Optmaindriver = Ocaml_shadow.Optmaindrivermodule Outcometree = Ocaml_shadow.Outcometreemodule Parameter = Ocaml_shadow.Parametermodule Parmatch = Ocaml_shadow.Parmatchmodule Parser = Ocaml_shadow.Parsermodule Pass_wrapper = Ocaml_shadow.Pass_wrappermodule Path = Ocaml_shadow.Pathmodule Patterns = Ocaml_shadow.Patternsmodule Persistent_env = Ocaml_shadow.Persistent_envmodule Polling = Ocaml_shadow.Pollingmodule Pparse = Ocaml_shadow.Pparsemodule Predef = Ocaml_shadow.Predefmodule Primitive = Ocaml_shadow.Primitivemodule Printast = Ocaml_shadow.Printastmodule Printclambda = Ocaml_shadow.Printclambdamodule Printclambda_primitives = Ocaml_shadow.Printclambda_primitivesmodule Printcmm = Ocaml_shadow.Printcmmmodule Printinstr = Ocaml_shadow.Printinstrmodule Printlambda = Ocaml_shadow.Printlambdamodule Printlinear = Ocaml_shadow.Printlinearmodule Printmach = Ocaml_shadow.Printmachmodule Printpat = Ocaml_shadow.Printpatmodule Printtyp = Ocaml_shadow.Printtypmodule Printtyped = Ocaml_shadow.Printtypedmodule Proc = Ocaml_shadow.Procmodule Profile = Ocaml_shadow.Profilemodule Projection = Ocaml_shadow.Projectionmodule Rec_check = Ocaml_shadow.Rec_checkmodule Ref_to_variables = Ocaml_shadow.Ref_to_variablesmodule Reg = Ocaml_shadow.Regmodule Reload = Ocaml_shadow.Reloadmodule Reloadgen = Ocaml_shadow.Reloadgenmodule Remove_free_vars_equal_to_args =
Ocaml_shadow.Remove_free_vars_equal_to_argsmodule Remove_unused_arguments = Ocaml_shadow.Remove_unused_argumentsmodule Remove_unused_closure_vars = Ocaml_shadow.Remove_unused_closure_varsmodule Remove_unused_program_constructs =
Ocaml_shadow.Remove_unused_program_constructsmodule Runtimedef = Ocaml_shadow.Runtimedefmodule Schedgen = Ocaml_shadow.Schedgenmodule Scheduling = Ocaml_shadow.Schedulingmodule Selectgen = Ocaml_shadow.Selectgenmodule Selection = Ocaml_shadow.Selectionmodule Semantics_of_primitives = Ocaml_shadow.Semantics_of_primitivesmodule Set_of_closures_id = Ocaml_shadow.Set_of_closures_idmodule Set_of_closures_origin = Ocaml_shadow.Set_of_closures_originmodule Shape = Ocaml_shadow.Shapemodule Signature_group = Ocaml_shadow.Signature_groupmodule Simple_value_approx = Ocaml_shadow.Simple_value_approxmodule Simplif = Ocaml_shadow.Simplifmodule Simplify_boxed_integer_ops = Ocaml_shadow.Simplify_boxed_integer_opsmodule Simplify_boxed_integer_ops_intf =
Ocaml_shadow.Simplify_boxed_integer_ops_intfmodule Simplify_common = Ocaml_shadow.Simplify_commonmodule Simplify_primitives = Ocaml_shadow.Simplify_primitivesmodule Spill = Ocaml_shadow.Spillmodule Split = Ocaml_shadow.Splitmodule Static_exception = Ocaml_shadow.Static_exceptionmodule Strmatch = Ocaml_shadow.Strmatchmodule Strongly_connected_components =
Ocaml_shadow.Strongly_connected_componentsmodule Stypes = Ocaml_shadow.Stypesmodule Subst = Ocaml_shadow.Substmodule Switch = Ocaml_shadow.Switchmodule Symbol = Ocaml_shadow.Symbolmodule Symtable = Ocaml_shadow.Symtablemodule Tag = Ocaml_shadow.Tagmodule Targetint = Ocaml_shadow.Targetintmodule Tast_iterator = Ocaml_shadow.Tast_iteratormodule Tast_mapper = Ocaml_shadow.Tast_mappermodule Terminfo = Ocaml_shadow.Terminfomodule Tmc = Ocaml_shadow.Tmcmodule Topcommon = Ocaml_shadow.Topcommonmodule Topdirs = Ocaml_shadow.Topdirsmodule Topeval = Ocaml_shadow.Topevalmodule Tophooks = Ocaml_shadow.Tophooksmodule Toploop = Ocaml_shadow.Toploopmodule Topmain = Ocaml_shadow.Topmainmodule Topprinters = Ocaml_shadow.Topprintersmodule Topstart = Ocaml_shadow.Topstartmodule Trace = Ocaml_shadow.Tracemodule Translattribute = Ocaml_shadow.Translattributemodule Translclass = Ocaml_shadow.Translclassmodule Translcore = Ocaml_shadow.Translcoremodule Translmod = Ocaml_shadow.Translmodmodule Translobj = Ocaml_shadow.Translobjmodule Translprim = Ocaml_shadow.Translprimmodule Traverse_for_exported_symbols =
Ocaml_shadow.Traverse_for_exported_symbolsmodule Type_immediacy = Ocaml_shadow.Type_immediacymodule Typeclass = Ocaml_shadow.Typeclassmodule Typecore = Ocaml_shadow.Typecoremodule Typedecl = Ocaml_shadow.Typedeclmodule Typedecl_immediacy = Ocaml_shadow.Typedecl_immediacymodule Typedecl_properties = Ocaml_shadow.Typedecl_propertiesmodule Typedecl_separability = Ocaml_shadow.Typedecl_separabilitymodule Typedecl_unboxed = Ocaml_shadow.Typedecl_unboxedmodule Typedecl_variance = Ocaml_shadow.Typedecl_variancemodule Typedtree = Ocaml_shadow.Typedtreemodule Typemod = Ocaml_shadow.Typemodmodule Typeopt = Ocaml_shadow.Typeoptmodule Types = Ocaml_shadow.Typesmodule Typetexp = Ocaml_shadow.Typetexpmodule Un_anf = Ocaml_shadow.Un_anfmodule Unbox_closures = Ocaml_shadow.Unbox_closuresmodule Unbox_free_vars_of_closures = Ocaml_shadow.Unbox_free_vars_of_closuresmodule Unbox_specialised_args = Ocaml_shadow.Unbox_specialised_argsmodule Untypeast = Ocaml_shadow.Untypeastmodule Var_within_closure = Ocaml_shadow.Var_within_closuremodule Variable = Ocaml_shadow.Variablemodule Warnings = Ocaml_shadow.Warningsmodule X86_ast = Ocaml_shadow.X86_astmodule X86_dsl = Ocaml_shadow.X86_dslmodule X86_gas = Ocaml_shadow.X86_gasmodule X86_masm = Ocaml_shadow.X86_masmmodule X86_proc = Ocaml_shadow.X86_proc