jon.recoil.org

Module PpxlibSource

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 core ppxlib entries

Manipulating the AST

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

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

Sourcemodule Ast_traverse : sig ... end

This module provides AST traversal classes, such as maps, iterations, folds, etc. on the Parsetree types.

Context-free rewriting

Sourcemodule Context_free : sig ... end

Context free rewriting, to define local rewriting rules that will all be applied at once by the driver.

Sourcemodule Deriving : sig ... end

Deriving code from type declarations.

Sourcemodule Extension : sig ... end

Declare extenders to rewrite extension nodes.

Sourcemodule Expansion_context : sig ... end

The context given to rewriting rules when expanding.

Sourcemodule Code_path : sig ... end

This module contains type and functions for representing and manipulating path to AST nodes.

Other helpers

Sourcemodule Expansion_helpers : sig ... end

Various helpers for expansion, such as quoting expressions in their context, or mangling names.

Sourcemodule Merlin_helpers : sig ... end

Some helpers to annotate the AST so merlin can decide which branches to look at and which branches to ignore.

Sourcemodule Spellcheck : sig ... end

Helpers to provide hints to PPX users for typos or spellchecks.

Sourcemodule Keyword : sig ... end

Small module to check if a string is an OCaml keyword.

Sourcemodule Driver : sig ... end

Interaction with the driver, such as getting/seeting cookies, adding arguments.

Sourcemodule Caller_id : sig ... end

Small helper to find out who is the caller of a function

Sourcemodule Ast_io : sig ... end

A small module to help read bin-annots generated files.

Checks

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

Sourcemodule Reserved_namespaces : sig ... end

Small module to reserve namespaces in attribute names.

Common helper functions

Sourceval lident : string -> Ppxlib.Longident.t
Sourceval gen_symbol : ?prefix:string -> unit -> string

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

  • parameter prefix

    default = "_x"

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

Sourceval attribute_of_warning : Ppxlib.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.

Sourceval is_polymorphic_variant : Astlib.Ast_500.Parsetree.type_declaration -> sig_:bool -> [> `Definitely | `Maybe | `Surely_not ]
Sourceval mk_named_sig : loc:Ppxlib.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.

Sourcemodule With_errors : sig ... end
Sourceval valid_string_constant_delimiter : string -> string

valid_string_constant_delimiter x finds a delimiter y such that Pconst_string (x, loc, Some y) is valid.

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
Sourcemodule Pprintast = Ppxlib_ast.Pprintast
module Selected_ast = Ppxlib_ast.Selected_ast
Sourcemodule Location : sig ... end

Overrides the Location module of OCaml

Sourcemodule Longident : sig ... end

Overrides the Longident module of OCaml

Sourcemodule 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 = Stdlib.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 : Ppxlib.position;
  2. loc_end : Ppxlib.position;
  3. loc_ghost : bool;
}
and location_stack = Ppxlib.location list
and modality = Astlib.Ast_500.Parsetree.modality =
  1. | Modality of string
and modalities = Ppxlib.modality Ppxlib.loc list
and mode = Astlib.Ast_500.Parsetree.mode =
  1. | Mode of string
and modes = Ppxlib.mode Ppxlib.loc list
and include_kind = Astlib.Ast_500.Parsetree.include_kind =
  1. | Structure
  2. | Functor
and 'a loc = 'a Astlib.Location.loc = {
  1. txt : 'a;
  2. loc : Ppxlib.location;
}
and longident = Astlib.Longident.t =
  1. | Lident of string
  2. | Ldot of Ppxlib.longident * string
  3. | Lapply of Ppxlib.longident * Ppxlib.longident
and longident_loc = Ppxlib.longident Ppxlib.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
and index_kind = Astlib.Ast_500.Asttypes.index_kind =
  1. | Index_int
  2. | Index_unboxed_int64
  3. | Index_unboxed_int32
  4. | Index_unboxed_int16
  5. | Index_unboxed_int8
  6. | Index_unboxed_nativeint

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_unboxed_integer of string * char
    (*

    Integer constants such as #3 #3l #3L #3n.

    A suffix [g-z][G-Z] is required by the parser. Suffixes except 'l', 'L' and 'n' are rejected by the typechecker

    *)
  3. | Pconst_char of char
    (*

    Character such as 'c'.

    *)
  4. | Pconst_untagged_char of char
    (*

    Untagged character such as #'c'.

    *)
  5. | Pconst_string of string * Ppxlib.location * string option
    (*

    Constant string such as "constant" or {delim|other constant|delim}.

    The location span the content of the string, without the delimiters.

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

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

    Suffixes [g-z][G-Z] are accepted by the parser. Suffixes are rejected by the typechecker.

    *)
  7. | Pconst_unboxed_float of string * char option
    (*

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

    Suffixes [g-z][G-Z] are accepted by the parser. Suffixes except 's' are rejected by the typechecker.

    *)

Extension points

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

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

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

and extension = string Ppxlib.loc * Ppxlib.payload

Extension points such as [%id ARG] and [%%id ARG].

Sub-language placeholder -- rejected by the typechecker.

and attributes = Ppxlib.attribute list
and payload = Astlib.Ast_500.Parsetree.payload =
  1. | PStr of Ppxlib.structure
  2. | PSig of Ppxlib.signature
    (*

    : SIG in an attribute or an extension point

    *)
  3. | PTyp of Ppxlib.core_type
    (*

    : T in an attribute or an extension point

    *)
  4. | PPat of Ppxlib.pattern * Ppxlib.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 : Ppxlib.core_type_desc;
  2. ptyp_loc : Ppxlib.location;
  3. ptyp_loc_stack : Ppxlib.location_stack;
  4. ptyp_attributes : Ppxlib.attributes;
    (*

    ... [@id1] [@id2]

    *)
}
and core_type_desc = Astlib.Ast_500.Parsetree.core_type_desc =
  1. | Ptyp_any of Ppxlib.jkind_annotation option
    (*

    _ or _ : k

    *)
  2. | Ptyp_var of string * Ppxlib.jkind_annotation option
    (*

    A type variable such as 'a or 'a : k

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

    Ptyp_arrow(lbl, T1, T2, M1, M2) represents:

    • T1 @ M1 -> T2 @ M2 when lbl is Nolabel,
    • ~l:(T1 @ M1) -> T2 @ M2 when lbl is Labelled,
    • ?l:(T1 @ M1) -> T2 @ M2 when lbl is Optional.
    *)
  4. | Ptyp_tuple of (string option * Ppxlib.core_type) list
    (*

    Ptyp_tuple(tl) represents a product type:

    • T1 * ... * Tn when tl is (None,T1);...;(None,Tn)
    • L1:T1 * ... * Ln:Tn when tl is (Some L1,T1);...;(Some Ln,Tn)
    • A mix, e.g. L1:T1 * T2 when tl is (Some L1,T1);(None,T2)

    Invariant: n >= 2.

    *)
  5. | Ptyp_unboxed_tuple of (string option * Ppxlib.core_type) list
    (*

    Unboxed tuple types: Ptyp_unboxed_tuple([(Some l1,P1);...;(Some l2,Pn)] represents a product type #(l1:T1 * ... * l2:Tn), and the labels are optional.

    Invariant: n >= 2.

    *)
  6. | Ptyp_constr of Ppxlib.longident_loc * Ppxlib.core_type list
    (*

    Ptyp_constr(lident, l) represents:

    • tconstr when l=[],
    • T tconstr when l=[T],
    • (T1, ..., Tn) tconstr when l=[T1 ; ... ; Tn].
    *)
  7. | Ptyp_object of Ppxlib.object_field list * Ppxlib.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.
    *)
  8. | Ptyp_class of Ppxlib.longident_loc * Ppxlib.core_type list
    (*

    Ptyp_class(tconstr, l) represents:

    • #tconstr when l=[],
    • T #tconstr when l=[T],
    • (T1, ..., Tn) #tconstr when l=[T1 ; ... ; Tn].
    *)
  9. | Ptyp_alias of Ppxlib.core_type * string Ppxlib.loc option * Ppxlib.jkind_annotation option
    (*

    T as 'a or T as ('a : k) or T as (_ : k).

    Invariant: the name or jkind annotation is non-None.

    *)
  10. | Ptyp_variant of Ppxlib.row_field list * Ppxlib.closed_flag * Ppxlib.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"].
    *)
  11. | Ptyp_poly of (string Ppxlib.loc * Ppxlib.jkind_annotation option) list * Ppxlib.core_type
    (*

    'a1 ... 'an. T ('a1 : k1) ... ('an : kn). T

    Can only appear in the following context:

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

    (module S).

    *)
  13. | Ptyp_quote of Ppxlib.core_type
    (*

    <[T]>

    *)
  14. | Ptyp_splice of Ppxlib.core_type
    (*

    $T

    *)
  15. | Ptyp_of_kind of Ppxlib.jkind_annotation
    (*

    (type : k)

    *)
  16. | Ptyp_extension of Ppxlib.extension
    (*

    [%id].

    *)

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 : Ppxlib.row_field_desc;
  2. prf_loc : Ppxlib.location;
  3. prf_attributes : Ppxlib.attributes;
}
and row_field_desc = Astlib.Ast_500.Parsetree.row_field_desc =
  1. | Rtag of Ppxlib.label Ppxlib.loc * bool * Ppxlib.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 Ppxlib.core_type
    (*

    [ | t ]

    *)
and object_field = Astlib.Ast_500.Parsetree.object_field = {
  1. pof_desc : Ppxlib.object_field_desc;
  2. pof_loc : Ppxlib.location;
  3. pof_attributes : Ppxlib.attributes;
}

Patterns

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

    ... [@id1] [@id2]

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

    The pattern _.

    *)
  2. | Ppat_var of string Ppxlib.loc
    (*

    A variable pattern such as x

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

    An alias pattern such as P as 'a

    *)
  4. | Ppat_constant of Ppxlib.constant
    (*

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

    *)
  5. | Ppat_interval of Ppxlib.constant * Ppxlib.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 (string option * Ppxlib.pattern) list * Ppxlib.closed_flag
    (*

    Ppat_tuple(pl, Closed) represents

    • (P1, ..., Pn) when pl is (None, P1);...;(None, Pn)
    • (~L1:P1, ..., ~Ln:Pn) when pl is (Some L1, P1);...;(Some Ln, Pn)
    • A mix, e.g. (~L1:P1, P2) when pl is (Some L1, P1);(None, P2)
    • If pattern is open, then it also ends in a ..

    Invariant:

    • If Closed, n >= 2.
    • If Open, n >= 1.
    *)
  7. | Ppat_unboxed_tuple of (string option * Ppxlib.pattern) list * Ppxlib.closed_flag
    (*

    Unboxed tuple patterns: #(l1:P1, ..., ln:Pn) is ([(Some l1,P1);...;(Some l2,Pn)], Closed), and the labels are optional. An Open pattern ends in ...

    Invariant:

    • If Closed, n >= 2
    • If Open, n >= 1
    *)
  8. | Ppat_construct of Ppxlib.longident_loc * ((string Ppxlib.loc * Ppxlib.jkind_annotation option) list * Ppxlib.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, None; b, None], P)
    • C (type (a : k) b) P when args is Some ([a, Some k; b, None], P)
    *)
  9. | Ppat_variant of Ppxlib.label * Ppxlib.pattern option
    (*

    Ppat_variant(`A, pat) represents:

    • `A when pat is None,
    • `A P when pat is Some P
    *)
  10. | Ppat_record of (Ppxlib.longident_loc * Ppxlib.pattern) list * Ppxlib.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

    *)
  11. | Ppat_record_unboxed_product of (Ppxlib.longident_loc * Ppxlib.pattern) list * Ppxlib.closed_flag
    (*

    Ppat_record_unboxed_product([(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

    *)
  12. | Ppat_array of Ppxlib.mutable_flag * Ppxlib.pattern list
    (*

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

    *)
  13. | Ppat_or of Ppxlib.pattern * Ppxlib.pattern
    (*

    Pattern P1 | P2

    *)
  14. | Ppat_constraint of Ppxlib.pattern * Ppxlib.core_type option * Ppxlib.modes
    (*

    Ppat_constraint(tyopt, modes) represents:

    • (P : ty @@ modes) when tyopt is Some ty
    • (P @ modes) when tyopt is None
    *)
  15. | Ppat_type of Ppxlib.longident_loc
    (*

    Pattern #tconst

    *)
  16. | Ppat_lazy of Ppxlib.pattern
    (*

    Pattern lazy P

    *)
  17. | Ppat_unpack of string option Ppxlib.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)

    *)
  18. | Ppat_exception of Ppxlib.pattern
    (*

    Pattern exception P

    *)
  19. | Ppat_extension of Ppxlib.extension
    (*

    Pattern [%id]

    *)
  20. | Ppat_open of Ppxlib.longident_loc * Ppxlib.pattern
    (*

    Pattern M.(P)

    *)

Value expressions

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

    ... [@id1] [@id2]

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

    Identifiers such as x and M.x

    *)
  2. | Pexp_constant of Ppxlib.constant
    (*

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

    *)
  3. | Pexp_let of Ppxlib.mutable_flag * Ppxlib.rec_flag * Ppxlib.value_binding list * Ppxlib.expression
    (*

    Pexp_let(mut, rec, [(P1,E1) ; ... ; (Pn,En)], E) represents:

    • let P1 = E1 and ... and Pn = EN in E when rec is Nonrecursive and mut = Immutable.
    • let rec P1 = E1 and ... and Pn = EN in E when rec is Recursive and mut = Immutable.
    • let mutable P1 = E1 in E when rec is Nonrecursive and mut = Mutable. Invariant: If mut = Mutable then n = 1 and rec = Nonrecursive
    *)
  4. | Pexp_function of Ppxlib.function_param list * Ppxlib.function_constraint * Ppxlib.function_body
    (*

    Pexp_function ([P1; ...; Pn], C, body) represents any construct involving fun or function, including:

    • fun P1 ... Pn -> E when body = Pfunction_body E
    • fun P1 ... Pn -> function p1 -> e1 | ... | pm -> em when body = Pfunction_cases [ p1 -> e1; ...; pm -> em ]

    C represents a type constraint or coercion placed immediately before the arrow, e.g. fun P1 ... Pn : ty -> ... when C = Some (Pconstraint ty).

    A function must have parameters. Pexp_function (params, _, body) must have non-empty params or a Pfunction_cases _ body.

    *)
  5. | Pexp_apply of Ppxlib.expression * (Ppxlib.arg_label * Ppxlib.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

    *)
  6. | Pexp_match of Ppxlib.expression * Ppxlib.cases
    (*

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

    *)
  7. | Pexp_try of Ppxlib.expression * Ppxlib.cases
    (*

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

    *)
  8. | Pexp_tuple of (string option * Ppxlib.expression) list
    (*

    Pexp_tuple(el) represents

    • (E1, ..., En) when el is (None, E1);...;(None, En)
    • (~L1:E1, ..., ~Ln:En) when el is (Some L1, E1);...;(Some Ln, En)
    • A mix, e.g.: (~L1:E1, E2) when el is (Some L1, E1); (None, E2)

    Invariant: n >= 2

    *)
  9. | Pexp_unboxed_tuple of (string option * Ppxlib.expression) list
    (*

    Unboxed tuple expressions: Pexp_unboxed_tuple([(Some l1,P1);...;(Some l2,Pn)]) represents #(l1:E1, ..., ln:En), and the labels are optional.

    Invariant: n >= 2

    *)
  10. | Pexp_construct of Ppxlib.longident_loc * Ppxlib.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 Ppxlib.label * Ppxlib.expression option
    (*

    Pexp_variant(`A, exp) represents

    • `A when exp is None
    • `A E when exp is Some E
    *)
  12. | Pexp_record of (Ppxlib.longident_loc * Ppxlib.expression) list * Ppxlib.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_record_unboxed_product of (Ppxlib.longident_loc * Ppxlib.expression) list * Ppxlib.expression option
    (*

    Pexp_record_unboxed_product([(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

    *)
  14. | Pexp_field of Ppxlib.expression * Ppxlib.longident_loc
    (*

    E.l

    *)
  15. | Pexp_unboxed_field of Ppxlib.expression * Ppxlib.longident_loc
    (*

    E.#l

    *)
  16. | Pexp_setfield of Ppxlib.expression * Ppxlib.longident_loc * Ppxlib.expression
    (*

    E1.l <- E2

    *)
  17. | Pexp_array of Ppxlib.mutable_flag * Ppxlib.expression list
    (*

    [| E1; ...; En |] or [: E1; ...; En :]

    *)
  18. | Pexp_idx of Ppxlib.block_access * Ppxlib.unboxed_access list
    (*

    (BA1 UA1 UA2 ...) e.g. (.foo.#bar.#baz) Above, BA1=.foo, UA1=.#bar, and UA2=#.baz

    *)
  19. | Pexp_ifthenelse of Ppxlib.expression * Ppxlib.expression * Ppxlib.expression option
    (*

    if E1 then E2 else E3

    *)
  20. | Pexp_sequence of Ppxlib.expression * Ppxlib.expression
    (*

    E1; E2

    *)
  21. | Pexp_while of Ppxlib.expression * Ppxlib.expression
    (*

    while E1 do E2 done

    *)
  22. | Pexp_for of Ppxlib.pattern * Ppxlib.expression * Ppxlib.expression * Ppxlib.direction_flag * Ppxlib.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
    *)
  23. | Pexp_constraint of Ppxlib.expression * Ppxlib.core_type option * Ppxlib.modes
    (*

    (E : T @@ modes)

    *)
  24. | Pexp_coerce of Ppxlib.expression * Ppxlib.core_type option * Ppxlib.core_type
    (*

    Pexp_coerce(E, from, T) represents

    • (E :> T) when from is None,
    • (E : T0 :> T) when from is Some T0.
    *)
  25. | Pexp_send of Ppxlib.expression * Ppxlib.label Ppxlib.loc
    (*

    E # m

    *)
  26. | Pexp_new of Ppxlib.longident_loc
    (*

    new M.c

    *)
  27. | Pexp_setvar of Ppxlib.label Ppxlib.loc * Ppxlib.expression
    (*

    x <- 2

    *)
  28. | Pexp_override of (Ppxlib.label Ppxlib.loc * Ppxlib.expression) list
    (*

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

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

    let module M = ME in E

    *)
  30. | Pexp_letexception of Ppxlib.extension_constructor * Ppxlib.expression
    (*

    let exception C in E

    *)
  31. | Pexp_assert of Ppxlib.expression
    (*

    assert E.

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

    *)
  32. | Pexp_lazy of Ppxlib.expression
    (*

    lazy E

    *)
  33. | Pexp_poly of Ppxlib.expression * Ppxlib.core_type option
    (*

    Used for method bodies.

    Can only be used as the expression under Cfk_concrete for methods (not values).

    *)
  34. | Pexp_object of Ppxlib.class_structure
    (*

    object ... end

    *)
  35. | Pexp_newtype of string Ppxlib.loc * Ppxlib.jkind_annotation option * Ppxlib.expression
    (*

    fun (type t) -> E or fun (type t : k) -> E

    *)
  36. | Pexp_pack of Ppxlib.module_expr
    (*

    (module ME).

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

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

    [%id]

    *)
  40. | Pexp_unreachable
    (*

    .

    *)
  41. | Pexp_stack of Ppxlib.expression
  42. | Pexp_comprehension of Ppxlib.comprehension_expression
    (*

    [? BODY ...CLAUSES... ?], where:

    • ? is either "" (list), : (immutable array), or | (array).
    • BODY is an expression.
    • CLAUSES is a series of comprehension_clause.
    *)
  43. | Pexp_overwrite of Ppxlib.expression * Ppxlib.expression
  44. | Pexp_quote of Ppxlib.expression
    (*

    runtime metaprogramming quotations <E>

    *)
  45. | Pexp_splice of Ppxlib.expression
    (*

    runtime metaprogramming splicing $(E)

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

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

and binding_op = Astlib.Ast_500.Parsetree.binding_op = {
  1. pbop_op : string Ppxlib.loc;
  2. pbop_pat : Ppxlib.pattern;
  3. pbop_exp : Ppxlib.expression;
  4. pbop_loc : Ppxlib.location;
}
and function_param_desc = Astlib.Ast_500.Parsetree.function_param_desc =
  1. | Pparam_val of Ppxlib.arg_label * Ppxlib.expression option * Ppxlib.pattern
    (*

    Pparam_val (lbl, exp0, P) represents the parameter:

    Note: If E0 is provided, only Optional is allowed.

    *)
  2. | Pparam_newtype of string Ppxlib.loc * Ppxlib.jkind_annotation option
    (*

    Pparam_newtype x represents the parameter (type x). x carries the location of the identifier, whereas the pparam_loc on the enclosing function_param node is the location of the (type x) as a whole.

    Multiple parameters (type a b c) are represented as multiple Pparam_newtype nodes, let's say:

     [ { pparam_kind = Pparam_newtype a; pparam_loc = loc1 };
        { pparam_kind = Pparam_newtype b; pparam_loc = loc2 };
        { pparam_kind = Pparam_newtype c; pparam_loc = loc3 };
      ]

    Here, the first loc loc1 is the location of (type a b c), and the subsequent locs loc2 and loc3 are the same as loc1, except marked as ghost locations. The locations on a, b, c, correspond to the variables a, b, and c in the source code.

    *)
and function_param = Astlib.Ast_500.Parsetree.function_param = {
  1. pparam_loc : Ppxlib.location;
  2. pparam_desc : Ppxlib.function_param_desc;
}
and function_body = Astlib.Ast_500.Parsetree.function_body =
  1. | Pfunction_body of Ppxlib.expression
  2. | Pfunction_cases of Ppxlib.case list * Ppxlib.location * Ppxlib.attributes
    (*

    In Pfunction_cases (_, loc, attrs), the location extends from the start of the function keyword to the end of the last case. The compiler will only use typechecking-related attributes from attrs, e.g. enabling or disabling a warning.

    *)

See the comment on Pexp_function.

and type_constraint = Astlib.Ast_500.Parsetree.type_constraint =
  1. | Pconstraint of Ppxlib.core_type
  2. | Pcoerce of Ppxlib.core_type option * Ppxlib.core_type
    (*

    See the comment on Pexp_function.

    *)
and function_constraint = Astlib.Ast_500.Parsetree.function_constraint = {
  1. mode_annotations : Ppxlib.modes;
    (*

    The mode annotation placed on a function let-binding, e.g. let local_ f x : int -> int = .... The local_ syntax is parsed into two nodes: the field here, and pvb_modes. This field only affects the interpretation of ret_type_constraint, while the latter is translated in typecore to Pexp_constraint to contrain the mode of the function.

    *)
  2. ret_mode_annotations : Ppxlib.modes;
    (*

    The mode annotation placed on a function's body, e.g. let f x : int -> int @@ local = .... This field constrains the mode of function's body.

    *)
  3. ret_type_constraint : Ppxlib.type_constraint option;
    (*

    The type constraint placed on a function's body.

    *)
}

See the comment on Pexp_function.

and block_access = Astlib.Ast_500.Parsetree.block_access =
  1. | Baccess_field of Ppxlib.longident_loc
    (*

    .foo

    *)
  2. | Baccess_array of Ppxlib.mutable_flag * Ppxlib.index_kind * Ppxlib.expression
    (*

    Mutable array accesses: .(E), .L(E), .l(E), .n(E) Immutable array accesses: .:(E), .:L(E), .:l(E), .:n(E)

    Indexed by int, int64#, int32#, or nativeint#, respectively.

    *)
  3. | Baccess_block of Ppxlib.mutable_flag * Ppxlib.expression
    (*

    Access using another block index: .idx_imm(E), .idx_mut(E) (usually followed by unboxed accesses, to deepen the index).

    *)
and unboxed_access = Astlib.Ast_500.Parsetree.unboxed_access =
  1. | Uaccess_unboxed_field of Ppxlib.longident_loc
    (*

    .#foo

    *)
and comprehension_iterator = Astlib.Ast_500.Parsetree.comprehension_iterator =
  1. | Pcomp_range of {
    1. start : Ppxlib.expression;
    2. stop : Ppxlib.expression;
    3. direction : Ppxlib.direction_flag;
    }
    (*

    "= START to STOP" (direction = Upto) "= START downto STOP" (direction = Downto)

    *)
  2. | Pcomp_in of Ppxlib.expression
    (*

    "in EXPR"

    *)
and comprehension_clause_binding = Astlib.Ast_500.Parsetree.comprehension_clause_binding = {
  1. pcomp_cb_pattern : Ppxlib.pattern;
  2. pcomp_cb_iterator : Ppxlib.comprehension_iterator;
  3. pcomp_cb_attributes : Ppxlib.attributes;
}

@... PAT (in/=) ...

and comprehension_clause = Astlib.Ast_500.Parsetree.comprehension_clause =
  1. | Pcomp_for of Ppxlib.comprehension_clause_binding list
    (*

    "for PAT (in/=) ... and PAT (in/=) ... and ..."; must be nonempty

    *)
  2. | Pcomp_when of Ppxlib.expression
    (*

    "when EXPR"

    *)
and comprehension = Astlib.Ast_500.Parsetree.comprehension = {
  1. pcomp_body : Ppxlib.expression;
    (*

    The body/generator of the comprehension

    *)
  2. pcomp_clauses : Ppxlib.comprehension_clause list;
    (*

    The clauses of the comprehension; must be nonempty

    *)
}
and comprehension_expression = Astlib.Ast_500.Parsetree.comprehension_expression =
  1. | Pcomp_list_comprehension of Ppxlib.comprehension
    (*

    [BODY ...CLAUSES...]

    *)
  2. | Pcomp_array_comprehension of Ppxlib.mutable_flag * Ppxlib.comprehension
    (*

    [|BODY ...CLAUSES...|] (flag = Mutable) [:BODY ...CLAUSES...:] (flag = Immutable) (only allowed with -extension immutable_arrays)

    *)

Value descriptions

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

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

    *)
  6. pval_loc : Ppxlib.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 Ppxlib.loc;
  2. ptype_params : (Ppxlib.core_type * (Ppxlib.variance * Ppxlib.injectivity)) list;
    (*

    ('a1,...'an) t

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

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

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

    for = private ...

    *)
  6. ptype_manifest : Ppxlib.core_type option;
    (*

    represents = T

    *)
  7. ptype_attributes : Ppxlib.attributes;
    (*

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

    *)
  8. ptype_jkind_annotation : Ppxlib.jkind_annotation option;
    (*

    for : jkind

    *)
  9. ptype_loc : Ppxlib.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 Ppxlib.constructor_declaration list
  3. | Ptype_record of Ppxlib.label_declaration list
    (*

    Invariant: non-empty list

    *)
  4. | Ptype_record_unboxed_product of Ppxlib.label_declaration list
    (*

    Invariant: non-empty list

    *)
  5. | Ptype_open
and label_declaration = Astlib.Ast_500.Parsetree.label_declaration = {
  1. pld_name : string Ppxlib.loc;
  2. pld_mutable : Ppxlib.mutable_flag;
  3. pld_modalities : Ppxlib.modalities;
  4. pld_type : Ppxlib.core_type;
  5. pld_loc : Ppxlib.location;
  6. pld_attributes : Ppxlib.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 Ppxlib.loc;
  2. pcd_vars : (string Ppxlib.loc * Ppxlib.jkind_annotation option) list;
    (*

    jkind annotations are C : ('a : kind1) ('a2 : kind2). ...

    *)
  3. pcd_args : Ppxlib.constructor_arguments;
  4. pcd_res : Ppxlib.core_type option;
  5. pcd_loc : Ppxlib.location;
  6. pcd_attributes : Ppxlib.attributes;
    (*

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

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

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

    *)
}
and type_exception = Astlib.Ast_500.Parsetree.type_exception = {
  1. ptyexn_constructor : Ppxlib.extension_constructor;
  2. ptyexn_loc : Ppxlib.location;
  3. ptyexn_attributes : Ppxlib.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 Ppxlib.loc * Ppxlib.jkind_annotation option) list * Ppxlib.constructor_arguments * Ppxlib.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 : k)... . T1 * ... * Tn -> T0 when

      • existentials is ['a;...],
      • c_args is [T1; ... ; Tn],
      • t_opt is Some T0.
    *)
  2. | Pext_rebind of Ppxlib.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 : Ppxlib.class_type_desc;
  2. pcty_loc : Ppxlib.location;
  3. pcty_attributes : Ppxlib.attributes;
    (*

    ... [@id1] [@id2]

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

    object ... end

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

    Pcty_arrow(lbl, T, CT) represents:

    *)
  4. | Pcty_extension of Ppxlib.extension
    (*

    %id

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

    let open M in CT

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

Values of type class_signature represents:

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

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

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

    inherit CT

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

    val x: T

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

    method x: T

    Note: T can be a Ptyp_poly.

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

    constraint T1 = T2

    *)
  5. | Pctf_attribute of Ppxlib.attribute
    (*

    [@@@id]

    *)
  6. | Pctf_extension of Ppxlib.extension
    (*

    [%%id]

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

Value expressions for the class language

and class_expr = Astlib.Ast_500.Parsetree.class_expr = {
  1. pcl_desc : Ppxlib.class_expr_desc;
  2. pcl_loc : Ppxlib.location;
  3. pcl_attributes : Ppxlib.attributes;
    (*

    ... [@id1] [@id2]

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

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

    *)
  2. | Pcl_structure of Ppxlib.class_structure
    (*

    object ... end

    *)
  3. | Pcl_fun of Ppxlib.arg_label * Ppxlib.expression option * Ppxlib.pattern * Ppxlib.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 Ppxlib.class_expr * (Ppxlib.arg_label * Ppxlib.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 Ppxlib.rec_flag * Ppxlib.value_binding list * Ppxlib.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 Ppxlib.class_expr * Ppxlib.class_type
    (*

    (CE : CT)

    *)
  7. | Pcl_extension of Ppxlib.extension
    (*

    [%id]

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

    let open M in CE

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

Values of type class_structure represents:

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

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

    *)
}
and class_field_desc = Astlib.Ast_500.Parsetree.class_field_desc =
  1. | Pcf_inherit of Ppxlib.override_flag * Ppxlib.class_expr * string Ppxlib.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 Ppxlib.label Ppxlib.loc * Ppxlib.mutable_flag * Ppxlib.class_field_kind
    (*

    Pcf_val(x,flag, kind) represents:

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

    constraint T1 = T2

    *)
  5. | Pcf_initializer of Ppxlib.expression
    (*

    initializer E

    *)
  6. | Pcf_attribute of Ppxlib.attribute
    (*

    [@@@id]

    *)
  7. | Pcf_extension of Ppxlib.extension
    (*

    [%%id]

    *)
and class_field_kind = Astlib.Ast_500.Parsetree.class_field_kind =
  1. | Cfk_virtual of Ppxlib.core_type
  2. | Cfk_concrete of Ppxlib.override_flag * Ppxlib.expression
and class_declaration = Ppxlib.class_expr Ppxlib.class_infos

Module language

Type expressions for the module language

and module_type = Astlib.Ast_500.Parsetree.module_type = {
  1. pmty_desc : Ppxlib.module_type_desc;
  2. pmty_loc : Ppxlib.location;
  3. pmty_attributes : Ppxlib.attributes;
    (*

    ... [@id1] [@id2]

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

    Pmty_ident(S) represents S

    *)
  2. | Pmty_signature of Ppxlib.signature
    (*

    sig ... end

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

    functor(X : MT1) -> MT2

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

    MT with ...

    *)
  5. | Pmty_typeof of Ppxlib.module_expr
    (*

    module type of ME

    *)
  6. | Pmty_extension of Ppxlib.extension
    (*

    [%id]

    *)
  7. | Pmty_alias of Ppxlib.longident_loc
    (*

    (module M)

    *)
  8. | Pmty_strengthen of Ppxlib.module_type * Ppxlib.longident_loc
    (*

    MT with S

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

    ()

    *)
  2. | Named of string option Ppxlib.loc * Ppxlib.module_type * Ppxlib.modes
    (*

    Named(name, MT) represents:

    • (X : MT) when name is Some X,
    • (_ : MT) when name is None
    *)
and signature = Astlib.Ast_500.Parsetree.signature = {
  1. psg_modalities : Ppxlib.modalities;
  2. psg_items : Ppxlib.signature_items;
  3. psg_loc : Ppxlib.location;
}
and signature_items = Ppxlib.signature_item list
and signature_item_desc = Astlib.Ast_500.Parsetree.signature_item_desc =
  1. | Psig_value of Ppxlib.value_description
    (*
    • val x: T
    • external x: T = "s1" ... "sn"
    *)
  2. | Psig_type of Ppxlib.rec_flag * Ppxlib.type_declaration list
    (*

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

    *)
  3. | Psig_typesubst of Ppxlib.type_declaration list
    (*

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

    *)
  4. | Psig_typext of Ppxlib.type_extension
    (*

    type t1 += ...

    *)
  5. | Psig_exception of Ppxlib.type_exception
    (*

    exception C of T

    *)
  6. | Psig_module of Ppxlib.module_declaration
    (*

    module X = M and module X : MT

    *)
  7. | Psig_modsubst of Ppxlib.module_substitution
    (*

    module X := M

    *)
  8. | Psig_recmodule of Ppxlib.module_declaration list
    (*

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

    *)
  9. | Psig_modtype of Ppxlib.module_type_declaration
    (*

    module type S = MT and module type S

    *)
  10. | Psig_modtypesubst of Ppxlib.module_type_declaration
    (*

    module type S := ...

    *)
  11. | Psig_open of Ppxlib.open_description
    (*

    open X

    *)
  12. | Psig_include of Ppxlib.include_description * Ppxlib.modalities
    (*

    include MT

    *)
  13. | Psig_class of Ppxlib.class_description list
    (*

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

    *)
  14. | Psig_class_type of Ppxlib.class_type_declaration list
    (*

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

    *)
  15. | Psig_attribute of Ppxlib.attribute
    (*

    [@@@id]

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

    [%%id]

    *)
  17. | Psig_kind_abbrev of string Ppxlib.loc * Ppxlib.jkind_annotation
    (*

    kind_abbrev_ name = k

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

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

    *)
  5. pmd_loc : Ppxlib.location;
}

Values of type module_declaration represents S : MT

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

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

    *)
  4. pms_loc : Ppxlib.location;
}

Values of type module_substitution represents S := M

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

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

    *)
  4. pmtd_loc : Ppxlib.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 : Ppxlib.override_flag;
  3. popen_loc : Ppxlib.location;
  4. popen_attributes : Ppxlib.attributes;
}

Values of type 'a open_infos represents:

Values of type open_description represents:

  • open M.N
  • open M(N).O
and open_declaration = Ppxlib.module_expr Ppxlib.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_kind : Ppxlib.include_kind;
  2. pincl_mod : 'a;
  3. pincl_loc : Ppxlib.location;
  4. pincl_attributes : Ppxlib.attributes;
}
and include_description = Ppxlib.module_type Ppxlib.include_infos

Values of type include_description represents include MT

and include_declaration = Ppxlib.module_expr Ppxlib.include_infos

Values of type include_declaration represents include ME

and with_constraint = Astlib.Ast_500.Parsetree.with_constraint =
  1. | Pwith_type of Ppxlib.longident_loc * Ppxlib.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 Ppxlib.longident_loc * Ppxlib.longident_loc
    (*

    with module X.Y = Z

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

    with module type X.Y = Z

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

    with module type X.Y := sig end

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

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

    *)
  6. | Pwith_modsubst of Ppxlib.longident_loc * Ppxlib.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 : Ppxlib.module_expr_desc;
  2. pmod_loc : Ppxlib.location;
  3. pmod_attributes : Ppxlib.attributes;
    (*

    ... [@id1] [@id2]

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

    X

    *)
  2. | Pmod_structure of Ppxlib.structure
    (*

    struct ... end

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

    functor(X : MT1) -> ME

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

    ME1(ME2)

    *)
  5. | Pmod_constraint of Ppxlib.module_expr * Ppxlib.module_type option * Ppxlib.modes
    (*

    (ME : MT)

    *)
  6. | Pmod_unpack of Ppxlib.expression
    (*

    (val E)

    *)
  7. | Pmod_extension of Ppxlib.extension
    (*

    [%id]

    *)
  8. | Pmod_instance of Ppxlib.module_instance
    (*

    Foo(Param1)(Arg1(Param2)(Arg2)) [@jane.non_erasable.instances]

    *)
and module_instance = Astlib.Ast_500.Parsetree.module_instance = {
  1. pmod_instance_head : string;
  2. pmod_instance_args : (string * Ppxlib.module_instance) list;
}

M(P1)(MI1)...(Pn)(MIn)

and structure = Ppxlib.structure_item list
and structure_item_desc = Astlib.Ast_500.Parsetree.structure_item_desc =
  1. | Pstr_eval of Ppxlib.expression * Ppxlib.attributes
    (*

    E

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

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

    *)
  5. | Pstr_typext of Ppxlib.type_extension
    (*

    type t1 += ...

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

    module X = ME

    *)
  8. | Pstr_recmodule of Ppxlib.module_binding list
    (*

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

    *)
  9. | Pstr_modtype of Ppxlib.module_type_declaration
    (*

    module type S = MT

    *)
  10. | Pstr_open of Ppxlib.open_declaration
    (*

    open X

    *)
  11. | Pstr_class of Ppxlib.class_declaration list
    (*

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

    *)
  12. | Pstr_class_type of Ppxlib.class_type_declaration list
    (*

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

    *)
  13. | Pstr_include of Ppxlib.include_declaration
    (*

    include ME

    *)
  14. | Pstr_attribute of Ppxlib.attribute
    (*

    [@@@id]

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

    [%%id]

    *)
  16. | Pstr_kind_abbrev of string Ppxlib.loc * Ppxlib.jkind_annotation
    (*

    kind_abbrev_ name = k

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

Values of type module_binding represents module X = ME

and jkind_annotation_desc = Astlib.Ast_500.Parsetree.jkind_annotation_desc =
  1. | Pjk_default
  2. | Pjk_abbreviation of string
  3. | Pjk_mod of Ppxlib.jkind_annotation * Ppxlib.modes
  4. | Pjk_with of Ppxlib.jkind_annotation * Ppxlib.core_type * Ppxlib.modalities
  5. | Pjk_kind_of of Ppxlib.core_type
  6. | Pjk_product of Ppxlib.jkind_annotation list
and jkind_annotation = Astlib.Ast_500.Parsetree.jkind_annotation = {
  1. pjkind_loc : Ppxlib.location;
  2. pjkind_desc : Ppxlib.jkind_annotation_desc;
}

Toplevel

Toplevel phrases

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

    #use, #load ...

    *)
and toplevel_directive = Astlib.Ast_500.Parsetree.toplevel_directive = {
  1. pdir_name : string Ppxlib.loc;
  2. pdir_arg : Ppxlib.directive_argument option;
  3. pdir_loc : Ppxlib.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 Ppxlib.longident
  4. | Pdir_bool of bool
and cases = Ppxlib.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
Sourcemodule Do_not_use_directly = Ocaml_shadow.Do_not_use_directly
Sourcemodule Afl_instrument = Ocaml_shadow.Afl_instrument
Sourcemodule Allowance = Ocaml_shadow.Allowance
Sourcemodule Amd64_simd_defs = Ocaml_shadow.Amd64_simd_defs
Sourcemodule Amd64_simd_instrs = Ocaml_shadow.Amd64_simd_instrs
Sourcemodule Arg_helper = Ocaml_shadow.Arg_helper
Sourcemodule Arm64_ast = Ocaml_shadow.Arm64_ast
Sourcemodule Arrayset = Ocaml_shadow.Arrayset
Sourcemodule Asm_targets = Ocaml_shadow.Asm_targets
Sourcemodule Ast_invariants = Ocaml_shadow.Ast_invariants
Sourcemodule Ast_iterator = Ocaml_shadow.Ast_iterator
Sourcemodule Ast_mapper = Ocaml_shadow.Ast_mapper
Sourcemodule Attr_helper = Ocaml_shadow.Attr_helper
Sourcemodule Available_ranges_vars = Ocaml_shadow.Available_ranges_vars
Sourcemodule Backend_var = Ocaml_shadow.Backend_var
Sourcemodule Binutils = Ocaml_shadow.Binutils
Sourcemodule Blambda_of_lambda = Ocaml_shadow.Blambda_of_lambda
Sourcemodule Branch_relaxation = Ocaml_shadow.Branch_relaxation
Sourcemodule Branch_relaxation_intf = Ocaml_shadow.Branch_relaxation_intf
Sourcemodule Build_igot_and_iplt = Ocaml_shadow.Build_igot_and_iplt
Sourcemodule Build_linker_args = Ocaml_shadow.Build_linker_args
Sourcemodule Build_path_prefix_map = Ocaml_shadow.Build_path_prefix_map
Sourcemodule Builtin_attributes = Ocaml_shadow.Builtin_attributes
Sourcemodule Byteinstantiator = Ocaml_shadow.Byteinstantiator
Sourcemodule Bytelibrarian = Ocaml_shadow.Bytelibrarian
Sourcemodule Bytepackager = Ocaml_shadow.Bytepackager
Sourcemodule Bytesections = Ocaml_shadow.Bytesections
Sourcemodule CamlinternalMenhirLib = Ocaml_shadow.CamlinternalMenhirLib
Sourcemodule Cfg_available_regs = Ocaml_shadow.Cfg_available_regs
Sourcemodule Cfg_comballoc = Ocaml_shadow.Cfg_comballoc
Sourcemodule Cfg_cse_target_intf = Ocaml_shadow.Cfg_cse_target_intf
Sourcemodule Cfg_dataflow = Ocaml_shadow.Cfg_dataflow
Sourcemodule Cfg_deadcode = Ocaml_shadow.Cfg_deadcode
Sourcemodule Cfg_dominators = Ocaml_shadow.Cfg_dominators
Sourcemodule Cfg_edge = Ocaml_shadow.Cfg_edge
Sourcemodule Cfg_format = Ocaml_shadow.Cfg_format
Sourcemodule Cfg_intf = Ocaml_shadow.Cfg_intf
Sourcemodule Cfg_invariants = Ocaml_shadow.Cfg_invariants
Sourcemodule Cfg_liveness = Ocaml_shadow.Cfg_liveness
Sourcemodule Cfg_loop_infos = Ocaml_shadow.Cfg_loop_infos
Sourcemodule Cfg_polling = Ocaml_shadow.Cfg_polling
Sourcemodule Cfg_prologue = Ocaml_shadow.Cfg_prologue
Sourcemodule Cfg_reducibility = Ocaml_shadow.Cfg_reducibility
Sourcemodule Cfg_selectgen = Ocaml_shadow.Cfg_selectgen
Sourcemodule Cfg_selectgen_target_intf = Ocaml_shadow.Cfg_selectgen_target_intf
Sourcemodule Cfg_selection = Ocaml_shadow.Cfg_selection
Sourcemodule Cfg_simplify = Ocaml_shadow.Cfg_simplify
Sourcemodule Cfg_stack_checks = Ocaml_shadow.Cfg_stack_checks
Sourcemodule Cfg_to_linear = Ocaml_shadow.Cfg_to_linear
Sourcemodule Cfg_to_linear_desc = Ocaml_shadow.Cfg_to_linear_desc
Sourcemodule Cfg_with_infos = Ocaml_shadow.Cfg_with_infos
Sourcemodule Cfg_with_layout = Ocaml_shadow.Cfg_with_layout
Sourcemodule Cm_bundle = Ocaml_shadow.Cm_bundle
Sourcemodule Cmi_format = Ocaml_shadow.Cmi_format
Sourcemodule Cmj_format = Ocaml_shadow.Cmj_format
Sourcemodule Cmm_builtins = Ocaml_shadow.Cmm_builtins
Sourcemodule Cmm_helpers = Ocaml_shadow.Cmm_helpers
Sourcemodule Cmm_invariants = Ocaml_shadow.Cmm_invariants
Sourcemodule Cmm_peephole_engine = Ocaml_shadow.Cmm_peephole_engine
Sourcemodule Cmmgen_state = Ocaml_shadow.Cmmgen_state
Sourcemodule Cmo_format = Ocaml_shadow.Cmo_format
Sourcemodule Cms_format = Ocaml_shadow.Cms_format
Sourcemodule Cmt2annot = Ocaml_shadow.Cmt2annot
Sourcemodule Cmt_format = Ocaml_shadow.Cmt_format
Sourcemodule Cmx_format = Ocaml_shadow.Cmx_format
Sourcemodule Cmxs_format = Ocaml_shadow.Cmxs_format
Sourcemodule Compilation_unit = Ocaml_shadow.Compilation_unit
Sourcemodule Compile_common = Ocaml_shadow.Compile_common
Sourcemodule Compilenv = Ocaml_shadow.Compilenv
Sourcemodule Compiler_hooks = Ocaml_shadow.Compiler_hooks
Sourcemodule Compmisc = Ocaml_shadow.Compmisc
Sourcemodule Compute_ranges = Ocaml_shadow.Compute_ranges
Sourcemodule Compute_ranges_intf = Ocaml_shadow.Compute_ranges_intf
Sourcemodule Consistbl = Ocaml_shadow.Consistbl
Sourcemodule Datarepr = Ocaml_shadow.Datarepr
Sourcemodule Debug_event = Ocaml_shadow.Debug_event
Sourcemodule Debuginfo = Ocaml_shadow.Debuginfo
Sourcemodule Diffing_with_keys = Ocaml_shadow.Diffing_with_keys
Sourcemodule Dissector = Ocaml_shadow.Dissector
Sourcemodule Dissector_log = Ocaml_shadow.Dissector_log
Sourcemodule Domainstate = Ocaml_shadow.Domainstate
Sourcemodule Dwarf_abstract_instances = Ocaml_shadow.Dwarf_abstract_instances
Sourcemodule Dwarf_compilation_unit = Ocaml_shadow.Dwarf_compilation_unit
Sourcemodule Dwarf_concrete_instances = Ocaml_shadow.Dwarf_concrete_instances
Sourcemodule Dwarf_flags = Ocaml_shadow.Dwarf_flags
Sourcemodule Dwarf_high = Ocaml_shadow.Dwarf_high
Sourcemodule Dwarf_inlined_frames = Ocaml_shadow.Dwarf_inlined_frames
Sourcemodule Dwarf_low = Ocaml_shadow.Dwarf_low
Sourcemodule Dwarf_name_laundry = Ocaml_shadow.Dwarf_name_laundry
Sourcemodule Dwarf_reg_locations = Ocaml_shadow.Dwarf_reg_locations
Sourcemodule Dwarf_state = Ocaml_shadow.Dwarf_state
Sourcemodule Dwarf_type = Ocaml_shadow.Dwarf_type
Sourcemodule Dwarf_variables_and_parameters = Ocaml_shadow.Dwarf_variables_and_parameters
Sourcemodule Emitcode = Ocaml_shadow.Emitcode
Sourcemodule Errortrace = Ocaml_shadow.Errortrace
Sourcemodule Extra_debug = Ocaml_shadow.Extra_debug
Sourcemodule Extract_relocations = Ocaml_shadow.Extract_relocations
Sourcemodule Fdo_info = Ocaml_shadow.Fdo_info
Sourcemodule Flambda2 = Ocaml_shadow.Flambda2
Sourcemodule Flambda2_algorithms = Ocaml_shadow.Flambda2_algorithms
Sourcemodule Flambda2_bound_identifiers = Ocaml_shadow.Flambda2_bound_identifiers
Sourcemodule Flambda2_classic_mode_types = Ocaml_shadow.Flambda2_classic_mode_types
Sourcemodule Flambda2_cmx = Ocaml_shadow.Flambda2_cmx
Sourcemodule Flambda2_datalog = Ocaml_shadow.Flambda2_datalog
Sourcemodule Flambda2_floats = Ocaml_shadow.Flambda2_floats
Sourcemodule Flambda2_from_lambda = Ocaml_shadow.Flambda2_from_lambda
Sourcemodule Flambda2_identifiers = Ocaml_shadow.Flambda2_identifiers
Sourcemodule Flambda2_import = Ocaml_shadow.Flambda2_import
Sourcemodule Flambda2_kinds = Ocaml_shadow.Flambda2_kinds
Sourcemodule Flambda2_lattices = Ocaml_shadow.Flambda2_lattices
Sourcemodule Flambda2_nominal = Ocaml_shadow.Flambda2_nominal
Sourcemodule Flambda2_numbers = Ocaml_shadow.Flambda2_numbers
Sourcemodule Flambda2_parser = Ocaml_shadow.Flambda2_parser
Sourcemodule Flambda2_reaper = Ocaml_shadow.Flambda2_reaper
Sourcemodule Flambda2_simplify = Ocaml_shadow.Flambda2_simplify
Sourcemodule Flambda2_simplify_shared = Ocaml_shadow.Flambda2_simplify_shared
Sourcemodule Flambda2_term_basics = Ocaml_shadow.Flambda2_term_basics
Sourcemodule Flambda2_terms = Ocaml_shadow.Flambda2_terms
Sourcemodule Flambda2_to_cmm = Ocaml_shadow.Flambda2_to_cmm
Sourcemodule Flambda2_to_jsir = Ocaml_shadow.Flambda2_to_jsir
Sourcemodule Flambda2_types = Ocaml_shadow.Flambda2_types
Sourcemodule Flambda2_ui = Ocaml_shadow.Flambda2_ui
Sourcemodule Form_rewrite_plan = Ocaml_shadow.Form_rewrite_plan
Sourcemodule Generic_fns = Ocaml_shadow.Generic_fns
Sourcemodule Genprintval = Ocaml_shadow.Genprintval
Sourcemodule Global_module = Ocaml_shadow.Global_module
Sourcemodule Import_info = Ocaml_shadow.Import_info
Sourcemodule Includeclass = Ocaml_shadow.Includeclass
Sourcemodule Includecore = Ocaml_shadow.Includecore
Sourcemodule Includemod = Ocaml_shadow.Includemod
Sourcemodule Includemod_errorprinter = Ocaml_shadow.Includemod_errorprinter
Sourcemodule Inlined_frame_ranges = Ocaml_shadow.Inlined_frame_ranges
Sourcemodule Instantiator = Ocaml_shadow.Instantiator
Sourcemodule Instruct = Ocaml_shadow.Instruct
Sourcemodule InstructionId = Ocaml_shadow.InstructionId
Sourcemodule Int_replace_polymorphic_compare = Ocaml_shadow.Int_replace_polymorphic_compare
Sourcemodule Internal_assembler = Ocaml_shadow.Internal_assembler
Sourcemodule Is_parameter = Ocaml_shadow.Is_parameter
Sourcemodule Jkind_axis = Ocaml_shadow.Jkind_axis
Sourcemodule Jkind_intf = Ocaml_shadow.Jkind_intf
Sourcemodule Jkind_types = Ocaml_shadow.Jkind_types
Sourcemodule Language_extension = Ocaml_shadow.Language_extension
Sourcemodule Language_extension_kernel = Ocaml_shadow.Language_extension_kernel
Sourcemodule Lazy_backtrack = Ocaml_shadow.Lazy_backtrack
Sourcemodule Linear_format = Ocaml_shadow.Linear_format
Sourcemodule Linear_utils = Ocaml_shadow.Linear_utils
Sourcemodule Linkage_name = Ocaml_shadow.Linkage_name
Sourcemodule Linker_script = Ocaml_shadow.Linker_script
Sourcemodule Load_path = Ocaml_shadow.Load_path
Sourcemodule Local_store = Ocaml_shadow.Local_store
Sourcemodule Location_tracker_formatter = Ocaml_shadow.Location_tracker_formatter
Sourcemodule Main_args = Ocaml_shadow.Main_args
Sourcemodule Maindriver = Ocaml_shadow.Maindriver
Sourcemodule Makedepend = Ocaml_shadow.Makedepend
Sourcemodule Matching = Ocaml_shadow.Matching
Sourcemodule Measure_object_files = Ocaml_shadow.Measure_object_files
Sourcemodule Mixed_block_shape = Ocaml_shadow.Mixed_block_shape
Sourcemodule Mixed_product_bytes = Ocaml_shadow.Mixed_product_bytes
Sourcemodule Mode_hint = Ocaml_shadow.Mode_hint
Sourcemodule Mode_intf = Ocaml_shadow.Mode_intf
Sourcemodule Operation = Ocaml_shadow.Operation
Sourcemodule Optcomp_intf = Ocaml_shadow.Optcomp_intf
Sourcemodule Optcompile = Ocaml_shadow.Optcompile
Sourcemodule Opterrors = Ocaml_shadow.Opterrors
Sourcemodule Optlibrarian = Ocaml_shadow.Optlibrarian
Sourcemodule Optmaindriver = Ocaml_shadow.Optmaindriver
Sourcemodule Optpackager = Ocaml_shadow.Optpackager
Sourcemodule Opttopdirs = Ocaml_shadow.Opttopdirs
Sourcemodule Opttoploop = Ocaml_shadow.Opttoploop
Sourcemodule Outcometree = Ocaml_shadow.Outcometree
Sourcemodule Oxcaml_args = Ocaml_shadow.Oxcaml_args
Sourcemodule Oxcaml_flags = Ocaml_shadow.Oxcaml_flags
Sourcemodule Oxcaml_utils = Ocaml_shadow.Oxcaml_utils
Sourcemodule Parmatch = Ocaml_shadow.Parmatch
Sourcemodule Parser_types = Ocaml_shadow.Parser_types
Sourcemodule Partition = Ocaml_shadow.Partition
Sourcemodule Partition_object_files = Ocaml_shadow.Partition_object_files
Sourcemodule Patterns = Ocaml_shadow.Patterns
Sourcemodule Peephole_optimize = Ocaml_shadow.Peephole_optimize
Sourcemodule Peephole_rules = Ocaml_shadow.Peephole_rules
Sourcemodule Peephole_utils = Ocaml_shadow.Peephole_utils
Sourcemodule Persistent_env = Ocaml_shadow.Persistent_env
Sourcemodule Primitive = Ocaml_shadow.Primitive
Sourcemodule Printast = Ocaml_shadow.Printast
Sourcemodule Printast_with_mappings = Ocaml_shadow.Printast_with_mappings
Sourcemodule Printblambda = Ocaml_shadow.Printblambda
Sourcemodule Printcmm = Ocaml_shadow.Printcmm
Sourcemodule Printinstr = Ocaml_shadow.Printinstr
Sourcemodule Printlambda = Ocaml_shadow.Printlambda
Sourcemodule Printlinear = Ocaml_shadow.Printlinear
Sourcemodule Printoperation = Ocaml_shadow.Printoperation
Sourcemodule Printpat = Ocaml_shadow.Printpat
Sourcemodule Printreg = Ocaml_shadow.Printreg
Sourcemodule Printslambda = Ocaml_shadow.Printslambda
Sourcemodule Printslambda0 = Ocaml_shadow.Printslambda0
Sourcemodule Printtyp = Ocaml_shadow.Printtyp
Sourcemodule Printtyped = Ocaml_shadow.Printtyped
Sourcemodule Priority_queue = Ocaml_shadow.Priority_queue
Sourcemodule Probe_emission = Ocaml_shadow.Probe_emission
Sourcemodule Profile_counters_functions = Ocaml_shadow.Profile_counters_functions
Sourcemodule Reg_availability_set = Ocaml_shadow.Reg_availability_set
Sourcemodule Reg_class = Ocaml_shadow.Reg_class
Sourcemodule Reg_class_utils = Ocaml_shadow.Reg_class_utils
Sourcemodule Reg_with_debug_info = Ocaml_shadow.Reg_with_debug_info
Sourcemodule Regalloc_affinity = Ocaml_shadow.Regalloc_affinity
Sourcemodule Regalloc_gi = Ocaml_shadow.Regalloc_gi
Sourcemodule Regalloc_gi_state = Ocaml_shadow.Regalloc_gi_state
Sourcemodule Regalloc_gi_utils = Ocaml_shadow.Regalloc_gi_utils
Sourcemodule Regalloc_invariants = Ocaml_shadow.Regalloc_invariants
Sourcemodule Regalloc_irc = Ocaml_shadow.Regalloc_irc
Sourcemodule Regalloc_irc_state = Ocaml_shadow.Regalloc_irc_state
Sourcemodule Regalloc_irc_utils = Ocaml_shadow.Regalloc_irc_utils
Sourcemodule Regalloc_ls = Ocaml_shadow.Regalloc_ls
Sourcemodule Regalloc_ls_state = Ocaml_shadow.Regalloc_ls_state
Sourcemodule Regalloc_ls_utils = Ocaml_shadow.Regalloc_ls_utils
Sourcemodule Regalloc_rewrite = Ocaml_shadow.Regalloc_rewrite
Sourcemodule Regalloc_split = Ocaml_shadow.Regalloc_split
Sourcemodule Regalloc_split_state = Ocaml_shadow.Regalloc_split_state
Sourcemodule Regalloc_split_utils = Ocaml_shadow.Regalloc_split_utils
Sourcemodule Regalloc_stack_operands = Ocaml_shadow.Regalloc_stack_operands
Sourcemodule Regalloc_stack_slots = Ocaml_shadow.Regalloc_stack_slots
Sourcemodule Regalloc_substitution = Ocaml_shadow.Regalloc_substitution
Sourcemodule Regalloc_utils = Ocaml_shadow.Regalloc_utils
Sourcemodule Regalloc_validate = Ocaml_shadow.Regalloc_validate
Sourcemodule Relocation_entry = Ocaml_shadow.Relocation_entry
Sourcemodule Rewrite_sections = Ocaml_shadow.Rewrite_sections
Sourcemodule Runtimedef = Ocaml_shadow.Runtimedef
Sourcemodule Runtimetags = Ocaml_shadow.Runtimetags
Sourcemodule Section_table = Ocaml_shadow.Section_table
Sourcemodule Select_utils = Ocaml_shadow.Select_utils
Sourcemodule Shape_reduce = Ocaml_shadow.Shape_reduce
Sourcemodule Signature_group = Ocaml_shadow.Signature_group
Sourcemodule Signature_with_global_bindings = Ocaml_shadow.Signature_with_global_bindings
Sourcemodule Simd_proc = Ocaml_shadow.Simd_proc
Sourcemodule Simd_selection = Ocaml_shadow.Simd_selection
Sourcemodule Simplify_terminator = Ocaml_shadow.Simplify_terminator
Sourcemodule Slambda0 = Ocaml_shadow.Slambda0
Sourcemodule Slambdaeval = Ocaml_shadow.Slambdaeval
Sourcemodule Solver_intf = Ocaml_shadow.Solver_intf
Sourcemodule Stack_check = Ocaml_shadow.Stack_check
Sourcemodule Stack_class = Ocaml_shadow.Stack_class
Sourcemodule Stack_class_utils = Ocaml_shadow.Stack_class_utils
Sourcemodule Stack_reg_offset = Ocaml_shadow.Stack_reg_offset
Sourcemodule Static_label = Ocaml_shadow.Static_label
Sourcemodule String_table = Ocaml_shadow.String_table
Sourcemodule Strongly_connected_components = Ocaml_shadow.Strongly_connected_components
Sourcemodule Symbol_table = Ocaml_shadow.Symbol_table
Sourcemodule Symtable = Ocaml_shadow.Symtable
Sourcemodule Target_system = Ocaml_shadow.Target_system
Sourcemodule Targetint = Ocaml_shadow.Targetint
Sourcemodule Tast_iterator = Ocaml_shadow.Tast_iterator
Sourcemodule Tast_mapper = Ocaml_shadow.Tast_mapper
Sourcemodule Terminfo = Ocaml_shadow.Terminfo
Sourcemodule Topstart = Ocaml_shadow.Topstart
Sourcemodule Transl_array_comprehension = Ocaml_shadow.Transl_array_comprehension
Sourcemodule Transl_comprehension_utils = Ocaml_shadow.Transl_comprehension_utils
Sourcemodule Transl_list_comprehension = Ocaml_shadow.Transl_list_comprehension
Sourcemodule Translattribute = Ocaml_shadow.Translattribute
Sourcemodule Translclass = Ocaml_shadow.Translclass
Sourcemodule Translcore = Ocaml_shadow.Translcore
Sourcemodule Translmod = Ocaml_shadow.Translmod
Sourcemodule Translmode = Ocaml_shadow.Translmode
Sourcemodule Translobj = Ocaml_shadow.Translobj
Sourcemodule Translprim = Ocaml_shadow.Translprim
Sourcemodule Translquote = Ocaml_shadow.Translquote
Sourcemodule Type_shape = Ocaml_shadow.Type_shape
Sourcemodule Typeclass = Ocaml_shadow.Typeclass
Sourcemodule Typecore = Ocaml_shadow.Typecore
Sourcemodule Typedecl = Ocaml_shadow.Typedecl
Sourcemodule Typedecl_properties = Ocaml_shadow.Typedecl_properties
Sourcemodule Typedecl_separability = Ocaml_shadow.Typedecl_separability
Sourcemodule Typedecl_variance = Ocaml_shadow.Typedecl_variance
Sourcemodule Typedtree = Ocaml_shadow.Typedtree
Sourcemodule Typemode = Ocaml_shadow.Typemode
Sourcemodule Typetexp = Ocaml_shadow.Typetexp
Sourcemodule Uniqueness_analysis = Ocaml_shadow.Uniqueness_analysis
Sourcemodule Unit_info = Ocaml_shadow.Unit_info
Sourcemodule Untypeast = Ocaml_shadow.Untypeast
Sourcemodule Value_rec_check = Ocaml_shadow.Value_rec_check
Sourcemodule Value_rec_compiler = Ocaml_shadow.Value_rec_compiler
Sourcemodule Value_rec_types = Ocaml_shadow.Value_rec_types
Sourcemodule Vectorize = Ocaml_shadow.Vectorize
Sourcemodule Vectorize_specific = Ocaml_shadow.Vectorize_specific
Sourcemodule Vectorize_utils = Ocaml_shadow.Vectorize_utils
Sourcemodule Vicuna_traverse_typed_tree = Ocaml_shadow.Vicuna_traverse_typed_tree
Sourcemodule Vicuna_value_shapes = Ocaml_shadow.Vicuna_value_shapes
Sourcemodule Warnings = Ocaml_shadow.Warnings
Sourcemodule X86_ast_utils = Ocaml_shadow.X86_ast_utils
Sourcemodule X86_binary_emitter = Ocaml_shadow.X86_binary_emitter
Sourcemodule X86_masm = Ocaml_shadow.X86_masm
Sourcemodule X86_proc = Ocaml_shadow.X86_proc
Sourcemodule Zero_alloc = Ocaml_shadow.Zero_alloc
Sourcemodule Zero_alloc_annotations = Ocaml_shadow.Zero_alloc_annotations
Sourcemodule Zero_alloc_checker = Ocaml_shadow.Zero_alloc_checker
Sourcemodule Zero_alloc_info = Ocaml_shadow.Zero_alloc_info
Sourcemodule Zero_alloc_utils = Ocaml_shadow.Zero_alloc_utils