Ppxlib
Standard 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 ... end
Ast_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 ... end
This 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 ... end
This module provides AST traversal classes, such as maps, iterations, folds, etc. on the Parsetree
types.
module Context_free : sig ... end
Context free rewriting, to define local rewriting rules that will all be applied at once by the driver.
module Deriving : sig ... end
Deriving code from type declarations.
module Extension : sig ... end
Declare extenders to rewrite extension nodes.
module Expansion_context : sig ... end
The context given to rewriting rules when expanding.
module Code_path : sig ... end
This module contains type and functions for representing and manipulating path to AST nodes.
module Expansion_helpers : sig ... end
Various helpers for expansion, such as quoting expressions in their context, or mangling names.
module Merlin_helpers : sig ... end
Some helpers to annotate the AST so merlin can decide which branches to look at and which branches to ignore.
module Spellcheck : sig ... end
Helpers to provide hints to PPX users for typos or spellchecks.
module Keyword : sig ... end
Small module to check if a string is an OCaml keyword.
module Driver : sig ... end
Interaction with the driver, such as getting/seeting cookies, adding arguments.
module Caller_id : sig ... end
Small helper to find out who is the caller of a function
module Ast_io : sig ... end
A small module to help read bin-annots
generated files.
module Attribute : sig ... end
This 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 ... end
Small module to reserve namespaces in attribute names.
val lident : string -> Longident.t
val core_type_of_type_declaration :
Astlib.Ast_500.Parsetree.type_declaration ->
Astlib.Ast_500.Parsetree.core_type
val name_type_params_in_td_res :
Astlib.Ast_500.Parsetree.type_declaration ->
(Astlib.Ast_500.Parsetree.type_declaration,
Location.Error.t Stdppx.NonEmptyList.t)
result
val name_type_params_in_td :
Astlib.Ast_500.Parsetree.type_declaration ->
Astlib.Ast_500.Parsetree.type_declaration
val 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_type
gen_symbol ?prefix ()
generates a fresh variable name with prefix
.
val string_of_core_type : Astlib.Ast_500.Parsetree.core_type -> string
val assert_no_attributes : Astlib.Ast_500.Parsetree.attribute list -> unit
val attributes_errors :
Astlib.Ast_500.Parsetree.attribute list ->
Location.Error.t list
val collect_attributes_errors :
Location.Error.t list Ppxlib__.Ast_traverse0.fold
val 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) result
get_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.t
See 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_flag
really_recursive rec_flag tds = (new type_is_recursive rec_flag tds)#go ()
val loc_of_payload : Astlib.Ast_500.Parsetree.attribute -> Location.t
val loc_of_attribute : Astlib.Ast_500.Parsetree.attribute -> Location.t
val loc_of_extension :
(string Astlib.Location.loc * Astlib.Ast_500.Parsetree.payload) ->
Location.t
val curry_applications :
Astlib.Ast_500.Parsetree.expression ->
Astlib.Ast_500.Parsetree.expression
convert multi-arg function applications into a cascade of 1-arg applications
val attribute_of_warning :
Location.t ->
string ->
Astlib.Ast_500.Parsetree.attribute
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_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
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:
It will take care of giving fresh names to unnamed type parameters.
val exn_to_loc_error : exn -> Location.Error.t
Convert exn
to a located error if possible or reraise it otherwise
module With_errors : sig ... end
Expose some modules from Ppxlib_ast
.
module Ast = Ppxlib_ast.Ast
module Ast_helper = Ppxlib_ast.Ast_helper
module Asttypes = Ppxlib_ast.Asttypes
module Parse = Ppxlib_ast.Parse
module Parsetree = Ppxlib_ast.Parsetree
module Pprintast = Ppxlib_ast.Pprintast
module Selected_ast = Ppxlib_ast.Selected_ast
module Location : sig ... end
Overrides the Location
module of OCaml
module Longident : sig ... end
Overrides the Longident
module of OCaml
module Loc : sig ... end
Located items
Include all the Ast definitions since we need them in every single ppx
include module type of struct include Ast end
and location_stack = location list
and 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 option
Integer 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 char
Character such as 'c'
.
| Pconst_string of string * location * string option
Constant 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 option
Float constant such as 3.4
, 2e5
or 1.4e-4
.
Suffixes g-z
G-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 list
and 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 string
A type variable such as 'a
| Ptyp_arrow of arg_label * core_type * core_type
| Ptyp_tuple of core_type list
Ptyp_tuple([T1 ; ... ; Tn])
represents a product type T1 * ... * Tn
.
Invariant: n >= 2
.
| Ptyp_constr of longident_loc * core_type list
Ptyp_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 list
Ptyp_class(tconstr, l)
represents:
#tconstr
when l=[]
,T #tconstr
when l=[T]
,(T1, ..., Tn) #tconstr
when l=[T1 ; ... ; Tn]
.| Ptyp_alias of core_type * string
T 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) list
As 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 list
Rtag(`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_any
The pattern _
.
| Ppat_var of string loc
A variable pattern such as x
| Ppat_alias of pattern * string loc
An alias pattern such as P as 'a
| Ppat_constant of constant
Patterns such as 1
, 'a'
, "true"
, 1.0
, 1l
, 1L
, 1n
| Ppat_interval of constant * constant
Patterns such as 'a'..'z'
.
Other forms of interval are recognized by the parser but rejected by the type-checker.
*)| Ppat_tuple of pattern list
Patterns (P1, ..., Pn)
.
Invariant: n >= 2
| Ppat_construct of longident_loc * (string loc list * pattern) option
Ppat_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 option
Ppat_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 list
Pattern [| P1; ...; Pn |]
| Ppat_or of pattern * pattern
Pattern P1 | P2
| Ppat_constraint of pattern * core_type
Pattern (P : T)
| Ppat_type of longident_loc
Pattern #tconst
| Ppat_lazy of pattern
Pattern lazy P
| Ppat_unpack of string option loc
Ppat_unpack(s)
represents:
(module P)
when s
is Some "P"
(module _)
when s
is None
Note: (module P : S)
is represented as Ppat_constraint(Ppat_unpack(Some "P"), Ptyp_package S)
| Ppat_exception of pattern
Pattern exception P
| Ppat_extension of extension
Pattern [%id]
| Ppat_open of longident_loc * pattern
Pattern 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_loc
Identifiers such as x
and M.x
| Pexp_constant of constant
Expressions constant such as 1
, 'a'
, "true"
, 1.0
, 1l
, 1L
, 1n
| Pexp_let of rec_flag * value_binding list * expression
Pexp_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 cases
function P1 -> E1 | ... | Pn -> En
| Pexp_fun of arg_label * expression option * pattern * expression
Pexp_fun(lbl, exp0, P, E1)
represents:
fun P -> E1
when lbl
is Nolabel
and exp0
is None
fun ~l:P -> E1
when lbl
is Labelled l
and exp0
is None
fun ?l:P -> E1
when lbl
is Optional l
and exp0
is None
fun ?l:(P = E0) -> E1
when lbl
is Optional l
and exp0
is Some E0
Notes:
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 * cases
match E0 with P1 -> E1 | ... | Pn -> En
| Pexp_try of expression * cases
try E0 with P1 -> E1 | ... | Pn -> En
| Pexp_tuple of expression list
Expressions (E1, ..., En)
Invariant: n >= 2
| Pexp_construct of longident_loc * expression option
Pexp_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 option
Pexp_variant(`A, exp)
represents
`A
when exp
is None
`A E
when exp
is Some E
| Pexp_record of (longident_loc * expression) list * expression option
Pexp_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 E0
Invariant: n > 0
| Pexp_field of expression * longident_loc
E.l
| Pexp_setfield of expression * longident_loc * expression
E1.l <- E2
| Pexp_array of expression list
[| E1; ...; En |]
| Pexp_ifthenelse of expression * expression * expression option
if E1 then E2 else E3
| Pexp_sequence of expression * expression
E1; E2
| Pexp_while of expression * expression
while 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_type
Pexp_coerce(E, from, T)
represents
(E :> T)
when from
is None
,(E : T0 :> T)
when from
is Some T0
.| Pexp_send of expression * label loc
E # m
| Pexp_new of longident_loc
new M.c
| Pexp_setinstvar of label loc * expression
x <- 2
| Pexp_override of (label loc * expression) list
{< x1 = E1; ...; xn = En >}
| Pexp_letmodule of string option loc * module_expr * expression
let module M = ME in E
| Pexp_letexception of extension_constructor * expression
let exception C in E
| Pexp_assert of expression
assert E
.
Note: assert false
is treated in a special way by the type-checker.
| Pexp_lazy of expression
lazy E
| Pexp_poly of expression * core_type option
Used for method bodies.
Can only be used as the expression under Cfk_concrete
for methods (not values).
| Pexp_object of class_structure
object ... end
| Pexp_newtype of string loc * expression
fun (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 * expression
M.(E)
let open M in E
let open! M in E
| Pexp_letop of letop
let* P = E0 in E1
let* 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 list
Invariant: non-empty list
*)| Ptype_open
and 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 list
Values 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 option
Pext_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_loc
Pext_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 list
c
['a1, ..., 'an] c
| Pcty_signature of class_signature
object ... end
| Pcty_arrow of arg_label * core_type * class_type
Pcty_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_type
let 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) ... end
object ... end
when pcsig_self
is Ptyp_any
and 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_type
inherit CT
| Pctf_val of label loc * mutable_flag * virtual_flag * core_type
val x: T
| Pctf_method of label loc * private_flag * virtual_flag * core_type
| Pctf_constraint of core_type * core_type
constraint 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_infos
and class_type_declaration = class_type class_infos
and 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 list
c
and ['a1, ..., 'an] c
| Pcl_structure of class_structure
object ... end
| Pcl_fun of arg_label * expression option * pattern * class_expr
Pcl_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) list
Pcl_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_expr
Pcl_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_expr
let 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) ... end
object ... end
when pcstr_self
is Ppat_any
and 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_kind
Pcf_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_type
constraint T1 = T2
| Pcf_initializer of expression
initializer 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 * expression
and class_declaration = class_expr class_infos
and 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_loc
Pmty_ident(S)
represents S
| Pmty_signature of signature
sig ... end
| Pmty_functor of functor_parameter * module_type
functor(X : MT1) -> MT2
| Pmty_with of module_type * with_constraint list
MT with ...
| Pmty_typeof of module_expr
module 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_type
Named(name, MT)
represents:
(X : MT)
when name
is Some X
,(_ : MT)
when name
is None
and signature = signature_item list
and 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_description
val x: T
external x: T = "s1" ... "sn"
| Psig_type of rec_flag * type_declaration list
type t1 = ... and ... and tn = ...
| Psig_typesubst of type_declaration list
type t1 := ... and ... and tn := ...
| Psig_typext of type_extension
type t1 += ...
| Psig_exception of type_exception
exception C of T
| Psig_module of module_declaration
module X = M
and module X : MT
| Psig_modsubst of module_substitution
module X := M
| Psig_recmodule of module_declaration list
module rec X1 : MT1 and ... and Xn : MTn
| Psig_modtype of module_type_declaration
module type S = MT
and module type S
| Psig_modtypesubst of module_type_declaration
module type S := ...
| Psig_open of open_description
open X
| Psig_include of include_description
include MT
| Psig_class of class_description list
class c1 : ... and ... and cn : ...
| Psig_class_type of class_type_declaration list
class 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 Fresh
and open_description = longident_loc open_infos
Values of type open_description
represents:
open M.N
open M(N).O
and open_declaration = module_expr open_infos
Values of type open_declaration
represents:
open M.N
open M(N).O
open struct ... end
and '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_infos
Values of type include_description
represents include MT
and include_declaration = module_expr include_infos
Values of type include_declaration
represents include ME
and with_constraint = Astlib.Ast_500.Parsetree.with_constraint =
| Pwith_type of longident_loc * type_declaration
with type X.t = ...
Note: the last component of the longident must match the name of the type_declaration.
*)| Pwith_module of longident_loc * longident_loc
with module X.Y = Z
| Pwith_modtype of longident_loc * module_type
with module type X.Y = Z
| Pwith_modtypesubst of longident_loc * module_type
with module type X.Y := sig end
| Pwith_typesubst of longident_loc * type_declaration
with type X.t := ..., same format as [Pwith_type]
| Pwith_modsubst of longident_loc * longident_loc
with 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_loc
X
| Pmod_structure of structure
struct ... end
| Pmod_functor of functor_parameter * module_expr
functor(X : MT1) -> ME
| Pmod_apply of module_expr * module_expr
ME1(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 list
and 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 * attributes
E
| Pstr_value of rec_flag * value_binding list
Pstr_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_description
val x: T
external x: T = "s1" ... "sn"
| Pstr_type of rec_flag * type_declaration list
type t1 = ... and ... and tn = ...
| Pstr_typext of type_extension
type t1 += ...
| Pstr_exception of type_exception
exception C of T
exception C = M.X
| Pstr_module of module_binding
module X = ME
| Pstr_recmodule of module_binding list
module rec X1 = ME1 and ... and Xn = MEn
| Pstr_modtype of module_type_declaration
module type S = MT
| Pstr_open of open_declaration
open X
| Pstr_class of class_declaration list
class c1 = ... and ... and cn = ...
| Pstr_class_type of class_type_declaration list
class type ct1 = ... and ... and ctn = ...
| Pstr_include of include_declaration
include 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 bool
and cases = case list
class virtual map : object ... end
class virtual iter : object ... end
class virtual 'acc fold : object ... end
class virtual 'acc fold_map : object ... end
class virtual 'ctx map_with_context : object ... end
class virtual 'res lift : object ... end
class virtual ['ctx, 'res] lift_map_with_context : object ... end
Make sure code using Ppxlib doesn't refer to compiler-libs without being explicit about it:
include sig ... end
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
module Do_not_use_directly = Ocaml_shadow.Do_not_use_directly
module Afl_instrument = Ocaml_shadow.Afl_instrument
module Alias_analysis = Ocaml_shadow.Alias_analysis
module Allocated_const = Ocaml_shadow.Allocated_const
module Annot = Ocaml_shadow.Annot
module Arch = Ocaml_shadow.Arch
module Arg_helper = Ocaml_shadow.Arg_helper
module Asmgen = Ocaml_shadow.Asmgen
module Asmlibrarian = Ocaml_shadow.Asmlibrarian
module Asmlink = Ocaml_shadow.Asmlink
module Asmpackager = Ocaml_shadow.Asmpackager
module Ast_invariants = Ocaml_shadow.Ast_invariants
module Ast_iterator = Ocaml_shadow.Ast_iterator
module Ast_mapper = Ocaml_shadow.Ast_mapper
module Attr_helper = Ocaml_shadow.Attr_helper
module Augment_specialised_args = Ocaml_shadow.Augment_specialised_args
module Backend_intf = Ocaml_shadow.Backend_intf
module Backend_var = Ocaml_shadow.Backend_var
module Binutils = Ocaml_shadow.Binutils
module Branch_relaxation = Ocaml_shadow.Branch_relaxation
module Branch_relaxation_intf = Ocaml_shadow.Branch_relaxation_intf
module Btype = Ocaml_shadow.Btype
module Build_export_info = Ocaml_shadow.Build_export_info
module Build_path_prefix_map = Ocaml_shadow.Build_path_prefix_map
module Builtin_attributes = Ocaml_shadow.Builtin_attributes
module Bytegen = Ocaml_shadow.Bytegen
module Bytelibrarian = Ocaml_shadow.Bytelibrarian
module Bytelink = Ocaml_shadow.Bytelink
module Bytepackager = Ocaml_shadow.Bytepackager
module Bytesections = Ocaml_shadow.Bytesections
module CSE = Ocaml_shadow.CSE
module CSEgen = Ocaml_shadow.CSEgen
module CamlinternalMenhirLib = Ocaml_shadow.CamlinternalMenhirLib
module Ccomp = Ocaml_shadow.Ccomp
module Clambda = Ocaml_shadow.Clambda
module Clambda_primitives = Ocaml_shadow.Clambda_primitives
module Clflags = Ocaml_shadow.Clflags
module Closure = Ocaml_shadow.Closure
module Closure_conversion = Ocaml_shadow.Closure_conversion
module Closure_conversion_aux = Ocaml_shadow.Closure_conversion_aux
module Closure_element = Ocaml_shadow.Closure_element
module Closure_id = Ocaml_shadow.Closure_id
module Closure_middle_end = Ocaml_shadow.Closure_middle_end
module Closure_offsets = Ocaml_shadow.Closure_offsets
module Closure_origin = Ocaml_shadow.Closure_origin
module Cmi_format = Ocaml_shadow.Cmi_format
module Cmm = Ocaml_shadow.Cmm
module Cmm_helpers = Ocaml_shadow.Cmm_helpers
module Cmm_invariants = Ocaml_shadow.Cmm_invariants
module Cmmgen = Ocaml_shadow.Cmmgen
module Cmmgen_state = Ocaml_shadow.Cmmgen_state
module Cmo_format = Ocaml_shadow.Cmo_format
module Cmt2annot = Ocaml_shadow.Cmt2annot
module Cmt_format = Ocaml_shadow.Cmt_format
module Cmx_format = Ocaml_shadow.Cmx_format
module Cmxs_format = Ocaml_shadow.Cmxs_format
module Coloring = Ocaml_shadow.Coloring
module Comballoc = Ocaml_shadow.Comballoc
module Compenv = Ocaml_shadow.Compenv
module Compilation_unit = Ocaml_shadow.Compilation_unit
module Compile = Ocaml_shadow.Compile
module Compile_common = Ocaml_shadow.Compile_common
module Compilenv = Ocaml_shadow.Compilenv
module Compmisc = Ocaml_shadow.Compmisc
module Compression = Ocaml_shadow.Compression
module Config = Ocaml_shadow.Config
module Config_boot = Ocaml_shadow.Config_boot
module Config_main = Ocaml_shadow.Config_main
module Consistbl = Ocaml_shadow.Consistbl
module Convert_primitives = Ocaml_shadow.Convert_primitives
module Ctype = Ocaml_shadow.Ctype
module Dataflow = Ocaml_shadow.Dataflow
module Datarepr = Ocaml_shadow.Datarepr
module Deadcode = Ocaml_shadow.Deadcode
module Debuginfo = Ocaml_shadow.Debuginfo
module Depend = Ocaml_shadow.Depend
module Diffing = Ocaml_shadow.Diffing
module Diffing_with_keys = Ocaml_shadow.Diffing_with_keys
module Dll = Ocaml_shadow.Dll
module Domainstate = Ocaml_shadow.Domainstate
module Effect_analysis = Ocaml_shadow.Effect_analysis
module Emit = Ocaml_shadow.Emit
module Emitaux = Ocaml_shadow.Emitaux
module Emitcode = Ocaml_shadow.Emitcode
module Emitenv = Ocaml_shadow.Emitenv
module Env = Ocaml_shadow.Env
module Envaux = Ocaml_shadow.Envaux
module Errors = Ocaml_shadow.Errors
module Errortrace = Ocaml_shadow.Errortrace
module Export_id = Ocaml_shadow.Export_id
module Export_info = Ocaml_shadow.Export_info
module Export_info_for_pack = Ocaml_shadow.Export_info_for_pack
module Expunge = Ocaml_shadow.Expunge
module Extract_projections = Ocaml_shadow.Extract_projections
module Find_recursive_functions = Ocaml_shadow.Find_recursive_functions
module Flambda = Ocaml_shadow.Flambda
module Flambda_invariants = Ocaml_shadow.Flambda_invariants
module Flambda_iterators = Ocaml_shadow.Flambda_iterators
module Flambda_middle_end = Ocaml_shadow.Flambda_middle_end
module Flambda_to_clambda = Ocaml_shadow.Flambda_to_clambda
module Flambda_utils = Ocaml_shadow.Flambda_utils
module Freshening = Ocaml_shadow.Freshening
module Genprintval = Ocaml_shadow.Genprintval
module Id_types = Ocaml_shadow.Id_types
module Ident = Ocaml_shadow.Ident
module Import_approx = Ocaml_shadow.Import_approx
module Includeclass = Ocaml_shadow.Includeclass
module Includecore = Ocaml_shadow.Includecore
module Includemod = Ocaml_shadow.Includemod
module Includemod_errorprinter = Ocaml_shadow.Includemod_errorprinter
module Inconstant_idents = Ocaml_shadow.Inconstant_idents
module Initialize_symbol_to_let_symbol =
Ocaml_shadow.Initialize_symbol_to_let_symbol
module Inline_and_simplify = Ocaml_shadow.Inline_and_simplify
module Inline_and_simplify_aux = Ocaml_shadow.Inline_and_simplify_aux
module Inlining_cost = Ocaml_shadow.Inlining_cost
module Inlining_decision = Ocaml_shadow.Inlining_decision
module Inlining_decision_intf = Ocaml_shadow.Inlining_decision_intf
module Inlining_stats = Ocaml_shadow.Inlining_stats
module Inlining_stats_types = Ocaml_shadow.Inlining_stats_types
module Inlining_transforms = Ocaml_shadow.Inlining_transforms
module Instruct = Ocaml_shadow.Instruct
module Int_replace_polymorphic_compare =
Ocaml_shadow.Int_replace_polymorphic_compare
module Interf = Ocaml_shadow.Interf
module Internal_variable_names = Ocaml_shadow.Internal_variable_names
module Interval = Ocaml_shadow.Interval
module Invariant_params = Ocaml_shadow.Invariant_params
module Lambda = Ocaml_shadow.Lambda
module Lazy_backtrack = Ocaml_shadow.Lazy_backtrack
module Lift_code = Ocaml_shadow.Lift_code
module Lift_constants = Ocaml_shadow.Lift_constants
module Lift_let_to_initialize_symbol =
Ocaml_shadow.Lift_let_to_initialize_symbol
module Linear = Ocaml_shadow.Linear
module Linear_format = Ocaml_shadow.Linear_format
module Linearize = Ocaml_shadow.Linearize
module Linkage_name = Ocaml_shadow.Linkage_name
module Linscan = Ocaml_shadow.Linscan
module Liveness = Ocaml_shadow.Liveness
module Load_path = Ocaml_shadow.Load_path
module Local_store = Ocaml_shadow.Local_store
module Mach = Ocaml_shadow.Mach
module Main = Ocaml_shadow.Main
module Main_args = Ocaml_shadow.Main_args
module Maindriver = Ocaml_shadow.Maindriver
module Makedepend = Ocaml_shadow.Makedepend
module Matching = Ocaml_shadow.Matching
module Meta = Ocaml_shadow.Meta
module Misc = Ocaml_shadow.Misc
module Mtype = Ocaml_shadow.Mtype
module Mutable_variable = Ocaml_shadow.Mutable_variable
module Numbers = Ocaml_shadow.Numbers
module Opcodes = Ocaml_shadow.Opcodes
module Oprint = Ocaml_shadow.Oprint
module Optcompile = Ocaml_shadow.Optcompile
module Opterrors = Ocaml_shadow.Opterrors
module Optmain = Ocaml_shadow.Optmain
module Optmaindriver = Ocaml_shadow.Optmaindriver
module Outcometree = Ocaml_shadow.Outcometree
module Parameter = Ocaml_shadow.Parameter
module Parmatch = Ocaml_shadow.Parmatch
module Parser = Ocaml_shadow.Parser
module Pass_wrapper = Ocaml_shadow.Pass_wrapper
module Path = Ocaml_shadow.Path
module Patterns = Ocaml_shadow.Patterns
module Persistent_env = Ocaml_shadow.Persistent_env
module Polling = Ocaml_shadow.Polling
module Pparse = Ocaml_shadow.Pparse
module Predef = Ocaml_shadow.Predef
module Primitive = Ocaml_shadow.Primitive
module Printast = Ocaml_shadow.Printast
module Printclambda = Ocaml_shadow.Printclambda
module Printclambda_primitives = Ocaml_shadow.Printclambda_primitives
module Printcmm = Ocaml_shadow.Printcmm
module Printinstr = Ocaml_shadow.Printinstr
module Printlambda = Ocaml_shadow.Printlambda
module Printlinear = Ocaml_shadow.Printlinear
module Printmach = Ocaml_shadow.Printmach
module Printpat = Ocaml_shadow.Printpat
module Printtyp = Ocaml_shadow.Printtyp
module Printtyped = Ocaml_shadow.Printtyped
module Proc = Ocaml_shadow.Proc
module Profile = Ocaml_shadow.Profile
module Projection = Ocaml_shadow.Projection
module Rec_check = Ocaml_shadow.Rec_check
module Ref_to_variables = Ocaml_shadow.Ref_to_variables
module Reg = Ocaml_shadow.Reg
module Reload = Ocaml_shadow.Reload
module Reloadgen = Ocaml_shadow.Reloadgen
module Remove_free_vars_equal_to_args =
Ocaml_shadow.Remove_free_vars_equal_to_args
module Remove_unused_arguments = Ocaml_shadow.Remove_unused_arguments
module Remove_unused_closure_vars = Ocaml_shadow.Remove_unused_closure_vars
module Remove_unused_program_constructs =
Ocaml_shadow.Remove_unused_program_constructs
module Runtimedef = Ocaml_shadow.Runtimedef
module Schedgen = Ocaml_shadow.Schedgen
module Scheduling = Ocaml_shadow.Scheduling
module Selectgen = Ocaml_shadow.Selectgen
module Selection = Ocaml_shadow.Selection
module Semantics_of_primitives = Ocaml_shadow.Semantics_of_primitives
module Set_of_closures_id = Ocaml_shadow.Set_of_closures_id
module Set_of_closures_origin = Ocaml_shadow.Set_of_closures_origin
module Shape = Ocaml_shadow.Shape
module Signature_group = Ocaml_shadow.Signature_group
module Simple_value_approx = Ocaml_shadow.Simple_value_approx
module Simplif = Ocaml_shadow.Simplif
module Simplify_boxed_integer_ops = Ocaml_shadow.Simplify_boxed_integer_ops
module Simplify_boxed_integer_ops_intf =
Ocaml_shadow.Simplify_boxed_integer_ops_intf
module Simplify_common = Ocaml_shadow.Simplify_common
module Simplify_primitives = Ocaml_shadow.Simplify_primitives
module Spill = Ocaml_shadow.Spill
module Split = Ocaml_shadow.Split
module Static_exception = Ocaml_shadow.Static_exception
module Strmatch = Ocaml_shadow.Strmatch
module Strongly_connected_components =
Ocaml_shadow.Strongly_connected_components
module Stypes = Ocaml_shadow.Stypes
module Subst = Ocaml_shadow.Subst
module Switch = Ocaml_shadow.Switch
module Symbol = Ocaml_shadow.Symbol
module Symtable = Ocaml_shadow.Symtable
module Tag = Ocaml_shadow.Tag
module Targetint = Ocaml_shadow.Targetint
module Tast_iterator = Ocaml_shadow.Tast_iterator
module Tast_mapper = Ocaml_shadow.Tast_mapper
module Terminfo = Ocaml_shadow.Terminfo
module Tmc = Ocaml_shadow.Tmc
module Topcommon = Ocaml_shadow.Topcommon
module Topdirs = Ocaml_shadow.Topdirs
module Topeval = Ocaml_shadow.Topeval
module Tophooks = Ocaml_shadow.Tophooks
module Toploop = Ocaml_shadow.Toploop
module Topmain = Ocaml_shadow.Topmain
module Topprinters = Ocaml_shadow.Topprinters
module Topstart = Ocaml_shadow.Topstart
module Trace = Ocaml_shadow.Trace
module Translattribute = Ocaml_shadow.Translattribute
module Translclass = Ocaml_shadow.Translclass
module Translcore = Ocaml_shadow.Translcore
module Translmod = Ocaml_shadow.Translmod
module Translobj = Ocaml_shadow.Translobj
module Translprim = Ocaml_shadow.Translprim
module Traverse_for_exported_symbols =
Ocaml_shadow.Traverse_for_exported_symbols
module Type_immediacy = Ocaml_shadow.Type_immediacy
module Typeclass = Ocaml_shadow.Typeclass
module Typecore = Ocaml_shadow.Typecore
module Typedecl = Ocaml_shadow.Typedecl
module Typedecl_immediacy = Ocaml_shadow.Typedecl_immediacy
module Typedecl_properties = Ocaml_shadow.Typedecl_properties
module Typedecl_separability = Ocaml_shadow.Typedecl_separability
module Typedecl_unboxed = Ocaml_shadow.Typedecl_unboxed
module Typedecl_variance = Ocaml_shadow.Typedecl_variance
module Typedtree = Ocaml_shadow.Typedtree
module Typemod = Ocaml_shadow.Typemod
module Typeopt = Ocaml_shadow.Typeopt
module Types = Ocaml_shadow.Types
module Typetexp = Ocaml_shadow.Typetexp
module Un_anf = Ocaml_shadow.Un_anf
module Unbox_closures = Ocaml_shadow.Unbox_closures
module Unbox_free_vars_of_closures = Ocaml_shadow.Unbox_free_vars_of_closures
module Unbox_specialised_args = Ocaml_shadow.Unbox_specialised_args
module Untypeast = Ocaml_shadow.Untypeast
module Var_within_closure = Ocaml_shadow.Var_within_closure
module Variable = Ocaml_shadow.Variable
module Warnings = Ocaml_shadow.Warnings
module X86_ast = Ocaml_shadow.X86_ast
module X86_dsl = Ocaml_shadow.X86_dsl
module X86_gas = Ocaml_shadow.X86_gas
module X86_masm = Ocaml_shadow.X86_masm
module X86_proc = Ocaml_shadow.X86_proc