(* 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. *) open Ocaml open Ast_cpp (*****************************************************************************) (* Prelude *) (*****************************************************************************) (*****************************************************************************) (* Types *) (*****************************************************************************) (* hooks *) type visitor_in = { kexpr: expression vin; kstmt: statement vin; kinit: initialiser vin; ktypeC: typeC vin; kclass_member: class_member vin; kfieldkind: fieldkind vin; kparameter: parameter vin; kcompound: compound vin; kclass_def: class_definition vin; kfunc_def: func_definition vin; kcpp: cpp_directive vin; kblock_decl: block_declaration vin; kdeclaration: declaration vin; ktoplevel: toplevel vin; kinfo: tok vin; } and visitor_out = any -> unit and 'a vin = ('a -> unit) * visitor_out -> 'a -> unit let default_visitor = { kexpr = (fun (k,_) x -> k x); kfieldkind = (fun (k,_) x -> k x); kparameter = (fun (k,_) x -> k x); ktypeC = (fun (k,_) x -> k x); kblock_decl = (fun (k,_) x -> k x); kcompound = (fun (k,_) x -> k x); kstmt = (fun (k,_) x -> k x); kinfo = (fun (k,_) x -> k x); kclass_def = (fun (k,_) x -> k x); kfunc_def = (fun (k,_) x -> k x); kclass_member = (fun (k,_) x -> k x); kcpp = (fun (k,_) x -> k x); kdeclaration = (fun (k,_) x -> k x); ktoplevel = (fun (k,_) x -> k x); kinit = (fun (k,_) x -> k x); } let (mk_visitor: visitor_in -> visitor_out) = fun vin -> (* start of auto generation *) (* generated by ocamltarzan with: camlp4o -o /tmp/yyy.ml -I pa/ pa_type_conv.cmo pa_visitor.cmo pr_o.cmo /tmp/xxx.ml *) let rec v_info x = let k _ = () in vin.kinfo (k, all_functions) x and v_tok v = v_info v and v_wrap:'a. ('a -> unit) -> 'a wrap -> unit = fun _of_a (v1, v2) -> let v1 = _of_a v1 and v2 = v_list v_info v2 in () and v_wrap2:'a. ('a -> unit) -> 'a wrap2 -> unit = fun _of_a (v1, v2) -> let v1 = _of_a v1 and v2 = v_info v2 in () and v_paren:'a. ('a -> unit) -> 'a paren -> unit = fun _of_a (v1, v2, v3) -> let v1 = v_tok v1 and v2 = _of_a v2 and v3 = v_tok v3 in () and v_brace: 'a. ('a -> unit) -> 'a brace -> unit = fun _of_a (v1, v2, v3) -> let v1 = v_tok v1 and v2 = _of_a v2 and v3 = v_tok v3 in () and v_bracket: 'a. ('a -> unit) -> 'a bracket -> unit = fun _of_a (v1, v2, v3) -> let v1 = v_tok v1 and v2 = _of_a v2 and v3 = v_tok v3 in () and v_angle: 'a. ('a -> unit) -> 'a angle -> unit = fun _of_a (v1, v2, v3) -> let v1 = v_tok v1 and v2 = _of_a v2 and v3 = v_tok v3 in () and v_comma_list: 'a. ('a -> unit) -> 'a comma_list -> unit = fun _of_a -> v_list (v_wrap _of_a) and v_comma_list2: 'a. ('a -> unit) -> 'a comma_list2 -> unit = fun _of_a -> v_list (Ocaml.v_either _of_a v_tok) and v_name (v1, v2, v3) = let v1 = v_option v_tok v1 and v2 = v_list (fun (v1, v2) -> let v1 = v_qualifier v1 and v2 = v_tok v2 in ()) v2 and v3 = v_ident v3 in () and v_ident = function | IdIdent v1 -> let v1 = v_wrap2 v_string v1 in () | IdOperator ((v1, v2)) -> let v1 = v_tok v1 and v2 = (match v2 with | (v1, v2) -> let v1 = v_operator v1 and v2 = v_list v_tok v2 in ()) in () | IdConverter ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_fullType v2 in () | IdDestructor ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 in () | IdTemplateId ((v1, v2)) -> let v1 = v_wrap2 v_string v1 and v2 = v_template_arguments v2 in () and v_template_arguments v = v_angle (v_comma_list v_template_argument) v and v_template_argument v = Ocaml.v_either v_fullType v_expression v and v_either_ft_or_expr v = Ocaml.v_either v_fullType v_expression v and v_qualifier = function | QClassname v1 -> let v1 = v_wrap2 v_string v1 in () | QTemplateId ((v1, v2)) -> let v1 = v_wrap2 v_string v1 and v2 = v_template_arguments v2 in () and v_class_name v = v_name v and v_namespace_name v = v_name v and v_typedef_name v = v_name v and v_enum_name v = v_name v and v_ident_name v = v_name v and v_fullType (v1, v2) = let v1 = v_typeQualifier v1 and v2 = v_typeC v2 in () and v_typeC v = let k v = v_wrap v_typeCbis v in vin.ktypeC (k, all_functions) v and v_typeCbis = function | BaseType v1 -> let v1 = v_baseType v1 in () | Pointer v1 -> let v1 = v_fullType v1 in () | Reference v1 -> let v1 = v_fullType v1 in () | Array ((v1, v2)) -> let v1 = v_bracket (v_option v_constExpression) v1 and v2 = v_fullType v2 in () | FunctionType v1 -> let v1 = v_functionType v1 in () | EnumDef ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_option (v_wrap2 v_string) v2 and v3 = v_brace (v_comma_list v_enum_elem) v3 in () | StructDef v1 -> let v1 = v_class_definition v1 in () | EnumName ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 in () | StructUnionName ((v1, v2)) -> let v1 = v_wrap2 v_structUnion v1 and v2 = v_wrap2 v_string v2 in () | TypeName ((v1)) -> let v1 = v_name v1 in () | TypenameKwd ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_name v2 in () | TypeOf ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_paren v_either_ft_or_expr v2 in () | ParenType v1 -> let v1 = v_paren v_fullType v1 in () and v_baseType = function | Void -> () | IntType v1 -> let v1 = v_intType v1 in () | FloatType v1 -> let v1 = v_floatType v1 in () and v_intType = function | CChar -> () | Si v1 -> let v1 = v_signed v1 in () | CBool -> () | WChar_t -> () and v_signed (v1, v2) = let v1 = v_sign v1 and v2 = v_base v2 in () and v_base = function | CChar2 -> () | CShort -> () | CInt -> () | CLong -> () | CLongLong -> () and v_sign = function | Signed -> () | UnSigned -> () and v_floatType = function | CFloat -> () | CDouble -> () | CLongDouble -> () and v_enum_elem { e_name = v_e_name; e_val = v_e_val } = let arg = v_wrap2 v_string v_e_name in let arg = v_option (fun (v1, v2) -> let v1 = v_tok v1 and v2 = v_constExpression v2 in ()) v_e_val in () and v_typeQualifier { const = v_const; volatile = v_volatile } = let arg = v_option v_tok v_const in let arg = v_option v_tok v_volatile in () and v_expression v = let k x = v_wrap v_expressionbis x in vin.kexpr (k, all_functions) v and v_expressionbis = function | Id ((v1, v2)) -> let v1 = v_name v1 and v2 = v_ident_info v2 in () | C v1 -> let v1 = v_constant v1 in () | Call ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_paren (v_comma_list v_argument) v2 in () | CondExpr ((v1, v2, v3)) -> let v1 = v_expression v1 and v2 = v_option v_expression v2 and v3 = v_expression v3 in () | Sequence ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_expression v2 in () | Assignment ((v1, v2, v3)) -> let v1 = v_expression v1 and v2 = v_assignOp v2 and v3 = v_expression v3 in () | Postfix ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_fixOp v2 in () | Infix ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_fixOp v2 in () | Unary ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_unaryOp v2 in () | Binary ((v1, v2, v3)) -> let v1 = v_expression v1 and v2 = v_binaryOp v2 and v3 = v_expression v3 in () | ArrayAccess ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_bracket v_expression v2 in () | RecordAccess ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_name v2 in () | RecordPtAccess ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_name v2 in () | RecordStarAccess ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_expression v2 in () | RecordPtStarAccess ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_expression v2 in () | SizeOfExpr ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_expression v2 in () | SizeOfType ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_paren v_fullType v2 in () | Cast ((v1, v2)) -> let v1 = v_paren v_fullType v1 and v2 = v_expression v2 in () | StatementExpr v1 -> let v1 = v_paren v_compound v1 in () | GccConstructor ((v1, v2)) -> let v1 = v_paren v_fullType v1 and v2 = v_brace (v_comma_list v_initialiser) v2 in () | This v1 -> let v1 = v_tok v1 in () | ConstructedObject ((v1, v2)) -> let v1 = v_fullType v1 and v2 = v_paren (v_comma_list v_argument) v2 in () | TypeId ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_paren v_either_ft_or_expr v2 in () | CplusplusCast ((v1, v2, v3)) -> let v1 = v_wrap2 v_cast_operator v1 and v2 = v_angle v_fullType v2 and v3 = v_paren v_expression v3 in () | New ((v1, v2, v3, v4, v5)) -> let v1 = v_option v_tok v1 and v2 = v_tok v2 and v3 = v_option (v_paren (v_comma_list v_argument)) v3 and v4 = v_fullType v4 and v5 = v_option (v_paren (v_comma_list v_argument)) v5 in () | Delete ((v1, v2)) -> let v1 = v_option v_tok v1 and v2 = v_expression v2 in () | DeleteArray ((v1, v2)) -> let v1 = v_option v_tok v1 and v2 = v_expression v2 in () | Throw v1 -> let v1 = v_option v_expression v1 in () | ParenExpr v1 -> let v1 = v_paren v_expression v1 in () | ExprTodo -> () and v_ident_info { i_scope = _v_i_scope } = (* todo? let arg = Scope_code.v_scope v_i_scope in () *) () and v_argument v = Ocaml.v_either v_expression v_weird_argument v and v_weird_argument = function | ArgType v1 -> let v1 = v_fullType v1 in () | ArgAction v1 -> let v1 = v_action_macro v1 in () and v_action_macro = function | ActMisc v1 -> let v1 = v_list v_tok v1 in () and v_constant = function | String v1 -> let v1 = (match v1 with | (v1, v2) -> let v1 = v_string v1 and v2 = v_isWchar v2 in ()) in () | MultiString -> () | Char v1 -> let v1 = (match v1 with | (v1, v2) -> let v1 = v_string v1 and v2 = v_isWchar v2 in ()) in () | Int v1 -> let v1 = v_string v1 in () | Float v1 -> let v1 = (match v1 with | (v1, v2) -> let v1 = v_string v1 and v2 = v_floatType v2 in ()) in () | Bool v1 -> let v1 = v_bool v1 in () and v_isWchar = function | IsWchar -> () | IsChar -> () and v_unaryOp = function | GetRef -> () | DeRef -> () | UnPlus -> () | UnMinus -> () | Tilde -> () | Not -> () | GetRefLabel -> () and v_assignOp = function | SimpleAssign -> () | OpAssign v1 -> let v1 = v_arithOp v1 in () and v_fixOp = function | Dec -> () | Inc -> () and v_binaryOp = function | Arith v1 -> let v1 = v_arithOp v1 in () | Logical v1 -> let v1 = v_logicalOp v1 in () and v_arithOp = function | Plus -> () | Minus -> () | Mul -> () | Div -> () | Mod -> () | DecLeft -> () | DecRight -> () | And -> () | Or -> () | Xor -> () and v_logicalOp = function | Inf -> () | Sup -> () | InfEq -> () | SupEq -> () | Eq -> () | NotEq -> () | AndLog -> () | OrLog -> () and v_ptrOp = function | PtrStarOp -> () | PtrOp -> () and v_allocOp = function | NewOp -> () | DeleteOp -> () | NewArrayOp -> () | DeleteArrayOp -> () and v_accessop = function | ParenOp -> () | ArrayOp -> () and v_operator = function | BinaryOp v1 -> let v1 = v_binaryOp v1 in () | AssignOp v1 -> let v1 = v_assignOp v1 in () | FixOp v1 -> let v1 = v_fixOp v1 in () | PtrOpOp v1 -> let v1 = v_ptrOp v1 in () | AccessOp v1 -> let v1 = v_accessop v1 in () | AllocOp v1 -> let v1 = v_allocOp v1 in () | UnaryTildeOp -> () | UnaryNotOp -> () | CommaOp -> () and v_cast_operator = function | Static_cast -> () | Dynamic_cast -> () | Const_cast -> () | Reinterpret_cast -> () and v_constExpression v = v_expression v and v_statement v = let k v = v_wrap v_statementbis v in vin.kstmt (k, all_functions) v and v_statementbis = function | Compound v1 -> let v1 = v_compound v1 in () | ExprStatement v1 -> let v1 = v_exprStatement v1 in () | Labeled v1 -> let v1 = v_labeled v1 in () | Selection v1 -> let v1 = v_selection v1 in () | Iteration v1 -> let v1 = v_iteration v1 in () | Jump v1 -> let v1 = v_jump v1 in () | DeclStmt v1 -> let v1 = v_block_declaration v1 in () | Try ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_compound v2 and v3 = v_list v_handler v3 in () | NestedFunc v1 -> let v1 = v_func_definition v1 in () | MacroStmt -> () | StmtTodo -> () and v_compound v = let k v = v_brace (v_list v_statement_sequencable) v in vin.kcompound (k, all_functions) v and v_statement_sequencable = function | StmtElem v1 -> let v1 = v_statement v1 in () | CppDirectiveStmt v1 -> let v1 = v_cpp_directive v1 in () | IfdefStmt v1 -> let v1 = v_ifdef_directive v1 in () and v_exprStatement v = v_option v_expression v and v_labeled = function | Label ((v1, v2)) -> let v1 = v_string v1 and v2 = v_statement v2 in () | Case ((v1, v2)) -> let v1 = v_expression v1 and v2 = v_statement v2 in () | CaseRange ((v1, v2, v3)) -> let v1 = v_expression v1 and v2 = v_expression v2 and v3 = v_statement v3 in () | Default v1 -> let v1 = v_statement v1 in () and v_selection = function | If ((v1, v2, v3, v4, v5)) -> let v1 = v_tok v1 and v2 = v_paren v_expression v2 and v3 = v_statement v3 and v4 = v_option v_tok v4 and v5 = v_statement v5 in () | Switch ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_paren v_expression v2 and v3 = v_statement v3 in () and v_iteration = function | While ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_paren v_expression v2 and v3 = v_statement v3 in () | DoWhile ((v1, v2, v3, v4, v5)) -> let v1 = v_tok v1 and v2 = v_statement v2 and v3 = v_tok v3 and v4 = v_paren v_expression v4 and v5 = v_tok v5 in () | For ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_paren (fun (v1, v2, v3) -> let v1 = v_wrap v_exprStatement v1 and v2 = v_wrap v_exprStatement v2 and v3 = v_wrap v_exprStatement v3 in ()) v2 and v3 = v_statement v3 in () | MacroIteration ((v1, v2, v3)) -> let v1 = v_wrap2 v_string v1 and v2 = v_paren (v_comma_list v_argument) v2 and v3 = v_statement v3 in () and v_jump = function | Goto v1 -> let v1 = v_string v1 in () | Continue -> () | Break -> () | Return -> () | ReturnExpr v1 -> let v1 = v_expression v1 in () | GotoComputed v1 -> let v1 = v_expression v1 in () and v_handler (v1, v2, v3) = let v1 = v_tok v1 and v2 = v_paren v_exception_declaration v2 and v3 = v_compound v3 in () and v_exception_declaration = function | ExnDeclEllipsis v1 -> let v1 = v_tok v1 in () | ExnDecl v1 -> let v1 = v_parameter v1 in () and v_block_declaration x = let k = function | DeclList ((v1, v2)) -> let v1 = v_comma_list v_onedecl v1 and v2 = v_tok v2 in () | MacroDecl ((v1, v2, v3, v4)) -> let v1 = v_list v_tok v1 and v2 = v_wrap2 v_string v2 and v3 = v_paren (v_comma_list v_argument) v3 and v4 = v_tok v4 in () | UsingDecl v1 -> let v1 = (match v1 with | (v1, v2, v3) -> let v1 = v_tok v1 and v2 = v_name v2 and v3 = v_tok v3 in ()) in () | UsingDirective ((v1, v2, v3, v4)) -> let v1 = v_tok v1 and v2 = v_tok v2 and v3 = v_namespace_name v3 and v4 = v_tok v4 in () | NameSpaceAlias ((v1, v2, v3, v4, v5)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 and v3 = v_tok v3 and v4 = v_namespace_name v4 and v5 = v_tok v5 in () | Asm ((v1, v2, v3, v4)) -> let v1 = v_tok v1 and v2 = v_option v_tok v2 and v3 = v_paren v_asmbody v3 and v4 = v_tok v4 in () in vin.kblock_decl (k, all_functions) x and v_onedecl { v_namei = v_v_namei; v_type = v_v_type; v_storage = v_v_storage } = let arg = v_option (fun (v1, v2) -> let v1 = v_name v1 and v2 = v_option v_init v2 in ()) v_v_namei in let arg = v_fullType v_v_type in let arg = v_storage v_v_storage in () and v_storage v = v_storagebis v and v_storagebis = function | NoSto -> () | StoTypedef v1 -> v_tok v1 | Sto v1 -> let v1 = v_wrap2 v_storageClass v1 in () and v_storageClass = function | Auto -> () | Static -> () | Register -> () | Extern -> () and v_func_specifier = function | Inline -> () | Virtual -> () and v_init = function | EqInit ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_initialiser v2 in () | ObjInit v1 -> let v1 = v_paren (v_comma_list v_argument) v1 in () and v_initialiser x = let k x = match x with | InitExpr v1 -> let v1 = v_expression v1 in () | InitList v1 -> let v1 = v_brace (v_comma_list v_initialiser) v1 in () | InitDesignators ((v1, v2, v3)) -> let v1 = v_list v_designator v1 and v2 = v_tok v2 and v3 = v_initialiser v3 in () | InitFieldOld ((v1, v2, v3)) -> let v1 = v_wrap2 v_string v1 and v2 = v_tok v2 and v3 = v_initialiser v3 in () | InitIndexOld ((v1, v2)) -> let v1 = v_bracket v_expression v1 and v2 = v_initialiser v2 in () in vin.kinit (k, all_functions) x and v_designator = function | DesignatorField ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 in () | DesignatorIndex v1 -> let v1 = v_bracket v_expression v1 in () | DesignatorRange v1 -> let v1 = v_bracket (fun (v1, v2, v3) -> let v1 = v_expression v1 and v2 = v_tok v2 and v3 = v_expression v3 in ()) v1 in () and v_asmbody (v1, v2) = let v1 = v_list v_tok v1 and v2 = v_list (v_wrap v_colon) v2 in () and v_colon = function | Colon v1 -> let v1 = v_comma_list v_colon_option v1 in () and v_colon_option v = v_wrap v_colon_optionbis v and v_colon_optionbis = function | ColonMisc -> () | ColonExpr v1 -> let v1 = v_paren v_expression v1 in () and v_func_definition x = let k = function { f_name = v_f_name; f_type = v_f_type; f_storage = v_f_storage; f_body = v_f_body } -> let arg = v_name v_f_name in let arg = v_functionType v_f_type in let arg = v_storage v_f_storage in let arg = v_compound v_f_body in () in vin.kfunc_def (k, all_functions) x and v_functionType { ft_ret = v_ft_ret; ft_params = v_ft_params; ft_dots = v_ft_dots; ft_const = v_ft_const; ft_throw = v_ft_throw } = let arg = v_fullType v_ft_ret in let arg = v_paren (v_comma_list v_parameter) v_ft_params in let arg = v_option (fun (v1, v2) -> let v1 = v_tok v1 and v2 = v_tok v2 in ()) v_ft_dots in let arg = v_option v_tok v_ft_const in let arg = v_option v_exn_spec v_ft_throw in () and v_parameter x = let k = function { p_name = v_p_name; p_type = v_p_type; p_register = v_p_register; p_val = v_p_val } -> let arg = v_option (v_wrap2 v_string) v_p_name in let arg = v_fullType v_p_type in let arg = v_option v_tok v_p_register in let arg = v_option (fun (v1, v2) -> let v1 = v_tok v1 and v2 = v_expression v2 in ()) v_p_val in () in vin.kparameter (k, all_functions) x and v_func_or_else = function | FunctionOrMethod v1 -> let v1 = v_func_definition v1 in () | Constructor ((v1)) -> let v1 = v_func_definition v1 in () | Destructor v1 -> let v1 = v_func_definition v1 in () and v_exn_spec (v1, v2) = let v1 = v_tok v1 and v2 = v_paren (v_comma_list2 v_name) v2 in () and v_class_definition x = let k = function { c_kind = v_c_kind; c_name = v_c_name; c_inherit = v_c_inherit; c_members = v_c_members } -> let arg = v_wrap2 v_structUnion v_c_kind in let arg = v_option v_ident_name v_c_name in let arg = v_option (fun (v1, v2) -> let v1 = v_tok v1 and v2 = v_comma_list v_base_clause v2 in ()) v_c_inherit in let arg = v_brace (v_list v_class_member_sequencable) v_c_members in () in vin.kclass_def (k, all_functions) x and v_structUnion = function | Struct -> () | Union -> () | Class -> () and v_base_clause { i_name = v_i_name; i_virtual = v_i_virtual; i_access = v_i_access } = let arg = v_class_name v_i_name in let arg = v_option v_tok v_i_virtual in let arg = v_option (v_wrap2 v_access_spec) v_i_access in () and v_access_spec = function | Public -> () | Private -> () | Protected -> () and v_method_decl = function | ConstructorDecl ((v1, v2, v3)) -> let v1 = v_wrap2 v_string v1 and v2 = v_paren (v_comma_list v_parameter) v2 and v3 = v_tok v3 in () | DestructorDecl ((v1, v2, v3, v4, v5)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 and v3 = v_paren (v_option v_tok) v3 and v4 = v_option v_exn_spec v4 and v5 = v_tok v5 in () | MethodDecl ((v1, v2, v3)) -> let v1 = v_onedecl v1 and v2 = v_option (fun (v1, v2) -> let v1 = v_tok v1 and v2 = v_tok v2 in ()) v2 and v3 = v_tok v3 in () and v_class_member x = let k = function | Access ((v1, v2)) -> let v1 = v_wrap2 v_access_spec v1 and v2 = v_tok v2 in () | MemberField (v1, v2) -> let v1 = (v_comma_list v_fieldkind) v1 in let v2 = v_tok v2 in () | MemberFunc v1 -> let v1 = v_func_or_else v1 in () | MemberDecl v1 -> let v1 = v_method_decl v1 in () | QualifiedIdInClass ((v1, v2)) -> let v1 = v_name v1 and v2 = v_tok v2 in () | TemplateDeclInClass v1 -> let v1 = (match v1 with | (v1, v2, v3) -> let v1 = v_tok v1 and v2 = v_template_parameters v2 and v3 = v_declaration v3 in ()) in () | UsingDeclInClass v1 -> let v1 = (match v1 with | (v1, v2, v3) -> let v1 = v_tok v1 and v2 = v_name v2 and v3 = v_tok v3 in ()) in () | EmptyField v1 -> let v1 = v_tok v1 in () in vin.kclass_member (k, all_functions) x and v_fieldkind x = let k = function | FieldDecl v1 -> let v1 = v_onedecl v1 in () | BitField ((v1, v2, v3, v4)) -> let v1 = v_option (v_wrap2 v_string) v1 and v2 = v_tok v2 and v3 = v_fullType v3 and v4 = v_constExpression v4 in () in vin.kfieldkind (k, all_functions) x and v_class_member_sequencable = function | ClassElem v1 -> let v1 = v_class_member v1 in () | CppDirectiveStruct v1 -> let v1 = v_cpp_directive v1 in () | IfdefStruct v1 -> let v1 = v_ifdef_directive v1 in () and v_cpp_directive x = let k = function | Define ((v1, v2, v3, v4)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 and v3 = v_define_kind v3 and v4 = v_define_val v4 in () | Include ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_inc_kind v2 and v3 = v_string v3 in () | Undef v1 -> let v1 = v_wrap2 v_string v1 in () | PragmaAndCo v1 -> let v1 = v_tok v1 in () in vin.kcpp (k, all_functions) x and v_define_kind = function | DefineVar -> () | DefineFunc v1 -> let v1 = v_paren (v_comma_list (v_wrap v_string)) v1 in () and v_define_val = function | DefinePrintWrapper ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_paren v_expression v2 and v3 = v_name v3 in () | DefineExpr v1 -> let v1 = v_expression v1 in () | DefineStmt v1 -> let v1 = v_statement v1 in () | DefineType v1 -> let v1 = v_fullType v1 in () | DefineDoWhileZero v1 -> let v1 = v_wrap v_statement v1 in () | DefineFunction v1 -> let v1 = v_func_definition v1 in () | DefineInit v1 -> let v1 = v_initialiser v1 in () | DefineText v1 -> let v1 = v_wrap v_string v1 in () | DefineEmpty -> () | DefineTodo -> () and v_inc_kind = function | Local -> () | Standard -> () | Weird -> () and v_inc_elem v = v_string v and v_ifdef_directive v = v_wrap2 v_ifdefkind v and v_ifdefkind = function | Ifdef -> () | IfdefElse -> () | IfdefElseif -> () | IfdefEndif -> () and v_declaration x = let k = function | BlockDecl v1 -> let v1 = v_block_declaration v1 in () | Func v1 -> let v1 = v_func_or_else v1 in () | TemplateDecl (v1, v2, v3) -> let v1 = v_tok v1 and v2 = v_template_parameters v2 and v3 = v_declaration v3 in () | TemplateSpecialization ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_angle v_unit v2 and v3 = v_declaration v3 in () | ExternC ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_tok v2 and v3 = v_declaration v3 in () | ExternCList ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_tok v2 and v3 = v_brace (v_list v_declaration_sequencable) v3 in () | NameSpace ((v1, v2, v3)) -> let v1 = v_tok v1 and v2 = v_wrap2 v_string v2 and v3 = v_brace (v_list v_declaration_sequencable) v3 in () | NameSpaceExtend ((v1, v2)) -> let v1 = v_string v1 and v2 = v_list v_declaration_sequencable v2 in () | NameSpaceAnon ((v1, v2)) -> let v1 = v_tok v1 and v2 = v_brace (v_list v_declaration_sequencable) v2 in () | EmptyDef v1 -> let v1 = v_tok v1 in () | DeclTodo -> () in vin.kdeclaration (k, all_functions) x and v_template_parameter v = v_parameter v and v_template_parameters v = v_angle (v_comma_list v_template_parameter) v and v_declaration_sequencable x = let k = function | NotParsedCorrectly v1 -> let v1 = v_list v_tok v1 in () | DeclElem v1 -> let v1 = v_declaration v1 in () | CppDirectiveDecl v1 -> let v1 = v_cpp_directive v1 in () | IfdefDecl v1 -> let v1 = v_ifdef_directive v1 in () | MacroTop ((v1, v2, v3)) -> let v1 = v_wrap2 v_string v1 and v2 = v_paren (v_comma_list v_argument) v2 and v3 = v_option v_tok v3 in () | MacroVarTop ((v1, v2)) -> let v1 = v_wrap2 v_string v1 and v2 = v_tok v2 in () in vin.ktoplevel (k, all_functions) x and v_toplevel v = v_declaration_sequencable v and v_program v = v_list v_toplevel v and v_any = function | Program v1 -> let v1 = v_program v1 in () | Toplevel v1 -> let v1 = v_toplevel v1 in () | BlockDecl2 v1 -> let v1 = v_block_declaration v1 in () | Stmt v1 -> let v1 = v_statement v1 in () | Expr v1 -> let v1 = v_expression v1 in () | Init v1 -> let v1 = v_initialiser v1 in () | Type v1 -> let v1 = v_fullType v1 in () | Name v1 -> let v1 = v_name v1 in () | Cpp v1 -> let v1 = v_cpp_directive v1 in () | ClassDef v1 -> let v1 = v_class_definition v1 in () | FuncDef v1 -> let v1 = v_func_definition v1 in () | FuncOrElse v1 -> let v1 = v_func_or_else v1 in () | Constant v1 -> let v1 = v_constant v1 in () | Argument v1 -> let v1 = v_argument v1 in () | Parameter v1 -> let v1 = v_parameter v1 in () | Body v1 -> let v1 = v_compound v1 in () | Info v1 -> let v1 = v_info v1 in () | InfoList v1 -> let v1 = v_list v_info v1 in () | ClassMember v1 -> let v1 = v_class_member v1 in () | OneDecl v1 -> let v1 = v_onedecl v1 in () (* end of auto generation *) and all_functions x = v_any x in v_any