123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729(* Yoann Padioleau
*
* Copyright (C) 2010 Facebook
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* version 2.1 as published by the Free Software Foundation, with the
* special exception on linking described in file license.txt.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the file
* license.txt for more details.
*)openCommonopenOcamlopenCst_js(*****************************************************************************)(* Prelude *)(*****************************************************************************)(* hooks *)typevisitor_in={kexpr:(expr->unit)*visitor_out->expr->unit;kstmt:(stmt->unit)*visitor_out->stmt->unit;kprop:(property->unit)*visitor_out->property->unit;kinfo:(tok->unit)*visitor_out->tok->unit;}andvisitor_out=any->unitletdefault_visitor={kexpr=(fun(k,_)x->kx);kstmt=(fun(k,_)x->kx);kinfo=(fun(k,_)x->kx);kprop=(fun(k,_)x->kx);}let(mk_visitor:visitor_in->visitor_out)=funvin->(* start of auto generation *)letrecv_infox=letkx=matchxwith{Parse_info.token=_v_pinfox;transfo=_v_transfo}->(*
let arg = Parse_info.v_pinfo v_pinfox in
let arg = v_unit v_comments in
let arg = Parse_info.v_transformation v_transfo in
*)()invin.kinfo(k,all_functions)xandv_tokv=v_infovandv_wrap:'a.('a->unit)->'awrap->unit=fun_of_a(v1,v2)->letv1=_of_av1andv2=v_infov2in()andv_angle:'a.('a->unit)->'aangle->unit=fun_of_a(v1,v2,v3)->letv1=v_tokv1andv2=_of_av2andv3=v_tokv3in()andv_paren:'a.('a->unit)->'aparen->unit=fun_of_a(v1,v2,v3)->letv1=v_tokv1andv2=_of_av2andv3=v_tokv3in()andv_brace:'a.('a->unit)->'abrace->unit=fun_of_a(v1,v2,v3)->letv1=v_tokv1andv2=_of_av2andv3=v_tokv3in()andv_bracket:'a.('a->unit)->'abracket->unit=fun_of_a(v1,v2,v3)->letv1=v_tokv1andv2=_of_av2andv3=v_tokv3in()andv_commax=v_tokxandv_comma_list:'a.('a->unit)->'acomma_list->unit=fun_of_axs->xs|>List.iter(function|Leftx->_of_ax|Rightinfo->v_commainfo)andv_scv=v_optionv_tokvandv_namev=v_wrapv_stringvandv_module_pathv=v_wrapv_stringvandv_expr(x:expr)=(* tweak *)letkx=matchxwith|Lv1->letv1=v_litteralv1in()|Vv1->letv1=v_namev1in()|Ellipsesv1->letv1=v_tokv1in()|Thisv1->letv1=v_tokv1in()|Superv1->letv1=v_tokv1in()|NewTarget((v1,v2,v3))->letv1=v_tokv1andv2=v_tokv2andv3=v_tokv3in()|U((v1,v2))->letv1=v_wrapv_unopv1andv2=v_exprv2in()|B((v1,v2,v3))->letv1=v_exprv1andv2=v_wrapv_binopv2andv3=v_exprv3in()|Bracket((v1,v2))->letv1=v_exprv1andv2=v_bracketv_exprv2in()|Period((v1,v2,v3))->letv1=v_exprv1andv2=v_tokv2andv3=v_namev3in()|Objectv1->letv1=v_brace(v_comma_listv_property)v1in()|Arrayv1->letv1=v_bracket(v_comma_listv_expr)v1in()|Apply((v1,v2))->letv1=v_exprv1andv2=v_paren(v_comma_listv_expr)v2in()|Conditional((v1,v2,v3,v4,v5))->letv1=v_exprv1andv2=v_tokv2andv3=v_exprv3andv4=v_tokv4andv5=v_exprv5in()|Assign((v1,v2,v3))->letv1=v_exprv1andv2=v_wrapv_assignment_operatorv2andv3=v_exprv3in()|Seq((v1,v2,v3))->letv1=v_exprv1andv2=v_tokv2andv3=v_exprv3in()|Functionv1->letv1=v_func_declv1in()|Classv1->letv1=v_class_declv1in()|Arrowv1->letv1=v_arrow_funcv1in()|Parenv1->letv1=v_parenv_exprv1in()|XhpHtmlv1->letv1=v_xhp_htmlv1in()|Encaps((v1,v2,v3,v4))->letv1=v_optionv_namev1andv2=v_tokv2andv3=v_listv_encapsv3andv4=v_tokv4in()|Yield((v1,v2,v3))->letv1=v_tokv1andv2=v_optionv_tokv2andv3=v_optionv_exprv3in()|Await((v1,v2))->letv1=v_tokv1andv2=v_exprv2in()invin.kexpr(k,all_functions)xandv_propertyx=letk=function|P_field(v1,v2,v3)->letv1=v_property_namev1andv2=v_tokv2andv3=v_exprv3in()|P_methodv1->letv1=v_func_declv1in()|P_shorthandv1->letv1=v_namev1in()|P_spread(v1,v2)->letv1=v_tokv1inletv2=v_exprv2in()invin.kprop(k,all_functions)xandv_litteral=function|Boolv1->letv1=v_wrapv_boolv1in()|Numv1->letv1=v_wrapv_stringv1in()|Stringv1->letv1=v_wrapv_stringv1in()|Regexpv1->letv1=v_wrapv_stringv1in()|Nullv1->letv1=v_tokv1in()andv_unop=function|U_new->()|U_delete->()|U_void->()|U_typeof->()|U_bitnot->()|U_pre_increment->()|U_pre_decrement->()|U_post_increment->()|U_post_decrement->()|U_plus->()|U_minus->()|U_not->()|U_spread->()andv_binop=function|B_instanceof->()|B_in->()|B_mul->()|B_expo->()|B_div->()|B_mod->()|B_add->()|B_sub->()|B_le->()|B_ge->()|B_lt->()|B_gt->()|B_lsr->()|B_asr->()|B_lsl->()|B_equal->()|B_notequal->()|B_physequal->()|B_physnotequal->()|B_bitand->()|B_bitor->()|B_bitxor->()|B_and->()|B_or->()andv_property_name=function|PN_Idv1->letv1=v_namev1in()|PN_Stringv1->letv1=v_namev1in()|PN_Numv1->letv1=v_wrapv_stringv1in()|PN_Computedv1->letv1=v_bracketv_exprv1in()andv_assignment_operator=function|A_eq->()|A_mul->()|A_div->()|A_mod->()|A_add->()|A_sub->()|A_lsl->()|A_lsr->()|A_asr->()|A_and->()|A_xor->()|A_or->()andv_xhp_html=function|Xhp((v1,v2,v3,v4,v5))->letv1=v_wrapv_xhp_tagv1andv2=v_listv_xhp_attributev2andv3=v_tokv3andv4=v_listv_xhp_bodyv4andv5=v_wrap(v_optionv_xhp_tag)v5in()|XhpSingleton((v1,v2,v3))->letv1=v_wrapv_xhp_tagv1andv2=v_listv_xhp_attributev2andv3=v_tokv3in()andv_xhp_attribute=function|XhpAttrValue((v1,v2,v3))->letv1=v_xhp_attr_namev1andv2=v_tokv2andv3=v_xhp_attr_valuev3in()|XhpAttrNoValue((v1))->letv1=v_xhp_attr_namev1in()|XhpAttrSpreadv1->letv1=v_brace(fun(v1,v2)->letv1=v_tokv1andv2=v_exprv2in())v1in()andv_xhp_attr_namev=v_wrapv_stringvandv_xhp_attr_value=function|XhpAttrStringv1->letv1=v_wrapv_stringv1in()|XhpAttrExprv1->letv1=v_bracev_exprv1in()andv_xhp_body=function|XhpTextv1->letv1=v_wrapv_stringv1in()|XhpExprv1->letv1=v_brace(v_optionv_expr)v1in()|XhpNestedv1->letv1=v_xhp_htmlv1in()andv_xhp_tagx=v_stringxandv_encaps=function|EncapsStringv1->letv1=v_wrapv_stringv1in()|EncapsExpr((v1,v2,v3))->letv1=v_tokv1andv2=v_exprv2andv3=v_tokv3in()andv_stx=letkx=matchxwith|VarsDecl((v1,v2,v3))->letv1=v_wrapv_var_kindv1andv2=v_comma_listv_var_bindingv2andv3=v_scv3in()|Blockv1->letv1=v_brace(v_listv_item)v1in()|Nopv1->letv1=v_scv1in()|ExprStmt((v1,v2))->letv1=v_exprv1andv2=v_scv2in()|If((v1,v2,v3,v4))->letv1=v_tokv1andv2=v_parenv_exprv2andv3=v_stv3andv4=v_option(fun(v1,v2)->letv1=v_tokv1andv2=v_stv2in())v4in()|Do((v1,v2,v3,v4,v5))->letv1=v_tokv1andv2=v_stv2andv3=v_tokv3andv4=v_parenv_exprv4andv5=v_scv5in()|While((v1,v2,v3))->letv1=v_tokv1andv2=v_parenv_exprv2andv3=v_stv3in()|For((v1,v2,v3,v4,v5,v6,v7,v8,v9))->letv1=v_tokv1andv2=v_tokv2andv3=v_optionv_lhs_or_varsv3andv4=v_tokv4andv5=v_optionv_exprv5andv6=v_tokv6andv7=v_optionv_exprv7andv8=v_tokv8andv9=v_stv9in()|ForIn((v1,v2,v3,v4,v5,v6,v7))->letv1=v_tokv1andv2=v_tokv2andv3=v_lhs_or_varv3andv4=v_tokv4andv5=v_exprv5andv6=v_tokv6andv7=v_stv7in()|ForOf((v1,v2,v3,v4,v5,v6,v7))->letv1=v_tokv1andv2=v_tokv2andv3=v_lhs_or_varv3andv4=v_tokv4andv5=v_exprv5andv6=v_tokv6andv7=v_stv7in()|Switch((v1,v2,v3))->letv1=v_tokv1andv2=v_parenv_exprv2andv3=v_brace(v_listv_case_clause)v3in()|Continue((v1,v2,v3))->letv1=v_tokv1andv2=v_optionv_labelv2andv3=v_scv3in()|Break((v1,v2,v3))->letv1=v_tokv1andv2=v_optionv_labelv2andv3=v_scv3in()|Return((v1,v2,v3))->letv1=v_tokv1andv2=v_optionv_exprv2andv3=v_scv3in()|With((v1,v2,v3))->letv1=v_tokv1andv2=v_parenv_exprv2andv3=v_stv3in()|Labeled((v1,v2,v3))->letv1=v_labelv1andv2=v_tokv2andv3=v_stv3in()|Throw((v1,v2,v3))->letv1=v_tokv1andv2=v_exprv2andv3=v_scv3in()|Try((v1,v2,v3,v4))->letv1=v_tokv1andv2=v_stv2andv3=v_option(fun(v1,v2,v3)->letv1=v_tokv1andv2=v_parenv_argv2andv3=v_stv3in())v3andv4=v_option(fun(v1,v2)->letv1=v_tokv1andv2=v_stv2in())v4in()invin.kstmt(k,all_functions)xandv_labelv=v_wrapv_stringvandv_lhs_or_vars=function|LHS1v1->letv1=v_exprv1in()|ForVars((v1,v2))->letv1=v_wrapv_var_kindv1andv2=v_comma_listv_var_bindingv2in()andv_lhs_or_var=function|LHS2v1->letv1=v_exprv1in()|ForVar((v1,v2))->letv1=v_wrapv_var_kindv1andv2=v_var_bindingv2in()andv_case_clause=function|Default((v1,v2,v3))->letv1=v_tokv1andv2=v_tokv2andv3=v_listv_itemv3in()|Case((v1,v2,v3,v4))->letv1=v_tokv1andv2=v_exprv2andv3=v_tokv3andv4=v_listv_itemv4in()andv_argv=v_wrapv_stringvandv_type_=function|TTodo->()|TNamev1->letv1=v_nominal_typev1in()|TQuestion((v1,v2))->letv1=v_tokv1andv2=v_type_v2in()|TFun((v1,v2,v3))->letv1=v_paren(v_comma_list(fun(v1,v2)->letv1=v_param_namev1andv2=v_annotationv2in()))v1andv2=v_tokv2andv3=v_type_v3in()|TObjv1->letv1=v_brace(v_list(fun(v1,v2,v3)->letv1=v_property_namev1andv2=v_annotationv2andv3=v_scv3in()))v1in()andv_param_name=function|RequiredParam(v1)->letv1=v_namev1in()|OptionalParam(v1,v2)->letv1=v_namev1andv2=v_tokv2in()|RestParam(v1,v2)->letv1=v_tokv1andv2=v_namev2in()andv_nominal_type((v1,v2))=letv1=v_exprv1inletv2=v_option(v_angle(v_comma_listv_type_))v2in()andv_type_optv=v_optionv_annotationvandv_annotation=function|TAnnot(v1,v2)->letv1=v_tokv1inletv2=v_type_v2in()|TFunAnnot(v1,v2,v3,v4)->letv1=v_option(v_angle(v_comma_listv_name))v1inletv2=v_paren(v_comma_list(fun(v1,v2)->letv1=v_param_namev1andv2=v_annotationv2in()))v2andv3=v_tokv3andv4=v_type_v4in()andv_func_decl{f_kind=v_f_kind;f_properties=v_f_properties;f_params=v_f_params;f_body=v_f_body;f_type_params=v_f_type_params;f_return_type=v_f_return_type}=letarg=v_func_kindv_f_kindinletarg=v_listv_func_propertyv_f_propertiesinletarg=v_paren(v_comma_listv_parameter_binding)v_f_paramsinletarg=v_brace(v_listv_item)v_f_bodyinletarg=v_optionv_type_parametersv_f_type_paramsinletarg=v_type_optv_f_return_typein()andv_type_parametersv=v_angle(v_comma_listv_type_parameter)vandv_type_parameterv=v_namevandv_func_kind=function|F_func((v1,v2))->letv1=v_tokv1andv2=v_optionv_namev2in()|F_methodv1->letv1=v_property_namev1in()|F_get((v1,v2))->letv1=v_tokv1andv2=v_property_namev2in()|F_set((v1,v2))->letv1=v_tokv1andv2=v_property_namev2in()andv_func_property=function|Generatorv1->letv1=v_tokv1in()|Asyncv1->letv1=v_tokv1in()andv_parameter_binding=function|ParamClassicv1->letv1=v_parameterv1in()|ParamPatternv1->letv1=v_parameter_patternv1in()andv_parameter_pattern{ppat=v_ppat;ppat_type=v_ppat_type;ppat_default=v_ppat_default}=letarg=v_patternv_ppatinletarg=v_type_optv_ppat_typeinletarg=v_option(fun(v1,v2)->letv1=v_tokv1andv2=v_exprv2in())v_ppat_defaultin()andv_parameter{p_name=v_p_name;p_type=v_p_type;p_default;p_dots}=letarg=v_optionv_defaultp_defaultinletarg=v_optionv_tokp_dotsinletarg=v_namev_p_nameinletarg=v_type_optv_p_typein()andv_default=function|DNonev1->let_=v_tokv1in()|DSome(v1,v2)->let_=v_tokv1and_=v_exprv2in()andv_arrow_func{a_params=v_a_params;a_return_type=v_a_return_type;a_tok=v_a_tok;a_body=v_a_body}=letarg=v_arrow_paramsv_a_paramsinletarg=v_type_optv_a_return_typeinletarg=v_tokv_a_tokinletarg=v_arrow_bodyv_a_bodyin()andv_arrow_params=function|ASingleParamv1->letv1=v_parameter_bindingv1in()|AParamsv1->letv1=v_paren(v_comma_listv_parameter_binding)v1in()andv_arrow_body=function|AExprv1->letv1=v_exprv1in()|ABodyv1->letv1=v_brace(v_listv_item)v1in()andv_var_kind=function|Var->()|Const->()|Let->()andv_var_binding=function|VarClassicv1->letv1=v_variable_declarationv1in()|VarPatternv1->letv1=v_variable_declaration_patternv1in()andv_init(v1,v2)=letv1=v_tokv1andv2=v_exprv2in()andv_variable_declaration_pattern{vpat=v_vpat;vpat_init=v_vpat_init;vpat_type=v_vpat_type}=letarg=v_patternv_vpatinletarg=v_optionv_initv_vpat_initinletarg=v_type_optv_vpat_typein()andv_pattern=function|PatObjv1->letv1=v_brace(v_comma_listv_pattern)v1in()|PatArrv1->letv1=v_bracket(v_comma_listv_pattern)v1in()|PatId((v1,v2))->letv1=v_namev1andv2=v_optionv_initv2in()|PatProp((v1,v2,v3))->letv1=v_property_namev1andv2=v_tokv2andv3=v_patternv3in()|PatDots((v1,v2))->letv1=v_tokv1andv2=v_patternv2in()|PatNest((v1,v2))->letv1=v_patternv1andv2=v_optionv_initv2in()andv_variable_declaration{v_name=v_v_name;v_init=v_v_init;v_type=v_v_type}=letarg=v_namev_v_nameinletarg=v_option(fun(v1,v2)->letv1=v_tokv1andv2=v_exprv2in())v_v_initinletarg=v_type_optv_v_typein()andv_class_decl{c_tok=v_c_tok;c_name=v_c_name;c_type_params=v_c_type_params;c_extends=v_c_extends;c_body=v_c_body}=letarg=v_tokv_c_tokinletarg=v_optionv_namev_c_nameinletarg=v_option(v_angle(v_comma_listv_name))v_c_type_paramsinletarg=v_option(fun(v1,v2)->letv1=v_tokv1andv2=v_nominal_typev2in())v_c_extendsinletarg=v_brace(v_listv_class_stmt)v_c_bodyin()andv_interface_decl{i_tok=v_i_tok;i_name=v_i_name;i_type_params=v_i_type_params;i_type=v_i_type;}=letarg=v_tokv_i_tokinletarg=v_namev_i_nameinletarg=v_option(v_angle(v_comma_listv_name))v_i_type_paramsinletarg=v_type_v_i_typein()andv_static_optv=v_optionv_tokvandv_field_decl{fld_static=v_fld_static;fld_name=v_fld_name;fld_type=v_fld_type;fld_init=v_fld_init}=letarg=v_static_optv_fld_staticinletarg=v_property_namev_fld_nameinletarg=v_type_optv_fld_typeinletarg=v_optionv_initv_fld_initin()andv_class_stmt=function|C_field((v1,v2))->letv1=v_field_declv1andv2=v_scv2in()|C_method((v1,v2))->letv1=v_optionv_tokv1andv2=v_func_declv2in()|C_extrasemicolonv1->letv1=v_scv1in()andv_item=function|ItemTodov1->letv1=v_tokv1in()|Stv1->letv1=v_stv1in()|FunDeclv1->letv1=v_func_declv1in()|ClassDeclv1->letv1=v_class_declv1in()|InterfaceDeclv1->letv1=v_interface_declv1in()andv_import=function|ImportFromv1->letv1=(matchv1with|(v1,v2)->letv1=v_import_clausev1andv2=(matchv2with|(v1,v2)->letv1=v_tokv1andv2=v_module_pathv2in())in())in()|ImportEffectv1->letv1=v_module_pathv1in()andv_import_clause(v1,v2)=letv1=v_optionv_import_defaultv1andv2=v_optionv_name_importv2in()andv_name_import=function|ImportNamespace((v1,v2,v3))->letv1=v_tokv1andv2=v_tokv2andv3=v_namev3in()|ImportNamesv1->letv1=v_brace(v_comma_listv_import_name)v1in()|ImportTypes(v1,v2)->letv1=v_tokv1andv2=v_brace(v_comma_listv_import_name)v2in()andv_import_defaultv=v_namevandv_import_name(v1,v2)=letv1=v_namev1andv2=v_option(fun(v1,v2)->letv1=v_tokv1andv2=v_namev2in())v2in()andv_export=function|ExportDeclv1->letv1=v_itemv1in()|ExportDefaultDecl((v1,v2))->letv1=v_tokv1andv2=v_itemv2in()|ExportDefaultExpr((v1,v2,v3))->letv1=v_tokv1andv2=v_exprv2andv3=v_scv3in()|ExportNames((v1,v2))->letv1=v_brace(v_comma_listv_import_name)v1andv2=v_scv2in()|ReExportNamespace((v1,v2,v3))->letv1=v_tokv1andv2=(matchv2with|(v1,v2)->letv1=v_tokv1andv2=v_module_pathv2in())andv3=v_scv3in()|ReExportNames((v1,v2,v3))->letv1=v_brace(v_comma_listv_import_name)v1andv2=(matchv2with|(v1,v2)->letv1=v_tokv1andv2=v_module_pathv2in())andv3=v_scv3in()andv_module_item=function|Itv1->letv1=v_itemv1in()|Importv1->letv1=(matchv1with|(v1,v2,v3)->letv1=v_tokv1andv2=v_importv2andv3=v_scv3in())in()|Exportv1->letv1=(matchv1with|(v1,v2)->letv1=v_tokv1andv2=v_exportv2in())in()andv_programv=v_listv_module_itemvandv_any=function|Exprv1->letv1=v_exprv1in()|Stmtv1->letv1=v_stv1in()|Patternv1->letv1=v_patternv1in()|Itemv1->letv1=v_itemv1in()|Programv1->letv1=v_programv1in()andall_functionsx=v_anyxinall_functions(*****************************************************************************)(* Helpers *)(*****************************************************************************)letdo_visit_with_refmk_hooks=funany->letres=ref[]inlethooks=mk_hooksresinletvout=mk_visitorhooksinvoutany;List.rev!res