package ppxlib

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

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 or Pprintast,
  • The whole AST types (by including the Ast 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.

module Pp_ast : sig ... end

This module implements pretty printers for the OCaml AST's version used by ppxlib.

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 gen_symbol : ?prefix:string -> unit -> string

gen_symbol ?prefix () generates a fresh variable name with prefix.

  • parameter prefix

    default = "_x"

val string_of_core_type : Astlib.Ast_500.Parsetree.core_type -> string
val assert_no_attributes : Astlib.Ast_500.Parsetree.attribute list -> unit
val assert_no_attributes_in : Ppxlib__.Ast_traverse0.iter
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

get_type_param_name_res tp returns the string identifier associated with tp if it is a type parameter, as a result.

See get_type_param_name_res. Raises a located error in case of failure.

(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.

really_recursive rec_flag tds = (new type_is_recursive rec_flag tds)#go ()

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
type position = Lexing.position = {
  1. pos_fname : string;
  2. pos_lnum : int;
  3. pos_bol : int;
  4. pos_cnum : int;
}
and location = Astlib.Location.t = {
  1. loc_start : position;
  2. loc_end : position;
  3. loc_ghost : bool;
}
and location_stack = location list
and 'a loc = 'a Astlib.Location.loc = {
  1. txt : 'a;
  2. loc : location;
}
and longident = Astlib.Longident.t =
  1. | Lident of string
  2. | Ldot of longident * string
  3. | Lapply of longident * longident
and longident_loc = longident loc

Auxiliary AST types used by parsetree and typedtree.

and rec_flag = Astlib.Ast_500.Asttypes.rec_flag =
  1. | Nonrecursive
  2. | Recursive
and direction_flag = Astlib.Ast_500.Asttypes.direction_flag =
  1. | Upto
  2. | Downto
and private_flag = Astlib.Ast_500.Asttypes.private_flag =
  1. | Private
  2. | Public
and mutable_flag = Astlib.Ast_500.Asttypes.mutable_flag =
  1. | Immutable
  2. | Mutable
and virtual_flag = Astlib.Ast_500.Asttypes.virtual_flag =
  1. | Virtual
  2. | Concrete
and override_flag = Astlib.Ast_500.Asttypes.override_flag =
  1. | Override
  2. | Fresh
and closed_flag = Astlib.Ast_500.Asttypes.closed_flag =
  1. | Closed
  2. | Open
and label = string
and arg_label = Astlib.Ast_500.Asttypes.arg_label =
  1. | Nolabel
  2. | Labelled of string
    (*

    label:T -> ...

    *)
  3. | Optional of string
    (*

    ?label:T -> ...

    *)
and variance = Astlib.Ast_500.Asttypes.variance =
  1. | Covariant
  2. | Contravariant
  3. | NoVariance
and injectivity = Astlib.Ast_500.Asttypes.injectivity =
  1. | Injective
  2. | NoInjectivity

Abstract syntax tree produced by parsing

and constant = Astlib.Ast_500.Parsetree.constant =
  1. | 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

    *)
  2. | Pconst_char of char
    (*

    Character such as 'c'.

    *)
  3. | 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.

    *)
  4. | Pconst_float of string * char option
    (*

    Float constant such as 3.4, 2e5 or 1.4e-4.

    Suffixes g-zG-Z are accepted by the parser. Suffixes are rejected by the typechecker.

    *)

Extension points

and attribute = Astlib.Ast_500.Parsetree.attribute = {
  1. attr_name : string loc;
  2. attr_payload : payload;
  3. attr_loc : location;
}

Attributes such as [@id ARG] and [@@id ARG].

Metadata containers passed around within the AST. The compiler ignores unknown attributes.

and extension = string loc * payload

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 =
  1. | PStr of structure
  2. | PSig of signature
    (*

    : SIG in an attribute or an extension point

    *)
  3. | PTyp of core_type
    (*

    : T in an attribute or an extension point

    *)
  4. | 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 = {
  1. ptyp_desc : core_type_desc;
  2. ptyp_loc : location;
  3. ptyp_loc_stack : location_stack;
  4. ptyp_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and core_type_desc = Astlib.Ast_500.Parsetree.core_type_desc =
  1. | Ptyp_any
    (*

    _

    *)
  2. | Ptyp_var of string
    (*

    A type variable such as 'a

    *)
  3. | Ptyp_arrow of arg_label * core_type * core_type
    (*

    Ptyp_arrow(lbl, T1, T2) represents:

    *)
  4. | Ptyp_tuple of core_type list
    (*

    Ptyp_tuple([T1 ; ... ; Tn]) represents a product type T1 * ... * Tn.

    Invariant: n >= 2.

    *)
  5. | 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].
    *)
  6. | Ptyp_object of object_field list * closed_flag
    (*

    Ptyp_object([ l1:T1; ...; ln:Tn ], flag) represents:

    • < l1:T1; ...; ln:Tn > when flag is Closed,
    • < l1:T1; ...; ln:Tn; .. > when flag is Open.
    *)
  7. | 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].
    *)
  8. | Ptyp_alias of core_type * string
    (*

    T as 'a.

    *)
  9. | Ptyp_variant of row_field list * closed_flag * label list option
    (*

    Ptyp_variant([`A;`B], flag, labels) represents:

    • [ `A|`B ] when flag is Closed, and labels is None,
    • [> `A|`B ] when flag is Open, and labels is None,
    • [< `A|`B ] when flag is Closed, and labels is Some [],
    • [< `A|`B > `X `Y ] when flag is Closed, and labels is Some ["X";"Y"].
    *)
  10. | Ptyp_poly of string loc list * core_type
    (*

    'a1 ... 'an. T

    Can only appear in the following context:

    let x : 'a1 ... 'an. T = e ...
    *)
  11. | Ptyp_package of package_type
    (*

    (module S).

    *)
  12. | 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 = {
  1. prf_desc : row_field_desc;
  2. prf_loc : location;
  3. prf_attributes : attributes;
}
and row_field_desc = Astlib.Ast_500.Parsetree.row_field_desc =
  1. | 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].
    • 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)
    *)
  2. | Rinherit of core_type
    (*

    [ | t ]

    *)
and object_field = Astlib.Ast_500.Parsetree.object_field = {
  1. pof_desc : object_field_desc;
  2. pof_loc : location;
  3. pof_attributes : attributes;
}
and object_field_desc = Astlib.Ast_500.Parsetree.object_field_desc =
  1. | Otag of label loc * core_type
  2. | Oinherit of core_type

Patterns

and pattern = Astlib.Ast_500.Parsetree.pattern = {
  1. ppat_desc : pattern_desc;
  2. ppat_loc : location;
  3. ppat_loc_stack : location_stack;
  4. ppat_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and pattern_desc = Astlib.Ast_500.Parsetree.pattern_desc =
  1. | Ppat_any
    (*

    The pattern _.

    *)
  2. | Ppat_var of string loc
    (*

    A variable pattern such as x

    *)
  3. | Ppat_alias of pattern * string loc
    (*

    An alias pattern such as P as 'a

    *)
  4. | Ppat_constant of constant
    (*

    Patterns such as 1, 'a', "true", 1.0, 1l, 1L, 1n

    *)
  5. | 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.

    *)
  6. | Ppat_tuple of pattern list
    (*

    Patterns (P1, ..., Pn).

    Invariant: n >= 2

    *)
  7. | 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)
    *)
  8. | Ppat_variant of label * pattern option
    (*

    Ppat_variant(`A, pat) represents:

    • `A when pat is None,
    • `A P when pat is Some P
    *)
  9. | Ppat_record of (longident_loc * pattern) list * closed_flag
    (*

    Ppat_record([(l1, P1) ; ... ; (ln, Pn)], flag) represents:

    • { l1=P1; ...; ln=Pn } when flag is Closed
    • { l1=P1; ...; ln=Pn; _} when flag is Open

    Invariant: n > 0

    *)
  10. | Ppat_array of pattern list
    (*

    Pattern [| P1; ...; Pn |]

    *)
  11. | Ppat_or of pattern * pattern
    (*

    Pattern P1 | P2

    *)
  12. | Ppat_constraint of pattern * core_type
    (*

    Pattern (P : T)

    *)
  13. | Ppat_type of longident_loc
    (*

    Pattern #tconst

    *)
  14. | Ppat_lazy of pattern
    (*

    Pattern lazy P

    *)
  15. | 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)

    *)
  16. | Ppat_exception of pattern
    (*

    Pattern exception P

    *)
  17. | Ppat_extension of extension
    (*

    Pattern [%id]

    *)
  18. | Ppat_open of longident_loc * pattern
    (*

    Pattern M.(P)

    *)

Value expressions

and expression = Astlib.Ast_500.Parsetree.expression = {
  1. pexp_desc : expression_desc;
  2. pexp_loc : location;
  3. pexp_loc_stack : location_stack;
  4. pexp_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and expression_desc = Astlib.Ast_500.Parsetree.expression_desc =
  1. | Pexp_ident of longident_loc
    (*

    Identifiers such as x and M.x

    *)
  2. | Pexp_constant of constant
    (*

    Expressions constant such as 1, 'a', "true", 1.0, 1l, 1L, 1n

    *)
  3. | 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.
    *)
  4. | Pexp_function of cases
    (*

    function P1 -> E1 | ... | Pn -> En

    *)
  5. | 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:

    • If 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.
    *)
  6. | Pexp_apply of expression * (arg_label * expression) list
    (*

    Pexp_apply(E0, [(l1, E1) ; ... ; (ln, En)]) represents E0 ~l1:E1 ... ~ln:En

    li can be Nolabel (non labeled argument), Labelled (labelled arguments) or Optional (optional argument).

    Invariant: n > 0

    *)
  7. | Pexp_match of expression * cases
    (*

    match E0 with P1 -> E1 | ... | Pn -> En

    *)
  8. | Pexp_try of expression * cases
    (*

    try E0 with P1 -> E1 | ... | Pn -> En

    *)
  9. | Pexp_tuple of expression list
    (*

    Expressions (E1, ..., En)

    Invariant: n >= 2

    *)
  10. | 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])
    *)
  11. | Pexp_variant of label * expression option
    (*

    Pexp_variant(`A, exp) represents

    • `A when exp is None
    • `A E when exp is Some E
    *)
  12. | 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

    *)
  13. | Pexp_field of expression * longident_loc
    (*

    E.l

    *)
  14. | Pexp_setfield of expression * longident_loc * expression
    (*

    E1.l <- E2

    *)
  15. | Pexp_array of expression list
    (*

    [| E1; ...; En |]

    *)
  16. | Pexp_ifthenelse of expression * expression * expression option
    (*

    if E1 then E2 else E3

    *)
  17. | Pexp_sequence of expression * expression
    (*

    E1; E2

    *)
  18. | Pexp_while of expression * expression
    (*

    while E1 do E2 done

    *)
  19. | Pexp_for of pattern * expression * expression * direction_flag * expression
    (*

    Pexp_for(i, E1, E2, direction, E3) represents:

    • for i = E1 to E2 do E3 done when direction is Upto
    • for i = E1 downto E2 do E3 done when direction is Downto
    *)
  20. | Pexp_constraint of expression * core_type
    (*

    (E : T)

    *)
  21. | 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.
    *)
  22. | Pexp_send of expression * label loc
    (*

    E # m

    *)
  23. | Pexp_new of longident_loc
    (*

    new M.c

    *)
  24. | Pexp_setinstvar of label loc * expression
    (*

    x <- 2

    *)
  25. | Pexp_override of (label loc * expression) list
    (*

    {< x1 = E1; ...; xn = En >}

    *)
  26. | Pexp_letmodule of string option loc * module_expr * expression
    (*

    let module M = ME in E

    *)
  27. | Pexp_letexception of extension_constructor * expression
    (*

    let exception C in E

    *)
  28. | Pexp_assert of expression
    (*

    assert E.

    Note: assert false is treated in a special way by the type-checker.

    *)
  29. | Pexp_lazy of expression
    (*

    lazy E

    *)
  30. | 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).

    *)
  31. | Pexp_object of class_structure
    (*

    object ... end

    *)
  32. | Pexp_newtype of string loc * expression
    (*

    fun (type t) -> E

    *)
  33. | Pexp_pack of module_expr
    (*

    (module ME).

    (module ME : S) is represented as Pexp_constraint(Pexp_pack ME, Ptyp_package S)

    *)
  34. | Pexp_open of open_declaration * expression
    (*
    • M.(E)
    • let open M in E
    • let open! M in E
    *)
  35. | Pexp_letop of letop
    (*
    • let* P = E0 in E1
    • let* P0 = E00 and* P1 = E01 in E1
    *)
  36. | Pexp_extension of extension
    (*

    [%id]

    *)
  37. | Pexp_unreachable
    (*

    .

    *)
and case = Astlib.Ast_500.Parsetree.case = {
  1. pc_lhs : pattern;
  2. pc_guard : expression option;
  3. pc_rhs : expression;
}

Values of type case represents (P -> E) or (P when E0 -> E)

and letop = Astlib.Ast_500.Parsetree.letop = {
  1. let_ : binding_op;
  2. ands : binding_op list;
  3. body : expression;
}
and binding_op = Astlib.Ast_500.Parsetree.binding_op = {
  1. pbop_op : string loc;
  2. pbop_pat : pattern;
  3. pbop_exp : expression;
  4. pbop_loc : location;
}

Value descriptions

and value_description = Astlib.Ast_500.Parsetree.value_description = {
  1. pval_name : string loc;
  2. pval_type : core_type;
  3. pval_prim : string list;
  4. pval_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
  5. pval_loc : location;
}

Values of type value_description represents:

  • val x: T, when pval_prim is []
  • external x: T = "s1" ... "sn" when pval_prim is ["s1";..."sn"]

Type declarations

and type_declaration = Astlib.Ast_500.Parsetree.type_declaration = {
  1. ptype_name : string loc;
  2. ptype_params : (core_type * (variance * injectivity)) list;
    (*

    ('a1,...'an) t

    *)
  3. ptype_cstrs : (core_type * core_type * location) list;
    (*

    ... constraint T1=T1' ... constraint Tn=Tn'

    *)
  4. ptype_kind : type_kind;
  5. ptype_private : private_flag;
    (*

    for = private ...

    *)
  6. ptype_manifest : core_type option;
    (*

    represents = T

    *)
  7. ptype_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
  8. 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 =
  1. | Ptype_abstract
  2. | Ptype_variant of constructor_declaration list
  3. | Ptype_record of label_declaration list
    (*

    Invariant: non-empty list

    *)
  4. | Ptype_open
and label_declaration = Astlib.Ast_500.Parsetree.label_declaration = {
  1. pld_name : string loc;
  2. pld_mutable : mutable_flag;
  3. pld_type : core_type;
  4. pld_loc : location;
  5. pld_attributes : attributes;
    (*

    l : T [@id1] [@id2]

    *)
}

Note: T can be a Ptyp_poly.

and constructor_declaration = Astlib.Ast_500.Parsetree.constructor_declaration = {
  1. pcd_name : string loc;
  2. pcd_vars : string loc list;
  3. pcd_args : constructor_arguments;
  4. pcd_res : core_type option;
  5. pcd_loc : location;
  6. pcd_attributes : attributes;
    (*

    C of ... [@id1] [@id2]

    *)
}
and constructor_arguments = Astlib.Ast_500.Parsetree.constructor_arguments =
  1. | Pcstr_tuple of core_type list
  2. | 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 = {
  1. ptyext_path : longident_loc;
  2. ptyext_params : (core_type * (variance * injectivity)) list;
  3. ptyext_constructors : extension_constructor list;
  4. ptyext_private : private_flag;
  5. ptyext_loc : location;
  6. 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 = {
  1. pext_name : string loc;
  2. pext_kind : extension_constructor_kind;
  3. pext_loc : location;
  4. pext_attributes : attributes;
    (*

    C of ... [@id1] [@id2]

    *)
}
and type_exception = Astlib.Ast_500.Parsetree.type_exception = {
  1. ptyexn_constructor : extension_constructor;
  2. ptyexn_loc : location;
  3. ptyexn_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
}

Definition of a new exception (exception E).

and extension_constructor_kind = Astlib.Ast_500.Parsetree.extension_constructor_kind =
  1. | 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.
    *)
  2. | Pext_rebind of longident_loc
    (*

    Pext_rebind(D) re-export the constructor D with the new name C

    *)

Class language

Type expressions for the class language

and class_type = Astlib.Ast_500.Parsetree.class_type = {
  1. pcty_desc : class_type_desc;
  2. pcty_loc : location;
  3. pcty_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and class_type_desc = Astlib.Ast_500.Parsetree.class_type_desc =
  1. | Pcty_constr of longident_loc * core_type list
    (*
    • c
    • ['a1, ..., 'an] c
    *)
  2. | Pcty_signature of class_signature
    (*

    object ... end

    *)
  3. | Pcty_arrow of arg_label * core_type * class_type
    (*

    Pcty_arrow(lbl, T, CT) represents:

    *)
  4. | Pcty_extension of extension
    (*

    %id

    *)
  5. | Pcty_open of open_description * class_type
    (*

    let open M in CT

    *)
and class_signature = Astlib.Ast_500.Parsetree.class_signature = {
  1. pcsig_self : core_type;
  2. pcsig_fields : class_type_field list;
}

Values of type class_signature represents:

and class_type_field = Astlib.Ast_500.Parsetree.class_type_field = {
  1. pctf_desc : class_type_field_desc;
  2. pctf_loc : location;
  3. pctf_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
}
and class_type_field_desc = Astlib.Ast_500.Parsetree.class_type_field_desc =
  1. | Pctf_inherit of class_type
    (*

    inherit CT

    *)
  2. | Pctf_val of label loc * mutable_flag * virtual_flag * core_type
    (*

    val x: T

    *)
  3. | Pctf_method of label loc * private_flag * virtual_flag * core_type
    (*

    method x: T

    Note: T can be a Ptyp_poly.

    *)
  4. | Pctf_constraint of core_type * core_type
    (*

    constraint T1 = T2

    *)
  5. | Pctf_attribute of attribute
    (*

    [@@@id]

    *)
  6. | Pctf_extension of extension
    (*

    [%%id]

    *)
and 'a class_infos = 'a Astlib.Ast_500.Parsetree.class_infos = {
  1. pci_virt : virtual_flag;
  2. pci_params : (core_type * (variance * injectivity)) list;
  3. pci_name : string loc;
  4. pci_expr : 'a;
  5. pci_loc : location;
  6. 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 = {
  1. pcl_desc : class_expr_desc;
  2. pcl_loc : location;
  3. pcl_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and class_expr_desc = Astlib.Ast_500.Parsetree.class_expr_desc =
  1. | Pcl_constr of longident_loc * core_type list
    (*

    c and ['a1, ..., 'an] c

    *)
  2. | Pcl_structure of class_structure
    (*

    object ... end

    *)
  3. | 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.
    *)
  4. | 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

    *)
  5. | 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.
    *)
  6. | Pcl_constraint of class_expr * class_type
    (*

    (CE : CT)

    *)
  7. | Pcl_extension of extension
    (*

    [%id]

    *)
  8. | Pcl_open of open_description * class_expr
    (*

    let open M in CE

    *)
and class_structure = Astlib.Ast_500.Parsetree.class_structure = {
  1. pcstr_self : pattern;
  2. pcstr_fields : class_field list;
}

Values of type class_structure represents:

and class_field = Astlib.Ast_500.Parsetree.class_field = {
  1. pcf_desc : class_field_desc;
  2. pcf_loc : location;
  3. pcf_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
}
and class_field_desc = Astlib.Ast_500.Parsetree.class_field_desc =
  1. | Pcf_inherit of override_flag * class_expr * string loc option
    (*

    Pcf_inherit(flag, CE, s) represents:

    • inherit CE when flag is Fresh and s is None,
    • inherit CE as x when flag is Fresh and s is Some x,
    • inherit! CE when flag is Override and s is None,
    • inherit! CE as x when flag is Override and s is Some x
    *)
  2. | Pcf_val of label loc * mutable_flag * class_field_kind
    (*

    Pcf_val(x,flag, kind) represents:

    *)
  3. | Pcf_method of label loc * private_flag * class_field_kind
    (**)
  4. | Pcf_constraint of core_type * core_type
    (*

    constraint T1 = T2

    *)
  5. | Pcf_initializer of expression
    (*

    initializer E

    *)
  6. | Pcf_attribute of attribute
    (*

    [@@@id]

    *)
  7. | Pcf_extension of extension
    (*

    [%%id]

    *)
and class_field_kind = Astlib.Ast_500.Parsetree.class_field_kind =
  1. | Cfk_virtual of core_type
  2. | 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 = {
  1. pmty_desc : module_type_desc;
  2. pmty_loc : location;
  3. pmty_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and module_type_desc = Astlib.Ast_500.Parsetree.module_type_desc =
  1. | Pmty_ident of longident_loc
    (*

    Pmty_ident(S) represents S

    *)
  2. | Pmty_signature of signature
    (*

    sig ... end

    *)
  3. | Pmty_functor of functor_parameter * module_type
    (*

    functor(X : MT1) -> MT2

    *)
  4. | Pmty_with of module_type * with_constraint list
    (*

    MT with ...

    *)
  5. | Pmty_typeof of module_expr
    (*

    module type of ME

    *)
  6. | Pmty_extension of extension
    (*

    [%id]

    *)
  7. | Pmty_alias of longident_loc
    (*

    (module M)

    *)
and functor_parameter = Astlib.Ast_500.Parsetree.functor_parameter =
  1. | Unit
    (*

    ()

    *)
  2. | 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 = {
  1. psig_desc : signature_item_desc;
  2. psig_loc : location;
}
and signature_item_desc = Astlib.Ast_500.Parsetree.signature_item_desc =
  1. | Psig_value of value_description
    (*
    • val x: T
    • external x: T = "s1" ... "sn"
    *)
  2. | Psig_type of rec_flag * type_declaration list
    (*

    type t1 = ... and ... and tn = ...

    *)
  3. | Psig_typesubst of type_declaration list
    (*

    type t1 := ... and ... and tn := ...

    *)
  4. | Psig_typext of type_extension
    (*

    type t1 += ...

    *)
  5. | Psig_exception of type_exception
    (*

    exception C of T

    *)
  6. | Psig_module of module_declaration
    (*

    module X = M and module X : MT

    *)
  7. | Psig_modsubst of module_substitution
    (*

    module X := M

    *)
  8. | Psig_recmodule of module_declaration list
    (*

    module rec X1 : MT1 and ... and Xn : MTn

    *)
  9. | Psig_modtype of module_type_declaration
    (*

    module type S = MT and module type S

    *)
  10. | Psig_modtypesubst of module_type_declaration
    (*

    module type S := ...

    *)
  11. | Psig_open of open_description
    (*

    open X

    *)
  12. | Psig_include of include_description
    (*

    include MT

    *)
  13. | Psig_class of class_description list
    (*

    class c1 : ... and ... and cn : ...

    *)
  14. | Psig_class_type of class_type_declaration list
    (*

    class type ct1 = ... and ... and ctn = ...

    *)
  15. | Psig_attribute of attribute
    (*

    [@@@id]

    *)
  16. | Psig_extension of extension * attributes
    (*

    [%%id]

    *)
and module_declaration = Astlib.Ast_500.Parsetree.module_declaration = {
  1. pmd_name : string option loc;
  2. pmd_type : module_type;
  3. pmd_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
  4. pmd_loc : location;
}

Values of type module_declaration represents S : MT

and module_substitution = Astlib.Ast_500.Parsetree.module_substitution = {
  1. pms_name : string loc;
  2. pms_manifest : longident_loc;
  3. pms_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
  4. pms_loc : location;
}

Values of type module_substitution represents S := M

and module_type_declaration = Astlib.Ast_500.Parsetree.module_type_declaration = {
  1. pmtd_name : string loc;
  2. pmtd_type : module_type option;
  3. pmtd_attributes : attributes;
    (*

    ... [@@id1] [@@id2]

    *)
  4. 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 = {
  1. popen_expr : 'a;
  2. popen_override : override_flag;
  3. popen_loc : location;
  4. popen_attributes : attributes;
}

Values of type 'a open_infos represents:

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 = {
  1. pincl_mod : 'a;
  2. pincl_loc : location;
  3. 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 =
  1. | 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.

    *)
  2. | Pwith_module of longident_loc * longident_loc
    (*

    with module X.Y = Z

    *)
  3. | Pwith_modtype of longident_loc * module_type
    (*

    with module type X.Y = Z

    *)
  4. | Pwith_modtypesubst of longident_loc * module_type
    (*

    with module type X.Y := sig end

    *)
  5. | Pwith_typesubst of longident_loc * type_declaration
    (*

    with type X.t := ..., same format as [Pwith_type]

    *)
  6. | 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 = {
  1. pmod_desc : module_expr_desc;
  2. pmod_loc : location;
  3. pmod_attributes : attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and module_expr_desc = Astlib.Ast_500.Parsetree.module_expr_desc =
  1. | Pmod_ident of longident_loc
    (*

    X

    *)
  2. | Pmod_structure of structure
    (*

    struct ... end

    *)
  3. | Pmod_functor of functor_parameter * module_expr
    (*

    functor(X : MT1) -> ME

    *)
  4. | Pmod_apply of module_expr * module_expr
    (*

    ME1(ME2)

    *)
  5. | Pmod_constraint of module_expr * module_type
    (*

    (ME : MT)

    *)
  6. | Pmod_unpack of expression
    (*

    (val E)

    *)
  7. | Pmod_extension of extension
    (*

    [%id]

    *)
and structure = structure_item list
and structure_item = Astlib.Ast_500.Parsetree.structure_item = {
  1. pstr_desc : structure_item_desc;
  2. pstr_loc : location;
}
and structure_item_desc = Astlib.Ast_500.Parsetree.structure_item_desc =
  1. | Pstr_eval of expression * attributes
    (*

    E

    *)
  2. | 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.
    *)
  3. | Pstr_primitive of value_description
    (*
    • val x: T
    • external x: T = "s1" ... "sn"
    *)
  4. | Pstr_type of rec_flag * type_declaration list
    (*

    type t1 = ... and ... and tn = ...

    *)
  5. | Pstr_typext of type_extension
    (*

    type t1 += ...

    *)
  6. | Pstr_exception of type_exception
    (*
    • exception C of T
    • exception C = M.X
    *)
  7. | Pstr_module of module_binding
    (*

    module X = ME

    *)
  8. | Pstr_recmodule of module_binding list
    (*

    module rec X1 = ME1 and ... and Xn = MEn

    *)
  9. | Pstr_modtype of module_type_declaration
    (*

    module type S = MT

    *)
  10. | Pstr_open of open_declaration
    (*

    open X

    *)
  11. | Pstr_class of class_declaration list
    (*

    class c1 = ... and ... and cn = ...

    *)
  12. | Pstr_class_type of class_type_declaration list
    (*

    class type ct1 = ... and ... and ctn = ...

    *)
  13. | Pstr_include of include_declaration
    (*

    include ME

    *)
  14. | Pstr_attribute of attribute
    (*

    [@@@id]

    *)
  15. | Pstr_extension of extension * attributes
    (*

    [%%id]

    *)
and value_binding = Astlib.Ast_500.Parsetree.value_binding = {
  1. pvb_pat : pattern;
  2. pvb_expr : expression;
  3. pvb_attributes : attributes;
  4. pvb_loc : location;
}
and module_binding = Astlib.Ast_500.Parsetree.module_binding = {
  1. pmb_name : string option loc;
  2. pmb_expr : module_expr;
  3. pmb_attributes : attributes;
  4. pmb_loc : location;
}

Values of type module_binding represents module X = ME

Toplevel

Toplevel phrases

and toplevel_phrase = Astlib.Ast_500.Parsetree.toplevel_phrase =
  1. | Ptop_def of structure
  2. | Ptop_dir of toplevel_directive
    (*

    #use, #load ...

    *)
and toplevel_directive = Astlib.Ast_500.Parsetree.toplevel_directive = {
  1. pdir_name : string loc;
  2. pdir_arg : directive_argument option;
  3. pdir_loc : location;
}
and directive_argument = Astlib.Ast_500.Parsetree.directive_argument = {
  1. pdira_desc : directive_argument_desc;
  2. pdira_loc : location;
}
and directive_argument_desc = Astlib.Ast_500.Parsetree.directive_argument_desc =
  1. | Pdir_string of string
  2. | Pdir_int of string * char option
  3. | Pdir_ident of longident
  4. | 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 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 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 Share_constants = Ocaml_shadow.Share_constants
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
OCaml

Innovation. Community. Security.