# Module Migrate_parsetree_versions

    module Migrate_parsetree_versions: sig .. end

# Abstracting an OCaml frontend

    module type Ast = sig .. end

Abstract view of a version of an OCaml Ast

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
           type_declaration : 'q; type_extension : 'r > _types = < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
             mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
             out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
             pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
             type_declaration : 'q; type_extension : 'r >

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'x; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_structure = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'x; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_signature = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'x;
           type_declaration : 'p; type_extension : 'q > get_toplevel_phrase = 'x

    type < case : 'a; core_type : 'x; expression : 'b; extension_constructor : 'c;
           mapper : 'd; out_class_type : 'e; out_module_type : 'f; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_core_type = 'x

    type < case : 'a; core_type : 'b; expression : 'x; extension_constructor : 'c;
           mapper : 'd; out_class_type : 'e; out_module_type : 'f; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_expression = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'x; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_pattern = 'x

    type < case : 'x; core_type : 'a; expression : 'b; extension_constructor : 'c;
           mapper : 'd; out_class_type : 'e; out_module_type : 'f; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_case = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
           type_declaration : 'x; type_extension : 'q > get_type_declaration = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
           type_declaration : 'q; type_extension : 'x > get_type_extension = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'x;
           mapper : 'd; out_class_type : 'e; out_module_type : 'f; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_extension_constructor = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'x;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_value = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'x; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_type = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'x; out_module_type : 'f; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_class_type = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'x; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_module_type = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'x; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_sig_item = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'x; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_type_extension = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'x;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_out_phrase = 'x

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'x; out_class_type : 'e; out_module_type : 'f; out_phrase : 'g;
           out_sig_item : 'h; out_type : 'i; out_type_extension : 'j; out_value : 'k;
           pattern : 'l; signature : 'm; structure : 'n; toplevel_phrase : 'o;
           type_declaration : 'p; type_extension : 'q > get_mapper = 'x

    type '_ witnesses

A version of the OCaml frontend packs the ast with type witnesses so that equalities can be recovered dynamically.

    type '_ migration_info

`migration_info` is an opaque type that is used to generate migration functions.

    module type OCaml_version = sig .. end

An OCaml frontend versions an Ast, version number and some witnesses for conversion.

    type < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
           type_declaration : 'q; type_extension : 'r > ocaml_version = (module Migrate_parsetree_versions.OCaml_version with type Ast.Ast_mapper.mapper =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_mapper and type Ast.Outcometree.out_class_type =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_class_type and type Ast.Outcometree.out_module_type =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_module_type and type Ast.Outcometree.out_phrase =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_phrase and type Ast.Outcometree.out_sig_item =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_sig_item and type Ast.Outcometree.out_type =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_type and type Ast.Outcometree.out_type_extension =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_type_extension and type Ast.Outcometree.out_value =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_out_value and type Ast.Parsetree.case =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_case and type Ast.Parsetree.core_type =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_core_type and type Ast.Parsetree.expression =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_expression and type Ast.Parsetree.extension_constructor =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_extension_constructor and type Ast.Parsetree.pattern =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_pattern and type Ast.Parsetree.signature =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_signature and type Ast.Parsetree.structure =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_structure and type Ast.Parsetree.toplevel_phrase =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_toplevel_phrase and type Ast.Parsetree.type_declaration =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_type_declaration and type Ast.Parsetree.type_extension =
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >
            get_type_extension)

Representing an ocaml version in type language

# Concrete frontend instances

    module OCaml_402: OCaml_version  with module Ast = Ast_402

    val ocaml_402 : OCaml_402.types
           ocaml_version

    module OCaml_403: OCaml_version  with module Ast = Ast_403

    val ocaml_403 : OCaml_403.types
           ocaml_version

    module OCaml_404: OCaml_version  with module Ast = Ast_404

    val ocaml_404 : OCaml_404.types
           ocaml_version

    module OCaml_405: OCaml_version  with module Ast = Ast_405

    val ocaml_405 : OCaml_405.types
           ocaml_version

    module OCaml_406: OCaml_version  with module Ast = Ast_406

    val ocaml_406 : OCaml_406.types
           ocaml_version

    module OCaml_current: OCaml_405

    val ocaml_current : OCaml_current.types ocaml_version

    val all_versions : (module Migrate_parsetree_versions.OCaml_version) list

# Migrating between different versions

    type ('a, 'b) type_comparison =

`|` | `Lt : `('a0, 'b0) type_comparison``
`|` | `Eq : `('a1, 'a1) type_comparison``
`|` | `Gt : `('a2, 'b1) type_comparison``

    val compare_ocaml_version : < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
             mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
             out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
             pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
             type_declaration : 'q; type_extension : 'r >
           ocaml_version ->
           < case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
             mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
             out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
             out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
             toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
           ocaml_version ->
           (< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >,
            < case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
              mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
              out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
              out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
              toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >)
           type_comparison

    type (< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
           mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
           out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
           pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
           type_declaration : 'q; type_extension : 'r >
           , < case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
               mapper : 'w; out_class_type : 'x; out_module_type : 'y;
               out_phrase : 'z; out_sig_item : 'a1; out_type : 'b1;
               out_type_extension : 'c1; out_value : 'd1; pattern : 'e1;
               signature : 'f1; structure : 'g1; toplevel_phrase : 'h1;
               type_declaration : 'i1; type_extension : 'j1 >) migration_functions = {

``

`copy_structure : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_structure ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_structure`;`

``

`copy_signature : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_signature ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_signature`;`

``

`copy_toplevel_phrase : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_toplevel_phrase ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_toplevel_phrase`;`

``

`copy_core_type : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_core_type ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_core_type`;`

``

`copy_expression : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_expression ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_expression`;`

``

`copy_pattern : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_pattern ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_pattern`;`

``

`copy_case : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_case ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_case`;`

``

`copy_type_declaration : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_type_declaration ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_type_declaration`;`

``

`copy_type_extension : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_type_extension ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_type_extension`;`

``

`copy_extension_constructor : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_extension_constructor ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_extension_constructor`;`

``

`copy_out_value : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_value ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_value`;`

``

`copy_out_type : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_type ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_type`;`

``

`copy_out_class_type : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_class_type ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_class_type`;`

``

`copy_out_module_type : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_module_type ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_module_type`;`

``

`copy_out_sig_item : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_sig_item ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_sig_item`;`

``

`copy_out_type_extension : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_type_extension ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_type_extension`;`

``

`copy_out_phrase : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_out_phrase ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_out_phrase`;`

``

`copy_mapper : `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
get_mapper ->
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
get_mapper`;`

}
A record for migrating each AST construct between two known versions

    val migration_identity : (< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >,
            < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >)
           migration_functions

Migrating to the same version is no-op

    val migration_compose : (< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >,
            < case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
              mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
              out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
              out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
              toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >)
           migration_functions ->
           (< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
              mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
              out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
              out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
              toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >,
            < case : 'k1; core_type : 'l1; expression : 'm1;
              extension_constructor : 'n1; mapper : 'o1; out_class_type : 'p1;
              out_module_type : 'q1; out_phrase : 'r1; out_sig_item : 's1;
              out_type : 't1; out_type_extension : 'u1; out_value : 'v1; pattern : 'w1;
              signature : 'x1; structure : 'y1; toplevel_phrase : 'z1;
              type_declaration : 'a2; type_extension : 'b2 >)
           migration_functions ->
           (< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >,
            < case : 'k1; core_type : 'l1; expression : 'm1;
              extension_constructor : 'n1; mapper : 'o1; out_class_type : 'p1;
              out_module_type : 'q1; out_phrase : 'r1; out_sig_item : 's1;
              out_type : 't1; out_type_extension : 'u1; out_value : 'v1; pattern : 'w1;
              signature : 'x1; structure : 'y1; toplevel_phrase : 'z1;
              type_declaration : 'a2; type_extension : 'b2 >)
           migration_functions

Migrations can be composed
Represent the next or previous version of an Ast

    type 'from immediate_migration =

`|` | `No_migration : `'from0 immediate_migration`` | `(*` | Cannot migrate earliest or latest supported version | `*)`

`|`

`Immediate_migration : `(< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >,
< case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >)
migration_functions
* < case : 's; core_type : 't; expression : 'u;
extension_constructor : 'v; mapper : 'w; out_class_type : 'x;
out_module_type : 'y; out_phrase : 'z; out_sig_item : 'a1;
out_type : 'b1; out_type_extension : 'c1; out_value : 'd1;
pattern : 'e1; signature : 'f1; structure : 'g1;
toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
ocaml_version` -> `< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
type_declaration : 'q; type_extension : 'r >
immediate_migration``

`(*`

Pack the migration functions and the new version

`*)`

    val immediate_migration : < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
             mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
             out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
             pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
             type_declaration : 'q; type_extension : 'r >
           ocaml_version ->
           [< `Next | `Previous ] ->
           < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
             mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
             out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
             pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
             type_declaration : 'q; type_extension : 'r >
           immediate_migration

    val migrate : < case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
             mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
             out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
             pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
             type_declaration : 'q; type_extension : 'r >
           ocaml_version ->
           < case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
             mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
             out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
             out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
             toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >
           ocaml_version ->
           (< case : 'a; core_type : 'b; expression : 'c; extension_constructor : 'd;
              mapper : 'e; out_class_type : 'f; out_module_type : 'g; out_phrase : 'h;
              out_sig_item : 'i; out_type : 'j; out_type_extension : 'k; out_value : 'l;
              pattern : 'm; signature : 'n; structure : 'o; toplevel_phrase : 'p;
              type_declaration : 'q; type_extension : 'r >,
            < case : 's; core_type : 't; expression : 'u; extension_constructor : 'v;
              mapper : 'w; out_class_type : 'x; out_module_type : 'y; out_phrase : 'z;
              out_sig_item : 'a1; out_type : 'b1; out_type_extension : 'c1;
              out_value : 'd1; pattern : 'e1; signature : 'f1; structure : 'g1;
              toplevel_phrase : 'h1; type_declaration : 'i1; type_extension : 'j1 >)
           migration_functions

# Convenience definitions

    module Convert: functor (A : OCaml_version) -> functor (B : OCaml_version) -> sig .. end

Module level migration