package ppxlib
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=507cc73ccf895f22eeb5257a2243838c18a38a09105fcff55eeef9148555422b
sha512=73fef8ab8761bfbfde6ae87cc51eaacc5a5c937f0d628a890f0abdb2bffbf073932c25287a9e3baa2a1947c37f3dfa7f83ddd33c440e2e800971015addc97cd2
doc/ppxlib/Ppxlib/index.html
Module 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:
- The main
ppxlib
modules, such as modules to help manipulate the AST (Ast_builder
,Ast_pattern
), and a few functions. - Modules from other libraries, such as
Ast_helper
orPprintast
, - The whole AST types (by
including
theAst
module).
The core ppxlib
entries
Manipulating the AST
module 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.
Context-free rewriting
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.
Other helpers
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.
Driver-related modules
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.
Checks
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.
Common helper functions
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:
- there is only one type declaration
- the type is named t
- there are less than 4 type parameters
- there are no constraints on the type parameters
It will take care of giving fresh names to unnamed type parameters.
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
Modules from other libraries
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
The whole AST types
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
or1.4e-4
.Suffixes
*)g-z
G-Z
are accepted by the parser. Suffixes are rejected by the typechecker.
Extension points
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
Core language
Type expressions
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 typeT1 * ... * Tn
.Invariant:
*)n >= 2
.| Ptyp_constr of longident_loc * core_type list
(*Ptyp_constr(lident, l)
represents:tconstr
whenl=[]
,T tconstr
whenl=[T]
,(T1, ..., Tn) tconstr
whenl=[T1 ; ... ; Tn]
.
| Ptyp_object of object_field list * closed_flag
| Ptyp_class of longident_loc * core_type list
(*Ptyp_class(tconstr, l)
represents:#tconstr
whenl=[]
,T #tconstr
whenl=[T]
,(T1, ..., Tn) #tconstr
whenl=[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:
- As the
core_type
of aPpat_constraint
node corresponding to a constraint on a let-binding:
let x : 'a1 ... 'an. T = e ...
- Under
Cfk_virtual
for methods (not values).
- As the
core_type
of aPctf_method
node.
- As the
pld_type
field of alabel_declaration
.
- As a
core_type
of aPtyp_object
node.
- As the
pval_type
field of avalue_description
.
- As the
| 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
whenb
istrue
andl
is[]
,`A of T
whenb
isfalse
andl
is[T]
,`A of T1 & .. & Tn
whenb
isfalse
andl
is[T1;...Tn]
,`A of & T1 & .. & Tn
whenb
istrue
andl
is[T1;...Tn]
.
- The
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 =
Patterns
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
whenargs
isNone
,C P
whenargs
isSome ([], P)
C (P1, ..., Pn)
whenargs
isSome ([], Ppat_tuple [P1; ...; Pn])
C (type a b) P
whenargs
isSome ([a; b], P)
| Ppat_variant of label * pattern option
(*Ppat_variant(`A, pat)
represents:`A
whenpat
isNone
,`A P
whenpat
isSome 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)
whens
isSome "P"
(module _)
whens
isNone
Note:
*)(module P : S)
is represented asPpat_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)
Value expressions
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
andM.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
whenflag
isNonrecursive
,let rec P1 = E1 and ... and Pn = EN in E
whenflag
isRecursive
.
| 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
whenlbl
isNolabel
andexp0
isNone
fun ~l:P -> E1
whenlbl
isLabelled l
andexp0
isNone
fun ?l:P -> E1
whenlbl
isOptional l
andexp0
isNone
fun ?l:(P = E0) -> E1
whenlbl
isOptional l
andexp0
isSome E0
Notes:
- If
E0
is provided, onlyOptional
is allowed. fun P1 P2 .. Pn -> E1
is represented as nestedPexp_fun
.let f P = E
is represented usingPexp_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
whenexp
isNone
,C E
whenexp
isSome E
,C (E1, ..., En)
whenexp
isSome (Pexp_tuple[E1;...;En])
| Pexp_variant of label * expression option
(*Pexp_variant(`A, exp)
represents`A
whenexp
isNone
`A E
whenexp
isSome E
| Pexp_record of (longident_loc * expression) list * expression option
(*Pexp_record([(l1,P1) ; ... ; (ln,Pn)], exp0)
represents{ l1=P1; ...; ln=Pn }
whenexp0
isNone
{ E0 with l1=P1; ...; ln=Pn }
whenexp0
isSome 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)
whenfrom
isNone
,(E : T0 :> T)
whenfrom
isSome 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 asPexp_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;
}
Value descriptions
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:
Type declarations
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
whentype_kind
isPtype_abstract
, andmanifest
isNone
,type t = T0
whentype_kind
isPtype_abstract
, andmanifest
isSome T0
,type t = C of T | ...
whentype_kind
isPtype_variant
, andmanifest
isNone
,type t = T0 = C of T | ...
whentype_kind
isPtype_variant
, andmanifest
isSome T0
,type t = {l: T; ...}
whentype_kind
isPtype_record
, andmanifest
isNone
,type t = T0 = {l : T; ...}
whentype_kind
isPtype_record
, andmanifest
isSome T0
,type t = ..
whentype_kind
isPtype_open
, andmanifest
isNone
.
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; ... }
whenpld_mutable
isImmutable
,{ ...; mutable l: T; ... }
whenpld_mutable
isMutable
.
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
whenres = None
, andargs = Pcstr_tuple [T1; ... ; Tn]
,C: T0
whenres = Some T0
, andargs = Pcstr_tuple []
,C: T1 * ... * Tn -> T0
whenres = Some T0
, andargs = Pcstr_tuple [T1; ... ; Tn]
,C of {...}
whenres = None
, andargs = Pcstr_record [...]
,C: {...} -> T0
whenres = Some T0
, andargs = 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
isNone
.
C: T0
whenexistentials
is[]
,c_args
is[]
,t_opt
isSome T0
.
C: T1 * ... * Tn -> T0
whenexistentials
is[]
,c_args
is[T1; ...; Tn]
,t_opt
isSome T0
.
C: 'a... . T1 * ... * Tn -> T0
whenexistentials
is['a;...]
,c_args
is[T1; ... ; Tn]
,t_opt
isSome T0
.
| Pext_rebind of longident_loc
(*
*)Pext_rebind(D)
re-export the constructorD
with the new nameC
Class language
Type expressions for the class language
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
whenlbl
isNolabel
,~l:T -> CT
whenlbl
isLabelled l
,?l:T -> CT
whenlbl
isOptional 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
whenpcsig_self
isPtyp_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
Value expressions for the class language
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
whenlbl
isNolabel
andexp0
isNone
,fun ~l:P -> CE
whenlbl
isLabelled l
andexp0
isNone
,fun ?l:P -> CE
whenlbl
isOptional l
andexp0
isNone
,fun ?l:(P = E0) -> CE
whenlbl
isOptional l
andexp0
isSome E0
.
| Pcl_apply of class_expr * (arg_label * expression) list
(*Pcl_apply(CE, [(l1,E1) ; ... ; (ln,En)])
representsCE ~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
whenrec
isNonrecursive
,let rec P1 = E1 and ... and Pn = EN in CE
whenrec
isRecursive
.
| 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
whenpcstr_self
isPpat_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
whenflag
isImmutable
andkind
isCfk_concrete(Fresh, E)
val virtual x: T
whenflag
isImmutable
andkind
isCfk_virtual(T)
val mutable x = E
whenflag
isMutable
andkind
isCfk_concrete(Fresh, E)
val mutable virtual x: T
whenflag
isMutable
andkind
isCfk_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
Module language
Type expressions for the module language
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)
representsS
| 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)
whenname
isSome X
,(_ : MT)
whenname
isNone
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
andmodule 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
andmodule 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, whenpmtd_type
isNone
.
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
whenpopen_override
isOverride
(silences the "used identifier shadowing" warning)open X
whenpopen_override
isFresh
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
Value expressions for the module language
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
whenrec
isNonrecursive
,let rec P1 = E1 and ... and Pn = EN
whenrec
isRecursive
.
| 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
Toplevel
Toplevel phrases
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 Available_regs = Ocaml_shadow.Available_regs
module Backend_intf = Ocaml_shadow.Backend_intf
module Backend_var = Ocaml_shadow.Backend_var
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_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 Cmmgen = Ocaml_shadow.Cmmgen
module Cmmgen_state = Ocaml_shadow.Cmmgen_state
module Cmo_format = Ocaml_shadow.Cmo_format
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 Compute_ranges = Ocaml_shadow.Compute_ranges
module Compute_ranges_intf = Ocaml_shadow.Compute_ranges_intf
module Config = Ocaml_shadow.Config
module Consistbl = Ocaml_shadow.Consistbl
module Convert_primitives = Ocaml_shadow.Convert_primitives
module Ctype = Ocaml_shadow.Ctype
module Datarepr = Ocaml_shadow.Datarepr
module Deadcode = Ocaml_shadow.Deadcode
module Debuginfo = Ocaml_shadow.Debuginfo
module Depend = Ocaml_shadow.Depend
module Dll = Ocaml_shadow.Dll
module Effect_analysis = Ocaml_shadow.Effect_analysis
module Emit = Ocaml_shadow.Emit
module Emitaux = Ocaml_shadow.Emitaux
module Emitcode = Ocaml_shadow.Emitcode
module Env = Ocaml_shadow.Env
module Envaux = Ocaml_shadow.Envaux
module Errors = Ocaml_shadow.Errors
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 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 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 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 Mach = Ocaml_shadow.Mach
module Main = Ocaml_shadow.Main
module Main_args = Ocaml_shadow.Main_args
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 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 Persistent_env = Ocaml_shadow.Persistent_env
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 Reg_availability_set = Ocaml_shadow.Reg_availability_set
module Reg_with_debug_info = Ocaml_shadow.Reg_with_debug_info
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 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 Spacetime_profiling = Ocaml_shadow.Spacetime_profiling
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 Topdirs = Ocaml_shadow.Topdirs
module Toploop = Ocaml_shadow.Toploop
module Topmain = Ocaml_shadow.Topmain
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 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_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