Coccinelle release 0.2.5-rc8
[bpt/coccinelle.git] / parsing_c / visitor_c.ml
index 746973f..28a4729 100644 (file)
@@ -330,6 +330,9 @@ let rec vk_expr = fun bigf expr ->
 
     | ParenExpr (e) -> exprf e
 
+    | New  t   -> vk_argument bigf t
+    | Delete e -> vk_expr bigf e
+
 
   in exprf expr
 
@@ -440,6 +443,7 @@ and vk_type = fun bigf t ->
     iif iiq;
     iif iit;
     match unwrap_t with
+    | NoType -> ()
     | BaseType _ -> ()
     | Pointer t -> typef t
     | Array (eopt, t) ->
@@ -454,14 +458,7 @@ and vk_type = fun bigf t ->
         )
 
     | Enum  (sopt, enumt) ->
-        enumt +> List.iter (fun ((name, eopt), iicomma) ->
-          vk_name bigf name;
-          iif iicomma;
-          eopt +> Common.do_option (fun (info, e) ->
-            iif [info];
-            vk_expr bigf e
-          )
-        );
+        vk_enum_fields bigf enumt
 
     | StructUnion (sopt, _su, fields) ->
         vk_struct_fields bigf fields
@@ -506,6 +503,8 @@ and vk_decl = fun bigf d ->
         vk_argument_list bigf args;
   in f (k, bigf) d
 
+and vk_decl_list = fun bigf ts ->
+  ts +> List.iter (vk_decl bigf)
 
 and vk_onedecl = fun bigf onedecl ->
   let iif ii = vk_ii bigf ii in
@@ -523,10 +522,10 @@ and vk_onedecl = fun bigf onedecl ->
     attrs +> List.iter (vk_attribute bigf);
     var +> Common.do_option (fun (name, iniopt) ->
       vk_name bigf name;
-      iniopt +> Common.do_option (fun (info, ini) ->
-      iif [info];
-      vk_ini bigf ini;
-      );
+      (match iniopt with
+       Ast_c.NoInit -> ()
+      |        Ast_c.ValInit(iini,init) -> iif [iini]; vk_ini bigf init
+      |        Ast_c.ConstrInit((init,ii)) -> iif ii; vk_argument_list bigf init)
     )
   in f (k, bigf) onedecl
 
@@ -611,6 +610,21 @@ and vk_struct_fieldkinds = fun bigf onefield_multivars ->
         vk_type bigf t
   )
 
+
+and vk_enum_fields = fun bigf enumt ->
+  let iif ii = vk_ii bigf ii in
+  enumt +> List.iter (fun ((name, eopt), iicomma) ->
+    vk_oneEnum bigf (name, eopt);
+    iif iicomma)
+
+and vk_oneEnum = fun bigf (name, eopt) ->
+  let iif ii = vk_ii bigf ii in
+  vk_name bigf name;
+  eopt +> Common.do_option (fun (info, e) ->
+    iif [info];
+    vk_expr bigf e
+      )
+
 (* ------------------------------------------------------------------------ *)
 
 
@@ -697,8 +711,6 @@ and vk_cpp_directive bigf directive =
         iif ii;
         vk_define_kind bigf defkind;
         vk_define_val bigf defval
-    | Undef (s, ii) ->
-        iif ii
     | PragmaAndCo (ii) ->
         iif ii
   in f (k, bigf) directive
@@ -713,6 +725,7 @@ and vk_define_kind bigf defkind =
         vk_ii bigf iis;
         vk_ii bigf iicomma;
       )
+  | Undef -> ()
 
 and vk_define_val bigf defval =
   let f = bigf.kdefineval in
@@ -808,7 +821,6 @@ and vk_node = fun bigf node ->
         pr2_once "DefineTodo";
         ()
 
-
     | F.Include {i_include = (s, ii);} -> iif ii;
 
     | F.MacroTop (s, args, ii) ->
@@ -919,29 +931,18 @@ and vk_asmbody = fun bigf (string_list, colon_list) ->
 
 
 (* ------------------------------------------------------------------------ *)
-let vk_args_splitted = fun bigf args_splitted ->
+let vk_splitted element = fun bigf args_splitted ->
   let iif ii = vk_ii bigf ii in
   args_splitted +> List.iter (function
-  | Left arg -> vk_argument bigf arg
+  | Left arg -> element bigf arg
   | Right ii -> iif ii
   )
 
-
-let vk_define_params_splitted = fun bigf args_splitted ->
-  let iif ii = vk_ii bigf ii in
-  args_splitted +> List.iter (function
-  | Left (s, iis) -> vk_ii bigf iis
-  | Right ii -> iif ii
-  )
-
-
-
-let vk_params_splitted = fun bigf args_splitted ->
-  let iif ii = vk_ii bigf ii in
-  args_splitted +> List.iter (function
-  | Left arg -> vk_param bigf arg
-  | Right ii -> iif ii
-  )
+let vk_args_splitted = vk_splitted vk_argument
+let vk_define_params_splitted = vk_splitted (fun bigf (_,ii) -> vk_ii bigf ii)
+let vk_params_splitted = vk_splitted vk_param
+let vk_enum_fields_splitted = vk_splitted vk_oneEnum
+let vk_inis_splitted = vk_splitted vk_ini
 
 (* ------------------------------------------------------------------------ *)
 let vk_cst = fun bigf (cst, ii) ->
@@ -1059,6 +1060,9 @@ let rec vk_expr_s = fun bigf expr ->
 
       | ParenExpr (e) -> ParenExpr (exprf e)
 
+      | New  t        -> New (vk_argument_s bigf t)
+      | Delete e      -> Delete (vk_expr_s bigf e)
+
     in
     (e', typ'), (iif ii)
   in exprf expr
@@ -1232,6 +1236,7 @@ and vk_type_s = fun bigf t ->
     let (unwrap_t, iit) = t in
     let t' =
       match unwrap_t with
+      | NoType -> NoType
       | BaseType x -> BaseType x
       | Pointer t  -> Pointer (typef t)
       | Array (eopt, t) -> Array (fmap (vk_expr_s bigf) eopt, typef t)
@@ -1246,17 +1251,7 @@ and vk_type_s = fun bigf t ->
             ))
 
       | Enum  (sopt, enumt) ->
-          Enum (sopt,
-               enumt +> List.map (fun ((name, eopt), iicomma) ->
-
-                 ((vk_name_s bigf name,
-                  eopt +> Common.fmap (fun (info, e) ->
-                    vk_info_s bigf info,
-                    vk_expr_s bigf e
-                 )),
-                 iif iicomma)
-               )
-               )
+          Enum (sopt, vk_enum_fields_s bigf enumt)
       | StructUnion (sopt, su, fields) ->
           StructUnion (sopt, su, vk_struct_fields_s bigf fields)
 
@@ -1307,10 +1302,15 @@ and vk_decl_s = fun bigf d ->
     {v_namei =
       (var +> map_option (fun (name, iniopt) ->
         vk_name_s bigf name,
-        iniopt +> map_option (fun (info, init) ->
-          vk_info_s bigf info,
-          vk_ini_s bigf init
-        )));
+       (match iniopt with
+       Ast_c.NoInit -> iniopt
+      |        Ast_c.ValInit(iini,init) ->
+         Ast_c.ValInit(vk_info_s bigf iini,vk_ini_s bigf init)
+      |        Ast_c.ConstrInit((init,ii)) ->
+         let init =
+           init +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii) in
+         Ast_c.ConstrInit((init, List.map (vk_info_s bigf) ii)))
+        ));
      v_type = vk_type_s bigf t;
     (* !!! dont go in semantic related stuff !!! *)
      v_type_bis = tbis;
@@ -1322,6 +1322,9 @@ and vk_decl_s = fun bigf d ->
 
   in f (k, bigf) d
 
+and vk_decl_list_s = fun bigf decls ->
+  decls +> List.map (vk_decl_s bigf)
+
 and vk_ini_s = fun bigf ini ->
   let rec inif ini = bigf.kini_s (k,bigf) ini
   and k ini =
@@ -1400,9 +1403,20 @@ and vk_struct_field_s = fun bigf field ->
       IfdefStruct (vk_ifdef_directive_s bigf ifdef)
 
 and vk_struct_fields_s = fun bigf fields ->
-
   fields +> List.map (vk_struct_field_s bigf)
 
+and vk_enum_fields_s = fun bigf enumt ->
+  let iif ii = vk_ii_s bigf ii in
+  enumt +> List.map (fun ((name, eopt), iicomma) ->
+    vk_oneEnum_s bigf (name, eopt), iif iicomma)
+
+and vk_oneEnum_s = fun bigf oneEnum ->
+  let (name,eopt) = oneEnum in
+  (vk_name_s bigf name,
+   eopt +> Common.fmap (fun (info, e) ->
+     vk_info_s bigf info,
+     vk_expr_s bigf e
+       ))
 
 and vk_def_s = fun bigf d ->
   let f = bigf.kdef_s in
@@ -1485,7 +1499,6 @@ and vk_cpp_directive_s = fun bigf top ->
     | Define ((s,ii), (defkind, defval)) ->
         Define ((s, iif ii),
                (vk_define_kind_s bigf defkind, vk_define_val_s bigf defval))
-    | Undef (s, ii) -> Undef (s, iif ii)
     | PragmaAndCo (ii) -> PragmaAndCo (iif ii)
 
   in f (k, bigf) top
@@ -1507,6 +1520,7 @@ and vk_define_kind_s  = fun bigf defkind ->
         ),
         vk_ii_s bigf ii
         )
+  | Undef -> Undef
 
 
 and vk_define_val_s = fun bigf x ->
@@ -1663,39 +1677,33 @@ and vk_param_s = fun bigf param ->
     p_type = vk_type_s bigf ft;
   }
 
-let vk_args_splitted_s = fun bigf args_splitted ->
-  let iif ii = vk_ii_s bigf ii in
-  args_splitted +> List.map (function
-  | Left arg -> Left (vk_argument_s bigf arg)
-  | Right ii -> Right (iif ii)
-  )
-
 let vk_arguments_s = fun bigf args ->
   let iif ii = vk_ii_s bigf ii in
   args +> List.map (fun (e, ii) -> vk_argument_s bigf e, iif ii)
 
-
-let vk_params_splitted_s = fun bigf args_splitted ->
-  let iif ii = vk_ii_s bigf ii in
-  args_splitted +> List.map (function
-  | Left arg -> Left (vk_param_s bigf arg)
-  | Right ii -> Right (iif ii)
-  )
-
 let vk_params_s = fun bigf args ->
   let iif ii = vk_ii_s bigf ii in
   args +> List.map (fun (p,ii) -> vk_param_s bigf p, iif ii)
 
-let vk_define_params_splitted_s = fun bigf args_splitted ->
-  let iif ii = vk_ii_s bigf ii in
-  args_splitted +> List.map (function
-  | Left (s, iis) -> Left (s, vk_ii_s bigf iis)
-  | Right ii -> Right (iif ii)
-  )
-
 let vk_cst_s = fun bigf (cst, ii) ->
   let iif ii = vk_ii_s bigf ii in
   (match cst with
   | Left cst -> Left cst
   | Right s -> Right s
   ), iif ii
+
+(* ------------------------------------------------------------------------ *)
+
+let vk_splitted_s element = fun bigf args_splitted ->
+  let iif ii = vk_ii_s bigf ii in
+  args_splitted +> List.map (function
+  | Left arg -> Left (element bigf arg)
+  | Right ii -> Right (iif ii)
+  )
+
+let vk_args_splitted_s = vk_splitted_s vk_argument_s
+let vk_params_splitted_s = vk_splitted_s vk_param_s
+let vk_define_params_splitted_s =
+  vk_splitted_s (fun bigf (s,ii) -> (s,vk_ii_s bigf ii))
+let vk_enum_fields_splitted_s = vk_splitted_s vk_oneEnum_s
+let vk_inis_splitted_s = vk_splitted_s vk_ini_s