Coccinelle release 0.2.5-rc8
[bpt/coccinelle.git] / parsing_c / visitor_c.ml
index 6d6c558..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
@@ -495,7 +492,9 @@ and vk_decl = fun bigf d ->
   let f = bigf.kdecl in
   let rec k decl =
     match decl with
-    | DeclList (xs,ii) -> xs +> List.iter (fun (x,ii) ->
+    | DeclList (xs,ii) ->
+       iif ii;
+       xs +> List.iter (fun (x,ii) ->
         iif ii;
         vk_onedecl bigf x;
       );
@@ -504,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
@@ -521,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
 
@@ -609,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
+      )
+
 (* ------------------------------------------------------------------------ *)
 
 
@@ -695,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
@@ -711,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
@@ -806,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) ->
@@ -917,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) ->
@@ -1057,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
@@ -1230,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)
@@ -1244,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)
 
@@ -1305,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;
@@ -1320,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 =
@@ -1376,32 +1381,42 @@ and vk_struct_fieldkinds_s = fun bigf onefield_multivars ->
     ), iif iicomma
   )
 
-and vk_struct_fields_s = fun bigf fields ->
-
+and vk_struct_field_s = fun bigf field ->
   let iif ii = vk_ii_s bigf ii in
 
-  fields +> List.map (fun (field) ->
-    (match field with
-    | (DeclarationField (FieldDeclList (onefield_multivars, iiptvirg))) ->
-        DeclarationField
-          (FieldDeclList
-              (vk_struct_fieldkinds_s bigf onefield_multivars, iif iiptvirg))
-    | EmptyField info -> EmptyField (vk_info_s bigf info)
-    | MacroDeclField ((s, args),ii) ->
-        MacroDeclField
-          ((s,
-           args +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii)
-           ),
-          iif ii)
+  match field with
+    (DeclarationField (FieldDeclList (onefield_multivars, iiptvirg))) ->
+      DeclarationField
+        (FieldDeclList
+           (vk_struct_fieldkinds_s bigf onefield_multivars, iif iiptvirg))
+  | EmptyField info -> EmptyField (vk_info_s bigf info)
+  | MacroDeclField ((s, args),ii) ->
+      MacroDeclField
+        ((s,
+          args +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii)
+         ),
+         iif ii)
+
+  | CppDirectiveStruct directive ->
+      CppDirectiveStruct (vk_cpp_directive_s bigf directive)
+  | IfdefStruct ifdef ->
+      IfdefStruct (vk_ifdef_directive_s bigf ifdef)
 
-    | CppDirectiveStruct directive ->
-        CppDirectiveStruct (vk_cpp_directive_s bigf directive)
-    | IfdefStruct ifdef ->
-        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
@@ -1484,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
@@ -1506,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 ->
@@ -1662,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