module type Ast = sig ... end
Abstract view of a version of an OCaml Ast
type 'a _types = 'a constraint 'a = < structure : _; signature : _; toplevel_phrase : _; core_type : _; expression : _; pattern : _; case : _; type_declaration : _; type_extension : _; extension_constructor : _; out_value : _; out_type : _; out_class_type : _; out_module_type : _; out_sig_item : _; out_type_extension : _; out_phrase : _; mapper : _; >
type 'a get_structure = 'x constraint 'a _types = < structure : 'x; .. >
type 'a get_signature = 'x constraint 'a _types = < signature : 'x; .. >
type 'a get_toplevel_phrase = 'x constraint 'a _types = < toplevel_phrase : 'x; .. >
type 'a get_core_type = 'x constraint 'a _types = < core_type : 'x; .. >
type 'a get_expression = 'x constraint 'a _types = < expression : 'x; .. >
type 'a get_pattern = 'x constraint 'a _types = < pattern : 'x; .. >
type 'a get_case = 'x constraint 'a _types = < case : 'x; .. >
type 'a get_type_declaration = 'x constraint 'a _types = < type_declaration : 'x; .. >
type 'a get_type_extension = 'x constraint 'a _types = < type_extension : 'x; .. >
type 'a get_extension_constructor = 'x constraint 'a _types = < extension_constructor : 'x; .. >
type 'a get_out_value = 'x constraint 'a _types = < out_value : 'x; .. >
type 'a get_out_type = 'x constraint 'a _types = < out_type : 'x; .. >
type 'a get_out_class_type = 'x constraint 'a _types = < out_class_type : 'x; .. >
type 'a get_out_module_type = 'x constraint 'a _types = < out_module_type : 'x; .. >
type 'a get_out_sig_item = 'x constraint 'a _types = < out_sig_item : 'x; .. >
type 'a get_out_type_extension = 'x constraint 'a _types = < out_type_extension : 'x; .. >
type 'a get_out_phrase = 'x constraint 'a _types = < out_phrase : 'x; .. >
type 'a get_mapper = 'x constraint 'a _types = < mapper : 'x; .. >
A version of the OCaml frontend packs the ast with type witnesses so that equalities can be recovered dynamically.
module type OCaml_version = sig ... end
An OCaml frontend versions an Ast, version number and some witnesses for conversion.
type 'types ocaml_version = (module OCaml_version with type Ast.Ast_mapper.mapper = 'types get_mapper and type Ast.Outcometree.out_class_type = 'types get_out_class_type and type Ast.Outcometree.out_module_type = 'types get_out_module_type and type Ast.Outcometree.out_phrase = 'types get_out_phrase and type Ast.Outcometree.out_sig_item = 'types get_out_sig_item and type Ast.Outcometree.out_type = 'types get_out_type and type Ast.Outcometree.out_type_extension = 'types get_out_type_extension and type Ast.Outcometree.out_value = 'types get_out_value and type Ast.Parsetree.case = 'types get_case and type Ast.Parsetree.core_type = 'types get_core_type and type Ast.Parsetree.expression = 'types get_expression and type Ast.Parsetree.extension_constructor = 'types get_extension_constructor and type Ast.Parsetree.pattern = 'types get_pattern and type Ast.Parsetree.signature = 'types get_signature and type Ast.Parsetree.structure = 'types get_structure and type Ast.Parsetree.toplevel_phrase = 'types get_toplevel_phrase and type Ast.Parsetree.type_declaration = 'types get_type_declaration and type Ast.Parsetree.type_extension = 'types get_type_extension)
Representing an ocaml version in type language
Concrete frontend instances
module OCaml_402 : OCaml_version with module Ast = Migrate_parsetree.Ast_402
val ocaml_402 : OCaml_402.types ocaml_version
module OCaml_403 : OCaml_version with module Ast = Migrate_parsetree.Ast_403
val ocaml_403 : OCaml_403.types ocaml_version
module OCaml_404 : OCaml_version with module Ast = Migrate_parsetree.Ast_404
val ocaml_404 : OCaml_404.types ocaml_version
module OCaml_405 : OCaml_version with module Ast = Migrate_parsetree.Ast_405
val ocaml_405 : OCaml_405.types ocaml_version
module OCaml_406 : OCaml_version with module Ast = Migrate_parsetree.Ast_406
val ocaml_406 : OCaml_406.types ocaml_version
module OCaml_407 : OCaml_version with module Ast = Migrate_parsetree.Ast_407
val ocaml_407 : OCaml_407.types ocaml_version
module OCaml_408 : OCaml_version with module Ast = Migrate_parsetree.Ast_408
val ocaml_408 : OCaml_408.types ocaml_version
module OCaml_409 : OCaml_version with module Ast = Migrate_parsetree.Ast_409
val ocaml_409 : OCaml_409.types ocaml_version
module OCaml_410 : OCaml_version with module Ast = Migrate_parsetree.Ast_410
val ocaml_410 : OCaml_410.types ocaml_version
module OCaml_411 : OCaml_version with module Ast = Migrate_parsetree.Ast_411
val ocaml_411 : OCaml_411.types ocaml_version
module OCaml_current = OCaml_408
val ocaml_current : OCaml_current.types ocaml_version
val all_versions : (module OCaml_version) list
Migrating between different versions
type ('a, 'b) type_comparison =
| Lt : ('a, 'b) type_comparison |
| Eq : ('a, 'a) type_comparison |
| Gt : ('a, 'b) type_comparison |
val compare_ocaml_version : 'a ocaml_version -> 'b ocaml_version -> ('a, 'b) type_comparison
type ('from, 'to_) migration_functions = {
copy_structure : 'from get_structure -> 'to_ get_structure; |
copy_signature : 'from get_signature -> 'to_ get_signature; |
copy_toplevel_phrase : 'from get_toplevel_phrase -> 'to_ get_toplevel_phrase; |
copy_core_type : 'from get_core_type -> 'to_ get_core_type; |
copy_expression : 'from get_expression -> 'to_ get_expression; |
copy_pattern : 'from get_pattern -> 'to_ get_pattern; |
copy_case : 'from get_case -> 'to_ get_case; |
copy_type_declaration : 'from get_type_declaration -> 'to_ get_type_declaration; |
copy_type_extension : 'from get_type_extension -> 'to_ get_type_extension; |
copy_extension_constructor : 'from get_extension_constructor -> 'to_ get_extension_constructor; |
copy_out_value : 'from get_out_value -> 'to_ get_out_value; |
copy_out_type : 'from get_out_type -> 'to_ get_out_type; |
copy_out_class_type : 'from get_out_class_type -> 'to_ get_out_class_type; |
copy_out_module_type : 'from get_out_module_type -> 'to_ get_out_module_type; |
copy_out_sig_item : 'from get_out_sig_item -> 'to_ get_out_sig_item; |
copy_out_type_extension : 'from get_out_type_extension -> 'to_ get_out_type_extension; |
copy_out_phrase : 'from get_out_phrase -> 'to_ get_out_phrase; |
copy_mapper : 'from get_mapper -> 'to_ get_mapper; |
}
A record for migrating each AST construct between two known versions
val migration_identity : ('a, 'a) migration_functions
Migrating to the same version is no-op
val migration_compose : ('a, 'b) migration_functions -> ('b, 'c) migration_functions -> ('a, 'c) migration_functions
Migrations can be composed
type 'from immediate_migration =
| No_migration : 'from immediate_migration | Cannot migrate earliest or latest supported version |
| Immediate_migration : ('from, 'to_) migration_functions * 'to_ ocaml_version -> 'from immediate_migration | Pack the migration functions and the new version |
val immediate_migration : 'types ocaml_version -> [< `Next | `Previous ] -> 'types immediate_migration
val migrate : 'from ocaml_version -> 'to_ ocaml_version -> ('from, 'to_) migration_functions
Convenience definitions
module Convert : functor (A : OCaml_version) -> functor (B : OCaml_version) -> sig ... end
Module level migration