Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file migrate_parsetree_versions.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801(**************************************************************************)(* *)(* 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 *)(*$ #use "src/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_typetypeexpressiontypepatterntypecasetypetype_declarationtypetype_extensiontypeextension_constructorendmoduleOutcometree:sigtypeout_valuetypeout_typetypeout_class_typetypeout_module_typetypeout_sig_itemtypeout_type_extensiontypeout_phraseendmoduleAst_mapper:sigtypemapperend(*$*)moduleConfig:sigvalast_impl_magic_number:stringvalast_intf_magic_number:stringendvalshallow_identity:Ast_mapper.mappervalmap_signature:Ast_mapper.mapper->Parsetree.signature->Parsetree.signaturevalmap_structure:Ast_mapper.mapper->Parsetree.structure->Parsetree.structurevalmake_top_mapper:signature:(Parsetree.signature->Parsetree.signature)->structure:(Parsetree.structure->Parsetree.structure)->Ast_mapper.mapperend(* 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:_;out_value:_;out_type:_;out_class_type:_;out_module_type:_;out_sig_item:_;out_type_extension:_;out_phrase:_;mapper:_;(*$*)>;;(*$ 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_out_value='xconstraint'a_types=<out_value:'x;..>type'aget_out_type='xconstraint'a_types=<out_type:'x;..>type'aget_out_class_type='xconstraint'a_types=<out_class_type:'x;..>type'aget_out_module_type='xconstraint'a_types=<out_module_type:'x;..>type'aget_out_sig_item='xconstraint'a_types=<out_sig_item:'x;..>type'aget_out_type_extension='xconstraint'a_types=<out_type_extension:'x;..>type'aget_out_phrase='xconstraint'a_types=<out_phrase:'x;..>type'aget_mapper='xconstraint'a_types=<mapper:'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;out_value:Ast.Outcometree.out_value;out_type:Ast.Outcometree.out_type;out_class_type:Ast.Outcometree.out_class_type;out_module_type:Ast.Outcometree.out_module_type;out_sig_item:Ast.Outcometree.out_sig_item;out_type_extension:Ast.Outcometree.out_type_extension;out_phrase:Ast.Outcometree.out_phrase;mapper:Ast.Ast_mapper.mapper;(*$*)>_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;out_value:Ast.Outcometree.out_value;out_type:Ast.Outcometree.out_type;out_class_type:Ast.Outcometree.out_class_type;out_module_type:Ast.Outcometree.out_module_type;out_sig_item:Ast.Outcometree.out_sig_item;out_type_extension:Ast.Outcometree.out_type_extension;out_phrase:Ast.Outcometree.out_phrase;mapper:Ast.Ast_mapper.mapper;(*$*)>_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.Outcometree.out_value='typesget_out_valueandtypeAst.Outcometree.out_type='typesget_out_typeandtypeAst.Outcometree.out_class_type='typesget_out_class_typeandtypeAst.Outcometree.out_module_type='typesget_out_module_typeandtypeAst.Outcometree.out_sig_item='typesget_out_sig_itemandtypeAst.Outcometree.out_type_extension='typesget_out_type_extensionandtypeAst.Outcometree.out_phrase='typesget_out_phraseandtypeAst.Ast_mapper.mapper='typesget_mapper(*$*))type('a,'b)type_comparison=|Lt:('a,'b)type_comparison|Eq:('a,'a)type_comparison|Gt:('a,'b)type_comparisonletcompare_ocaml_version(*$ 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)(typeout_value1)(typeout_value2)(typeout_type1)(typeout_type2)(typeout_class_type1)(typeout_class_type2)(typeout_module_type1)(typeout_module_type2)(typeout_sig_item1)(typeout_sig_item2)(typeout_type_extension1)(typeout_type_extension2)(typeout_phrase1)(typeout_phrase2)(typemapper1)(typemapper2)(*$*)((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;out_value:out_value1;out_type:out_type1;out_class_type:out_class_type1;out_module_type:out_module_type1;out_sig_item:out_sig_item1;out_type_extension:out_type_extension1;out_phrase:out_phrase1;mapper:mapper1;(*$*)>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;out_value:out_value2;out_type:out_type2;out_class_type:out_class_type2;out_module_type:out_module_type2;out_sig_item:out_sig_item2;out_type_extension:out_type_extension2;out_phrase:out_phrase2;mapper:mapper2;(*$*)>ocaml_version):(A.types,B.types)type_comparison=matchA.Versionwith|B.Version->Eq|_whenA.version<B.version->Lt|_whenA.version>B.version->Gt|_->assertfalsetype('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:'fromget_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:'fromget_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_out_value:'fromget_out_value->'to_get_out_value;copy_out_type:'fromget_out_type->'to_get_out_type;copy_out_class_type:'fromget_out_class_type->'to_get_out_class_type;copy_out_module_type:'fromget_out_module_type->'to_get_out_module_type;copy_out_sig_item:'fromget_out_sig_item->'to_get_out_sig_item;copy_out_type_extension:'fromget_out_type_extension->'to_get_out_type_extension;copy_out_phrase:'fromget_out_phrase->'to_get_out_phrase;copy_mapper:'fromget_mapper->'to_get_mapper;(*$*)}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_out_value=id;copy_out_type=id;copy_out_class_type=id;copy_out_module_type=id;copy_out_sig_item=id;copy_out_type_extension=id;copy_out_phrase=id;copy_mapper=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_out_value=composebc.copy_out_valueab.copy_out_value;copy_out_type=composebc.copy_out_typeab.copy_out_type;copy_out_class_type=composebc.copy_out_class_typeab.copy_out_class_type;copy_out_module_type=composebc.copy_out_module_typeab.copy_out_module_type;copy_out_sig_item=composebc.copy_out_sig_itemab.copy_out_sig_item;copy_out_type_extension=composebc.copy_out_type_extensionab.copy_out_type_extension;copy_out_phrase=composebc.copy_out_phraseab.copy_out_phrase;copy_mapper=composebc.copy_mapperab.copy_mapper;(*$*)}type_migration+=Migration:'fromocaml_version*('from,'to_)migration_functions*'to_ocaml_version->'frommigrationmoduletypeMigrate_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_out_value:From.Outcometree.out_value->To.Outcometree.out_valuevalcopy_out_type:From.Outcometree.out_type->To.Outcometree.out_typevalcopy_out_class_type:From.Outcometree.out_class_type->To.Outcometree.out_class_typevalcopy_out_module_type:From.Outcometree.out_module_type->To.Outcometree.out_module_typevalcopy_out_sig_item:From.Outcometree.out_sig_item->To.Outcometree.out_sig_itemvalcopy_out_type_extension:From.Outcometree.out_type_extension->To.Outcometree.out_type_extensionvalcopy_out_phrase:From.Outcometree.out_phrase->To.Outcometree.out_phrasevalcopy_mapper:From.Ast_mapper.mapper->To.Ast_mapper.mapper(*$*)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_out_value;copy_out_type;copy_out_class_type;copy_out_module_type;copy_out_sig_item;copy_out_type_extension;copy_out_phrase;copy_mapper;(*$*)}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)(typeout_value)(typeout_type)(typeout_class_type)(typeout_module_type)(typeout_sig_item)(typeout_type_extension)(typeout_phrase)(typemapper)(*$*)((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;out_value:out_value;out_type:out_type;out_class_type:out_class_type;out_module_type:out_module_type;out_sig_item:out_sig_item;out_type_extension:out_type_extension;out_phrase:out_phrase;mapper:mapper;(*$*)>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)(typeout_value1)(typeout_value2)(typeout_type1)(typeout_type2)(typeout_class_type1)(typeout_class_type2)(typeout_module_type1)(typeout_module_type2)(typeout_sig_item1)(typeout_sig_item2)(typeout_type_extension1)(typeout_type_extension2)(typeout_phrase1)(typeout_phrase2)(typemapper1)(typemapper2)(*$*)((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;out_value:out_value1;out_type:out_type1;out_class_type:out_class_type1;out_module_type:out_module_type1;out_sig_item:out_sig_item1;out_type_extension:out_type_extension1;out_phrase:out_phrase1;mapper:mapper1;(*$*)>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;out_value:out_value2;out_type:out_type2;out_class_type:out_class_type2;out_module_type:out_module_type2;out_sig_item:out_sig_item2;out_type_extension:out_type_extension2;out_phrase:out_phrase2;mapper:mapper2;(*$*)>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_out_value;copy_out_type;copy_out_class_type;copy_out_module_type;copy_out_sig_item;copy_out_type_extension;copy_out_phrase;copy_mapper;(*$*)}:(A.types,B.types)migration_functions=migrate(moduleA)(moduleB)end(*$ foreach_version (fun suffix version ->
printf "module OCaml_%s = struct\n" suffix;
printf " module Ast = Ast_%s\n" suffix;
printf " include Make_witness(Ast_%s)\n" suffix;
printf " let version = %s\n" suffix;
printf " let string_version = %S\n" version;
printf "end\n";
printf "let ocaml_%s : OCaml_%s.types ocaml_version = (module OCaml_%s)\n"
suffix suffix suffix;
)
*)moduleOCaml_402=structmoduleAst=Ast_402includeMake_witness(Ast_402)letversion=402letstring_version="4.02"endletocaml_402:OCaml_402.typesocaml_version=(moduleOCaml_402)moduleOCaml_403=structmoduleAst=Ast_403includeMake_witness(Ast_403)letversion=403letstring_version="4.03"endletocaml_403:OCaml_403.typesocaml_version=(moduleOCaml_403)moduleOCaml_404=structmoduleAst=Ast_404includeMake_witness(Ast_404)letversion=404letstring_version="4.04"endletocaml_404:OCaml_404.typesocaml_version=(moduleOCaml_404)moduleOCaml_405=structmoduleAst=Ast_405includeMake_witness(Ast_405)letversion=405letstring_version="4.05"endletocaml_405:OCaml_405.typesocaml_version=(moduleOCaml_405)moduleOCaml_406=structmoduleAst=Ast_406includeMake_witness(Ast_406)letversion=406letstring_version="4.06"endletocaml_406:OCaml_406.typesocaml_version=(moduleOCaml_406)moduleOCaml_407=structmoduleAst=Ast_407includeMake_witness(Ast_407)letversion=407letstring_version="4.07"endletocaml_407:OCaml_407.typesocaml_version=(moduleOCaml_407)moduleOCaml_408=structmoduleAst=Ast_408includeMake_witness(Ast_408)letversion=408letstring_version="4.08"endletocaml_408:OCaml_408.typesocaml_version=(moduleOCaml_408)moduleOCaml_409=structmoduleAst=Ast_409includeMake_witness(Ast_409)letversion=409letstring_version="4.09"endletocaml_409:OCaml_409.typesocaml_version=(moduleOCaml_409)moduleOCaml_410=structmoduleAst=Ast_410includeMake_witness(Ast_410)letversion=410letstring_version="4.10"endletocaml_410:OCaml_410.typesocaml_version=(moduleOCaml_410)moduleOCaml_411=structmoduleAst=Ast_411includeMake_witness(Ast_411)letversion=411letstring_version="4.11"endletocaml_411:OCaml_411.typesocaml_version=(moduleOCaml_411)moduleOCaml_412=structmoduleAst=Ast_412includeMake_witness(Ast_412)letversion=412letstring_version="4.12"endletocaml_412:OCaml_412.typesocaml_version=(moduleOCaml_412)moduleOCaml_413=structmoduleAst=Ast_413includeMake_witness(Ast_413)letversion=413letstring_version="4.13"endletocaml_413:OCaml_413.typesocaml_version=(moduleOCaml_413)moduleOCaml_414=structmoduleAst=Ast_414includeMake_witness(Ast_414)letversion=414letstring_version="4.14"endletocaml_414:OCaml_414.typesocaml_version=(moduleOCaml_414)moduleOCaml_500=structmoduleAst=Ast_500includeMake_witness(Ast_500)letversion=500letstring_version="5.0"endletocaml_500:OCaml_500.typesocaml_version=(moduleOCaml_500)(*$*)letall_versions:(moduleOCaml_version)list=[(*$foreach_version (fun suffix _ ->
printf "(module OCaml_%s : OCaml_version);\n" suffix)*)(moduleOCaml_402:OCaml_version);(moduleOCaml_403:OCaml_version);(moduleOCaml_404:OCaml_version);(moduleOCaml_405:OCaml_version);(moduleOCaml_406:OCaml_version);(moduleOCaml_407:OCaml_version);(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);(*$*)](*$foreach_version_pair (fun a b ->
printf "include Register_migration(OCaml_%s)(OCaml_%s)\n" a b;
printf " (Migrate_parsetree_%s_%s)(Migrate_parsetree_%s_%s)\n" a b b a
)
*)includeRegister_migration(OCaml_402)(OCaml_403)(Migrate_parsetree_402_403)(Migrate_parsetree_403_402)includeRegister_migration(OCaml_403)(OCaml_404)(Migrate_parsetree_403_404)(Migrate_parsetree_404_403)includeRegister_migration(OCaml_404)(OCaml_405)(Migrate_parsetree_404_405)(Migrate_parsetree_405_404)includeRegister_migration(OCaml_405)(OCaml_406)(Migrate_parsetree_405_406)(Migrate_parsetree_406_405)includeRegister_migration(OCaml_406)(OCaml_407)(Migrate_parsetree_406_407)(Migrate_parsetree_407_406)includeRegister_migration(OCaml_407)(OCaml_408)(Migrate_parsetree_407_408)(Migrate_parsetree_408_407)includeRegister_migration(OCaml_408)(OCaml_409)(Migrate_parsetree_408_409)(Migrate_parsetree_409_408)includeRegister_migration(OCaml_409)(OCaml_410)(Migrate_parsetree_409_410)(Migrate_parsetree_410_409)includeRegister_migration(OCaml_410)(OCaml_411)(Migrate_parsetree_410_411)(Migrate_parsetree_411_410)includeRegister_migration(OCaml_411)(OCaml_412)(Migrate_parsetree_411_412)(Migrate_parsetree_412_411)includeRegister_migration(OCaml_412)(OCaml_413)(Migrate_parsetree_412_413)(Migrate_parsetree_413_412)includeRegister_migration(OCaml_413)(OCaml_414)(Migrate_parsetree_413_414)(Migrate_parsetree_414_413)includeRegister_migration(OCaml_414)(OCaml_500)(Migrate_parsetree_414_500)(Migrate_parsetree_500_414)(*$*)moduleOCaml_current=OCaml_OCAML_VERSIONletocaml_current:OCaml_current.typesocaml_version=(moduleOCaml_current)(* Make sure the preprocessing worked as expected *)let_f(x:Parsetree.expression):OCaml_current.Ast.Parsetree.expression=x