Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file versions.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581(**************************************************************************)(* *)(* 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_typetypeexpressiontypepatterntypecasetypetype_declarationtypetype_extensiontypeextension_constructorend(*$*)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:_;(*$*)>;;(*$ 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;..>(*$*)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;(*$*)>_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;(*$*)>_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_constructor(*$*))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:'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;(*$*)}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;(*$*)}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;(*$*)}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_constructor(*$*)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;(*$*)}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)(*$*)((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;(*$*)>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)(*$*)((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;(*$*)>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;(*$*)>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;(*$*)}:(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_402=structmoduleAst=Astlib.Ast_402includeMake_witness(Astlib.Ast_402)letversion=402letstring_version="4.02"endletocaml_402:OCaml_402.typesocaml_version=(moduleOCaml_402)moduleOCaml_403=structmoduleAst=Astlib.Ast_403includeMake_witness(Astlib.Ast_403)letversion=403letstring_version="4.03"endletocaml_403:OCaml_403.typesocaml_version=(moduleOCaml_403)moduleOCaml_404=structmoduleAst=Astlib.Ast_404includeMake_witness(Astlib.Ast_404)letversion=404letstring_version="4.04"endletocaml_404:OCaml_404.typesocaml_version=(moduleOCaml_404)moduleOCaml_405=structmoduleAst=Astlib.Ast_405includeMake_witness(Astlib.Ast_405)letversion=405letstring_version="4.05"endletocaml_405:OCaml_405.typesocaml_version=(moduleOCaml_405)moduleOCaml_406=structmoduleAst=Astlib.Ast_406includeMake_witness(Astlib.Ast_406)letversion=406letstring_version="4.06"endletocaml_406:OCaml_406.typesocaml_version=(moduleOCaml_406)moduleOCaml_407=structmoduleAst=Astlib.Ast_407includeMake_witness(Astlib.Ast_407)letversion=407letstring_version="4.07"endletocaml_407:OCaml_407.typesocaml_version=(moduleOCaml_407)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)(*$*)letall_versions:(moduleOCaml_version)list=[(*$foreach_version (fun n _ ->
printf "(module OCaml_%d : OCaml_version);\n" n)*)(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_%d)(OCaml_%d)\n" a b;
printf " (Astlib.Migrate_%d_%d)(Astlib.Migrate_%d_%d)\n" a b b a
)
*)includeRegister_migration(OCaml_402)(OCaml_403)(Astlib.Migrate_402_403)(Astlib.Migrate_403_402)includeRegister_migration(OCaml_403)(OCaml_404)(Astlib.Migrate_403_404)(Astlib.Migrate_404_403)includeRegister_migration(OCaml_404)(OCaml_405)(Astlib.Migrate_404_405)(Astlib.Migrate_405_404)includeRegister_migration(OCaml_405)(OCaml_406)(Astlib.Migrate_405_406)(Astlib.Migrate_406_405)includeRegister_migration(OCaml_406)(OCaml_407)(Astlib.Migrate_406_407)(Astlib.Migrate_407_406)includeRegister_migration(OCaml_407)(OCaml_408)(Astlib.Migrate_407_408)(Astlib.Migrate_408_407)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)(*$*)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)elselooptailinloopall_versionsend