123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718(**************************************************************************)(* *)(* OCaml Migrate Parsetree *)(* *)(* Frédéric Bour *)(* Jérémie Dimino, Jane Street Europe *)(* *)(* Copyright 2017 Institut National de Recherche en Informatique et *)(* en Automatique (INRIA). *)(* *)(* All rights reserved. This file is distributed under the terms of *)(* the GNU Lesser General Public License version 2.1, with the *)(* special exception on linking described in the file LICENSE. *)(* *)(**************************************************************************)(* BEGIN of BLACK MAGIC *)(*$ open Ast_cinaps_helpers $*)type_witnesses=..type_migration=..type_migration+=Undefined :_migrationtype'amigration_info={mutablenext_version:'amigration;mutableprevious_version:'amigration;}(** Abstract view of a version of an OCaml Ast *)moduletypeAst=sig(*$ foreach_module (fun m types ->
printf " module %s : sig\n" m;
List.iter types ~f:(printf " type %s\n");
printf " end\n"
)
*)moduleParsetree:sigtypestructuretypesignaturetypetoplevel_phrasetypecore_typetypeexpressiontypepatterntypecasetype type_declarationtypetype_extensiontypeextension_constructortypeclass_exprtypeclass_fieldtypeclass_typetypeclass_signaturetypeclass_type_fieldtypemodule_exprtypemodule_typetypesignature_itemtypestructure_itemend(*$*)moduleConfig:sigvalast_impl_magic_number:stringvalast_intf_magic_number:stringendend(* Shortcuts for talking about ast types outside of the module language *)type'a_types='aconstraint'a=<(*$ foreach_type (fun _ s -> printf " %-21s : _;\n" s) *)structure:_;signature:_;toplevel_phrase:_;core_type:_;expression:_;pattern:_;case:_;type_declaration:_;type_extension:_;extension_constructor:_;class_expr:_;class_field:_;class_type:_;class_signature:_;class_type_field:_;module_expr:_;module_type:_;signature_item:_;structure_item:_;(*$*)>;;(*$ foreach_type (fun _ s ->
printf "type 'a get_%s =\n" s;
printf " 'x constraint 'a _types = < %s : 'x; .. >\n" s
) *)type'aget_structure='xconstraint'a_types=<structure:'x;..>type'aget_signature='xconstraint'a_types=<signature:'x;..>type'aget_toplevel_phrase ='xconstraint'a_types=<toplevel_phrase:'x;..>type'aget_core_type='xconstraint'a_types=<core_type:'x;..>type'aget_expression='xconstraint'a_types=<expression:'x;..>type'aget_pattern='xconstraint'a_types=<pattern:'x;..>type'aget_case='xconstraint'a_types=<case:'x;..>type 'aget_type_declaration ='xconstraint'a_types=<type_declaration:'x;..>type'aget_type_extension ='xconstraint'a_types=<type_extension:'x;..>type'aget_extension_constructor ='xconstraint'a_types=<extension_constructor:'x;..>type'aget_class_expr='xconstraint'a_types=<class_expr:'x;..>type'aget_class_field ='xconstraint'a_types=<class_field:'x;..>type'aget_class_type='xconstraint'a_types=<class_type:'x;..>type'aget_class_signature ='xconstraint'a_types=<class_signature:'x;..>type'aget_class_type_field ='xconstraint'a_types=<class_type_field:'x;..>type'aget_module_expr ='xconstraint'a_types=<module_expr:'x;..>type'aget_module_type ='xconstraint'a_types=<module_type:'x;..>type'aget_signature_item ='xconstraint'a_types=<signature_item:'x;..>type'aget_structure_item ='xconstraint'a_types=<structure_item:'x;..>(*$*)moduletypeOCaml_version =sigmoduleAst:Astvalversion:intvalstring_version:stringtypetypes=<(*$ foreach_type (fun m s -> printf " %-21s : Ast.%s.%s;\n" s m s)*)structure:Ast.Parsetree.structure;signature:Ast.Parsetree.signature;toplevel_phrase:Ast.Parsetree.toplevel_phrase;core_type:Ast.Parsetree.core_type;expression:Ast.Parsetree.expression;pattern:Ast.Parsetree.pattern;case:Ast.Parsetree.case;type_declaration:Ast.Parsetree.type_declaration;type_extension:Ast.Parsetree.type_extension;extension_constructor:Ast.Parsetree.extension_constructor;class_expr:Ast.Parsetree.class_expr;class_field:Ast.Parsetree.class_field;class_type:Ast.Parsetree.class_type;class_signature:Ast.Parsetree.class_signature;class_type_field:Ast.Parsetree.class_type_field;module_expr:Ast.Parsetree.module_expr;module_type:Ast.Parsetree.module_type;signature_item:Ast.Parsetree.signature_item;structure_item:Ast.Parsetree.structure_item;(*$*)>_typestype_witnesses+=Version:typeswitnessesvalmigration_info:typesmigration_infoendmoduleMake_witness(Ast:Ast)=structtypetypes=<(*$ foreach_type (fun m s -> printf " %-21s : Ast.%s.%s;\n" s m s)*)structure:Ast.Parsetree.structure;signature:Ast.Parsetree.signature;toplevel_phrase:Ast.Parsetree.toplevel_phrase;core_type:Ast.Parsetree.core_type;expression:Ast.Parsetree.expression;pattern:Ast.Parsetree.pattern;case:Ast.Parsetree.case;type_declaration:Ast.Parsetree.type_declaration;type_extension:Ast.Parsetree.type_extension;extension_constructor:Ast.Parsetree.extension_constructor;class_expr:Ast.Parsetree.class_expr;class_field:Ast.Parsetree.class_field;class_type:Ast.Parsetree.class_type;class_signature:Ast.Parsetree.class_signature;class_type_field:Ast.Parsetree.class_type_field;module_expr:Ast.Parsetree.module_expr;module_type:Ast.Parsetree.module_type;signature_item:Ast.Parsetree.signature_item;structure_item:Ast.Parsetree.structure_item;(*$*)>_typestype_witnesses+=Version:typeswitnessesletmigration_info:typesmigration_info ={next_version=Undefined;previous_version=Undefined}endtype'typesocaml_version=(moduleOCaml_version(*$ let sep = with_then_and () in
foreach_type (fun m s ->
printf " %t type Ast.%s.%s = 'types get_%s\n" sep m s s) *)withtypeAst.Parsetree.structure='typesget_structureandtypeAst.Parsetree.signature='typesget_signatureandtypeAst.Parsetree.toplevel_phrase='typesget_toplevel_phraseandtypeAst.Parsetree.core_type='typesget_core_typeandtypeAst.Parsetree.expression='typesget_expressionandtypeAst.Parsetree.pattern='typesget_patternandtypeAst.Parsetree.case='typesget_caseandtypeAst.Parsetree.type_declaration='typesget_type_declarationandtypeAst.Parsetree.type_extension='typesget_type_extensionandtypeAst.Parsetree.extension_constructor='typesget_extension_constructorandtypeAst.Parsetree.class_expr='typesget_class_exprandtypeAst.Parsetree.class_field='typesget_class_fieldandtypeAst.Parsetree.class_type='typesget_class_typeandtypeAst.Parsetree.class_signature='typesget_class_signatureandtypeAst.Parsetree.class_type_field='typesget_class_type_fieldandtypeAst.Parsetree.module_expr='typesget_module_exprandtypeAst.Parsetree.module_type='typesget_module_typeandtypeAst.Parsetree.signature_item='typesget_signature_itemandtypeAst.Parsetree.structure_item='typesget_structure_item(*$*))type('from,'to_)migration_functions={(*$ foreach_type (fun _ s ->
printf " copy_%s: 'from get_%s -> 'to_ get_%s;\n" s s s) *)copy_structure:'fromget_structure->'to_get_structure;copy_signature:'from get_signature->'to_get_signature;copy_toplevel_phrase:'fromget_toplevel_phrase->'to_get_toplevel_phrase;copy_core_type:'fromget_core_type->'to_get_core_type;copy_expression:'fromget_expression->'to_get_expression;copy_pattern:'from get_pattern->'to_get_pattern;copy_case:'fromget_case->'to_get_case;copy_type_declaration:'fromget_type_declaration->'to_get_type_declaration;copy_type_extension:'fromget_type_extension->'to_get_type_extension;copy_extension_constructor:'fromget_extension_constructor->'to_get_extension_constructor;copy_class_expr:'fromget_class_expr->'to_get_class_expr;copy_class_field:'fromget_class_field->'to_get_class_field;copy_class_type:'fromget_class_type->'to_get_class_type;copy_class_signature:'fromget_class_signature->'to_get_class_signature;copy_class_type_field:'fromget_class_type_field->'to_get_class_type_field;copy_module_expr:'fromget_module_expr->'to_get_module_expr;copy_module_type:'fromget_module_type->'to_get_module_type;copy_signature_item:'fromget_signature_item->'to_get_signature_item;copy_structure_item:'fromget_structure_item->'to_get_structure_item;(*$*)}letidx=xletmigration_identity:('a,'a)migration_functions ={(*$ foreach_type (fun _ s -> printf " copy_%s = id;\n" s) *)copy_structure=id;copy_signature=id;copy_toplevel_phrase=id;copy_core_type=id;copy_expression=id;copy_pattern=id;copy_case=id;copy_type_declaration=id;copy_type_extension=id;copy_extension_constructor=id;copy_class_expr=id;copy_class_field=id;copy_class_type=id;copy_class_signature=id;copy_class_type_field=id;copy_module_expr=id;copy_module_type=id;copy_signature_item=id;copy_structure_item=id;(*$*)}letcomposefgx=f(gx)letmigration_compose (ab:('a,'b)migration_functions)(bc:('b,'c)migration_functions):('a,'c)migration_functions ={(*$ foreach_type (fun _ s ->
printf " copy_%-21s = compose bc.copy_%-21s ab.copy_%s;\n" s s s) *)copy_structure=composebc.copy_structureab.copy_structure;copy_signature=composebc.copy_signatureab.copy_signature;copy_toplevel_phrase=composebc.copy_toplevel_phraseab.copy_toplevel_phrase;copy_core_type=composebc.copy_core_typeab.copy_core_type;copy_expression=composebc.copy_expressionab.copy_expression;copy_pattern=composebc.copy_patternab.copy_pattern;copy_case=composebc.copy_caseab.copy_case;copy_type_declaration=composebc.copy_type_declarationab.copy_type_declaration;copy_type_extension=composebc.copy_type_extensionab.copy_type_extension;copy_extension_constructor=composebc.copy_extension_constructorab.copy_extension_constructor;copy_class_expr=composebc.copy_class_exprab.copy_class_expr;copy_class_field=composebc.copy_class_fieldab.copy_class_field;copy_class_type =composebc.copy_class_typeab.copy_class_type;copy_class_signature=composebc.copy_class_signatureab.copy_class_signature;copy_class_type_field=composebc.copy_class_type_fieldab.copy_class_type_field;copy_module_expr=composebc.copy_module_exprab.copy_module_expr;copy_module_type =composebc.copy_module_typeab.copy_module_type;copy_signature_item =composebc.copy_signature_itemab.copy_signature_item;copy_structure_item=composebc.copy_structure_itemab.copy_structure_item;(*$*)}type_migration+=Migration:'fromocaml_version*('from,'to_)migration_functions *'to_ocaml_version->'frommigrationmodule typeMigrate_module =sigmoduleFrom:AstmoduleTo:Ast(*$ foreach_type (fun m s ->
printf " val copy_%-21s: From.%s.%s -> To.%s.%s\n" s m s m s) *)valcopy_structure:From.Parsetree.structure->To.Parsetree.structurevalcopy_signature:From.Parsetree.signature->To.Parsetree.signaturevalcopy_toplevel_phrase :From.Parsetree.toplevel_phrase->To.Parsetree.toplevel_phrasevalcopy_core_type:From.Parsetree.core_type->To.Parsetree.core_typevalcopy_expression:From.Parsetree.expression->To.Parsetree.expressionvalcopy_pattern:From.Parsetree.pattern->To.Parsetree.patternvalcopy_case:From.Parsetree.case->To.Parsetree.casevalcopy_type_declaration :From.Parsetree.type_declaration->To.Parsetree.type_declarationvalcopy_type_extension :From.Parsetree.type_extension->To.Parsetree.type_extensionvalcopy_extension_constructor:From.Parsetree.extension_constructor->To.Parsetree.extension_constructorvalcopy_class_expr:From.Parsetree.class_expr->To.Parsetree.class_exprvalcopy_class_field :From.Parsetree.class_field->To.Parsetree.class_fieldvalcopy_class_type:From.Parsetree.class_type->To.Parsetree.class_typevalcopy_class_signature :From.Parsetree.class_signature->To.Parsetree.class_signaturevalcopy_class_type_field :From.Parsetree.class_type_field->To.Parsetree.class_type_fieldvalcopy_module_expr :From.Parsetree.module_expr->To.Parsetree.module_exprvalcopy_module_type :From.Parsetree.module_type->To.Parsetree.module_typevalcopy_signature_item :From.Parsetree.signature_item->To.Parsetree.signature_itemvalcopy_structure_item :From.Parsetree.structure_item->To.Parsetree.structure_item(*$*)endmoduleMigration_functions(A:OCaml_version)(B:OCaml_version)(A_to_B:Migrate_modulewithmoduleFrom=A.AstandmoduleTo=B.Ast)=structletmigration_functions:(A.types,B.types)migration_functions=letopenA_to_Bin{(*$ foreach_type (fun _ s -> printf " copy_%s;\n" s) *)copy_structure;copy_signature;copy_toplevel_phrase;copy_core_type;copy_expression;copy_pattern;copy_case;copy_type_declaration;copy_type_extension;copy_extension_constructor;copy_class_expr;copy_class_field;copy_class_type;copy_class_signature;copy_class_type_field;copy_module_expr;copy_module_type;copy_signature_item;copy_structure_item;(*$*)}endmoduleRegister_migration (A:OCaml_version)(B:OCaml_version)(A_to_B:Migrate_modulewithmoduleFrom=A.AstandmoduleTo=B.Ast)(B_to_A:Migrate_modulewithmoduleFrom=B.AstandmoduleTo=A.Ast)=structlet()=(letis_undefined:typea.amigration->bool=function|Undefined ->true|_->falseinassert(A.version<B.version);assert(is_undefinedA.migration_info.next_version);assert(is_undefinedB.migration_info.previous_version);letmoduleA_to_B_fun=Migration_functions(A)(B)(A_to_B)inletmoduleB_to_A_fun=Migration_functions(B)(A)(B_to_A)inA.migration_info.next_version<-Migration((moduleA),A_to_B_fun.migration_functions,(moduleB));B.migration_info.previous_version<-Migration((moduleB),B_to_A_fun.migration_functions,(moduleA));)endtype'fromimmediate_migration =|No_migration:'fromimmediate_migration|Immediate_migration:('from,'to_)migration_functions*'to_ocaml_version->'fromimmediate_migrationletimmediate_migration(*$ foreach_type (fun _ s -> printf " (type %s)\n" s) *)(typestructure)(typesignature)(typetoplevel_phrase)(typecore_type)(typeexpression)(typepattern)(typecase)(typetype_declaration)(typetype_extension)(typeextension_constructor)(typeclass_expr)(typeclass_field)(typeclass_type)(typeclass_signature)(typeclass_type_field)(typemodule_expr)(typemodule_type)(typesignature_item)(typestructure_item)(*$*)((moduleA):<(*$ foreach_type (fun _ s -> printf " %-21s : %s;\n" s s) *)structure:structure;signature:signature;toplevel_phrase:toplevel_phrase;core_type:core_type;expression:expression;pattern:pattern;case:case;type_declaration:type_declaration;type_extension:type_extension;extension_constructor:extension_constructor;class_expr:class_expr;class_field:class_field;class_type:class_type;class_signature:class_signature;class_type_field:class_type_field;module_expr:module_expr;module_type:module_type;signature_item:signature_item;structure_item:structure_item;(*$*)>ocaml_version)direction=letversion=matchdirectionwith|`Next->A.migration_info.next_version|`Previous->A.migration_info.previous_versioninmatchversionwith|Undefined->No_migration|Migration(_,funs,to_)->Immediate_migration(funs,to_)|_->assertfalseletmigrate(*$ foreach_type (fun _ s -> printf " (type %s1) (type %s2)\n" s s) *)(typestructure1)(typestructure2)(typesignature1)(typesignature2)(typetoplevel_phrase1)(typetoplevel_phrase2)(typecore_type1)(typecore_type2)(typeexpression1)(typeexpression2)(typepattern1)(typepattern2)(typecase1)(typecase2)(typetype_declaration1)(typetype_declaration2)(typetype_extension1)(typetype_extension2)(typeextension_constructor1)(typeextension_constructor2)(typeclass_expr1)(typeclass_expr2)(typeclass_field1)(typeclass_field2)(typeclass_type1)(typeclass_type2)(typeclass_signature1)(typeclass_signature2)(typeclass_type_field1)(typeclass_type_field2)(typemodule_expr1)(typemodule_expr2)(typemodule_type1)(typemodule_type2)(typesignature_item1)(typesignature_item2)(typestructure_item1)(typestructure_item2)(*$*)((moduleA):<(*$ foreach_type (fun _ s -> printf " %-21s : %s1;\n" s s) *)structure:structure1;signature:signature1;toplevel_phrase:toplevel_phrase1;core_type:core_type1;expression:expression1;pattern:pattern1;case:case1;type_declaration:type_declaration1;type_extension:type_extension1;extension_constructor:extension_constructor1;class_expr:class_expr1;class_field:class_field1;class_type:class_type1;class_signature:class_signature1;class_type_field :class_type_field1;module_expr:module_expr1;module_type:module_type1;signature_item:signature_item1;structure_item:structure_item1;(*$*)>ocaml_version)((moduleB):<(*$ foreach_type (fun _ s -> printf " %-21s : %s2;\n" s s) *)structure:structure2;signature:signature2;toplevel_phrase:toplevel_phrase2;core_type:core_type2;expression:expression2;pattern:pattern2;case:case2;type_declaration:type_declaration2;type_extension:type_extension2;extension_constructor:extension_constructor2;class_expr:class_expr2;class_field:class_field2;class_type:class_type2;class_signature:class_signature2;class_type_field :class_type_field2;module_expr:module_expr2;module_type:module_type2;signature_item:signature_item2;structure_item:structure_item2;(*$*)>ocaml_version):(A.types,B.types)migration_functions=matchA.Versionwith|B.Version->migration_identity|_->letdirection=ifA.version<B.versionthen`Nextelse`Previousinletrecmigrate(m:A.typesimmediate_migration):(A.types,B.types)migration_functions=matchmwith|No_migration->assertfalse|Immediate_migration(f,(moduleTo))->matchTo.Versionwith|B.Version->f|_->matchimmediate_migration(moduleTo)directionwith|No_migration ->assertfalse|Immediate_migration(g,to2)->migrate(Immediate_migration(migration_composefg,to2))inmigrate(immediate_migration(moduleA)direction)moduleConvert(A:OCaml_version)(B:OCaml_version)=structlet{(*$ foreach_type (fun _ s -> printf " copy_%s;\n" s) *)copy_structure;copy_signature;copy_toplevel_phrase;copy_core_type;copy_expression;copy_pattern;copy_case;copy_type_declaration;copy_type_extension;copy_extension_constructor;copy_class_expr;copy_class_field;copy_class_type;copy_class_signature;copy_class_type_field;copy_module_expr;copy_module_type;copy_signature_item;copy_structure_item;(*$*)}:(A.types,B.types)migration_functions=migrate(moduleA)(moduleB)end(*$ foreach_version (fun n version ->
printf "module OCaml_%d = struct\n" n;
printf " module Ast = Astlib.Ast_%d\n" n;
printf " include Make_witness(Astlib.Ast_%d)\n" n;
printf " let version = %d\n" n;
printf " let string_version = %S\n" version;
printf "end\n";
printf "let ocaml_%d : OCaml_%d.types ocaml_version = (module OCaml_%d)\n"
n n n;
)
*)moduleOCaml_408=structmoduleAst=Astlib.Ast_408includeMake_witness(Astlib.Ast_408)letversion=408letstring_version="4.08"endletocaml_408:OCaml_408.typesocaml_version =(moduleOCaml_408)moduleOCaml_409=structmoduleAst=Astlib.Ast_409includeMake_witness(Astlib.Ast_409)letversion=409letstring_version="4.09"endletocaml_409:OCaml_409.typesocaml_version =(moduleOCaml_409)moduleOCaml_410=structmoduleAst=Astlib.Ast_410includeMake_witness(Astlib.Ast_410)letversion=410letstring_version="4.10"endletocaml_410:OCaml_410.typesocaml_version =(moduleOCaml_410)moduleOCaml_411=structmoduleAst=Astlib.Ast_411includeMake_witness(Astlib.Ast_411)letversion=411letstring_version="4.11"endletocaml_411:OCaml_411.typesocaml_version =(moduleOCaml_411)moduleOCaml_412=structmoduleAst=Astlib.Ast_412includeMake_witness(Astlib.Ast_412)letversion=412letstring_version="4.12"endletocaml_412:OCaml_412.typesocaml_version =(moduleOCaml_412)moduleOCaml_413=structmoduleAst=Astlib.Ast_413includeMake_witness(Astlib.Ast_413)letversion=413letstring_version="4.13"endletocaml_413:OCaml_413.typesocaml_version =(moduleOCaml_413)moduleOCaml_414=structmoduleAst=Astlib.Ast_414includeMake_witness(Astlib.Ast_414)letversion=414letstring_version="4.14"endletocaml_414:OCaml_414.typesocaml_version =(moduleOCaml_414)moduleOCaml_500=structmoduleAst=Astlib.Ast_500includeMake_witness(Astlib.Ast_500)letversion=500letstring_version="5.0"endletocaml_500 :OCaml_500.typesocaml_version =(moduleOCaml_500)moduleOCaml_501=structmoduleAst=Astlib.Ast_501includeMake_witness(Astlib.Ast_501)letversion=501letstring_version="5.1"endletocaml_501 :OCaml_501.typesocaml_version =(moduleOCaml_501)moduleOCaml_502=structmoduleAst=Astlib.Ast_502includeMake_witness(Astlib.Ast_502)letversion=502letstring_version="5.2"endletocaml_502 :OCaml_502.typesocaml_version =(moduleOCaml_502)moduleOCaml_503=structmoduleAst=Astlib.Ast_503includeMake_witness(Astlib.Ast_503)letversion=503letstring_version="5.3"endletocaml_503 :OCaml_503.typesocaml_version =(moduleOCaml_503)(*$*)letall_versions:(moduleOCaml_version)list=[(*$foreach_version (fun n _ ->
printf "(module OCaml_%d : OCaml_version);\n" n)*)(moduleOCaml_408:OCaml_version);(moduleOCaml_409:OCaml_version);(moduleOCaml_410:OCaml_version);(moduleOCaml_411:OCaml_version);(moduleOCaml_412:OCaml_version);(moduleOCaml_413:OCaml_version);(moduleOCaml_414:OCaml_version);(moduleOCaml_500:OCaml_version);(moduleOCaml_501:OCaml_version);(moduleOCaml_502:OCaml_version);(moduleOCaml_503:OCaml_version);(*$*)](*$foreach_version_pair (fun a b ->
printf "include Register_migration(OCaml_%d)(OCaml_%d)\n" a b;
printf " (Astlib.Migrate_%d_%d)(Astlib.Migrate_%d_%d)\n" a b b a
)
*)includeRegister_migration(OCaml_408)(OCaml_409)(Astlib.Migrate_408_409)(Astlib.Migrate_409_408)includeRegister_migration(OCaml_409)(OCaml_410)(Astlib.Migrate_409_410)(Astlib.Migrate_410_409)includeRegister_migration(OCaml_410)(OCaml_411)(Astlib.Migrate_410_411)(Astlib.Migrate_411_410)includeRegister_migration(OCaml_411)(OCaml_412)(Astlib.Migrate_411_412)(Astlib.Migrate_412_411)includeRegister_migration(OCaml_412)(OCaml_413)(Astlib.Migrate_412_413)(Astlib.Migrate_413_412)includeRegister_migration(OCaml_413)(OCaml_414)(Astlib.Migrate_413_414)(Astlib.Migrate_414_413)includeRegister_migration(OCaml_414)(OCaml_500)(Astlib.Migrate_414_500)(Astlib.Migrate_500_414)includeRegister_migration(OCaml_500)(OCaml_501)(Astlib.Migrate_500_501)(Astlib.Migrate_501_500)includeRegister_migration(OCaml_501)(OCaml_502)(Astlib.Migrate_501_502)(Astlib.Migrate_502_501)includeRegister_migration(OCaml_502)(OCaml_503)(Astlib.Migrate_502_503)(Astlib.Migrate_503_502)(*$*)moduleOCaml_current =OCaml_OCAML_VERSIONmoduleFind_version =structtypet=Implof(moduleOCaml_version)|Intfof(moduleOCaml_version)|Unknownletfrom_magicmagic=letrecloop =function|[]->Unknown|(moduleVersion:OCaml_version)::tail->ifVersion.Ast.Config.ast_impl_magic_number=magicthenImpl(moduleVersion)elseifVersion.Ast.Config.ast_intf_magic_number=magicthenIntf(moduleVersion)elselooptailin(* Traverse the versions from last to first:
if the magic numbers aren't unique among versions,
we want the latest version with a magic number match.
The situation in mind is trunk support. *)letall_versions_top_down=List.revall_versions inloopall_versions_top_downend