- Try to do better pretty printing when array elements are individually
[bpt/coccinelle.git] / parsing_c / visitor_c.ml
index 6d6c558..882d0a5 100644 (file)
@@ -321,15 +321,14 @@ let rec vk_expr = fun bigf expr ->
         iif is;
         statxs +> List.iter (vk_statement_sequencable bigf);
 
-    | Constructor (t, initxs) ->
-        vk_type bigf t;
-        initxs +> List.iter (fun (ini, ii) ->
-          vk_ini bigf ini;
-          vk_ii bigf ii;
-        )
+    | Constructor (t, init) ->
+        vk_type bigf t; vk_ini bigf init
 
     | ParenExpr (e) -> exprf e
 
+    | New  t   -> vk_argument bigf t
+    | Delete e -> vk_expr bigf e
+
 
   in exprf expr
 
@@ -387,8 +386,10 @@ and vk_statement = fun bigf (st: Ast_c.statement) ->
     | Iteration  (While (e, st)) ->
         vk_expr bigf e; statf st;
     | Iteration  (DoWhile (st, e)) -> statf st; vk_expr bigf e;
-    | Iteration  (For ((e1opt,i1), (e2opt,i2), (e3opt,i3), st)) ->
-        statf (mk_st (ExprStatement (e1opt)) i1);
+    | Iteration  (For (first, (e2opt,i2), (e3opt,i3), st)) ->
+       (match first with
+         ForExp (e1opt,i1) -> statf (mk_st (ExprStatement (e1opt)) i1)
+       | ForDecl decl -> vk_decl bigf decl);
         statf (mk_st (ExprStatement (e2opt)) i2);
         statf (mk_st (ExprStatement (e3opt)) i3);
         statf st;
@@ -440,6 +441,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 +456,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,15 +490,23 @@ 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;
+        vk_onedecl bigf x
       );
-    | MacroDecl ((s, args),ii) ->
+    | MacroDecl ((s, args, ptvg),ii) ->
+        iif ii;
+        vk_argument_list bigf args
+    | MacroDeclInit ((s, args, ini),ii) ->
         iif ii;
         vk_argument_list bigf args;
+       vk_ini bigf ini
   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 +524,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
 
@@ -552,6 +555,12 @@ and vk_ini = fun bigf ini ->
 
   in inif ini
 
+and vk_ini_list = fun bigf ts ->
+  let iif ii = vk_ii bigf ii in
+  ts +> List.iter (fun (ini,iicomma) ->
+    vk_ini bigf ini;
+    iif iicomma;
+  )
 
 and vk_designator = fun bigf design ->
   let iif ii = vk_ii bigf ii in
@@ -609,6 +618,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 +719,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 +733,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
@@ -729,7 +752,9 @@ and vk_define_val bigf defval =
   | DefineText (s, ii) -> vk_ii bigf ii
   | DefineEmpty -> ()
   | DefineInit ini -> vk_ini bigf ini
-
+    (* christia: added multi *)
+  | DefineMulti stmts ->
+      List.fold_left (fun () d -> vk_statement bigf d) () stmts 
   | DefineTodo ->
       pr2_once "DefineTodo";
       ()
@@ -776,12 +801,18 @@ and vk_node = fun bigf node ->
         iif ii;
         vk_expr bigf e
 
-    | F.ForHeader (_st, (((e1opt,i1), (e2opt,i2), (e3opt,i3)), ii)) ->
+    | F.ForHeader (_st, ((ForExp (e1opt,i1), (e2opt,i2), (e3opt,i3)), ii)) ->
         iif i1; iif i2; iif i3;
         iif ii;
         e1opt +> do_option (vk_expr bigf);
         e2opt +> do_option (vk_expr bigf);
         e3opt +> do_option (vk_expr bigf);
+    | F.ForHeader (_st, ((ForDecl decl, (e2opt,i2), (e3opt,i3)), ii)) ->
+        iif i2; iif i3;
+        iif ii;
+        decl  +> (vk_decl bigf);
+        e2opt +> do_option (vk_expr bigf);
+        e3opt +> do_option (vk_expr bigf);
     | F.MacroIterHeader (_s, ((s,es), ii)) ->
         iif ii;
         vk_argument_list bigf es;
@@ -806,7 +837,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 +947,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) ->
@@ -1048,15 +1067,14 @@ let rec vk_expr_s = fun bigf expr ->
           StatementExpr (
             vk_statement_sequencable_list_s bigf statxs,
             iif is)
-      | Constructor (t, initxs) ->
-          Constructor
-            (vk_type_s bigf t,
-            (initxs +> List.map (fun (ini, ii) ->
-              vk_ini_s bigf ini, vk_ii_s bigf ii)
-            ))
+      | Constructor (t, init) ->
+          Constructor (vk_type_s bigf t, vk_ini_s bigf init)
 
       | 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
@@ -1126,21 +1144,30 @@ and vk_statement_s = fun bigf st ->
           Iteration  (While ((vk_expr_s bigf) e, statf st))
       | Iteration (DoWhile (st, e))  ->
           Iteration  (DoWhile (statf st, (vk_expr_s bigf) e))
-      | Iteration (For ((e1opt,i1), (e2opt,i2), (e3opt,i3), st)) ->
-          let e1opt' = statf (mk_st (ExprStatement (e1opt)) i1) in
+      | Iteration (For (first, (e2opt,i2), (e3opt,i3), st)) ->
+         let first =
+           match first with
+             ForExp (e1opt,i1) ->
+               let e1opt' = statf (mk_st (ExprStatement (e1opt)) i1) in
+               let e1' = Ast_c.unwrap_st e1opt' in
+               let i1' = Ast_c.get_ii_st_take_care e1opt' in
+               (match e1' with
+                 ExprStatement x1 -> ForExp (x1,i1')
+               | _ ->
+                   failwith
+                     "cant be here if iterator keep ExprStatement as is")
+           | ForDecl decl -> ForDecl (vk_decl_s bigf decl) in
           let e2opt' = statf (mk_st (ExprStatement (e2opt)) i2) in
           let e3opt' = statf (mk_st (ExprStatement (e3opt)) i3) in
 
-          let e1' = Ast_c.unwrap_st e1opt' in
           let e2' = Ast_c.unwrap_st e2opt' in
           let e3' = Ast_c.unwrap_st e3opt' in
-          let i1' = Ast_c.get_ii_st_take_care e1opt' in
           let i2' = Ast_c.get_ii_st_take_care e2opt' in
           let i3' = Ast_c.get_ii_st_take_care e3opt' in
 
-          (match (e1', e2', e3') with
-          | ((ExprStatement x1), (ExprStatement x2), ((ExprStatement x3))) ->
-              Iteration (For ((x1,i1'), (x2,i2'), (x3,i3'), statf st))
+          (match (e2', e3') with
+          | ((ExprStatement x2), ((ExprStatement x3))) ->
+              Iteration (For (first, (x2,i2'), (x3,i3'), statf st))
 
           | x -> failwith "cant be here if iterator keep ExprStatement as is"
          )
@@ -1230,6 +1257,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 +1272,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)
 
@@ -1288,11 +1306,17 @@ and vk_decl_s = fun bigf d ->
     match decl with
     | DeclList (xs, ii) ->
         DeclList (List.map aux xs,   iif ii)
-    | MacroDecl ((s, args),ii) ->
+    | MacroDecl ((s, args, ptvg),ii) ->
         MacroDecl
           ((s,
-           args +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii)
-           ),
+           args +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii),
+           ptvg),
+          iif ii)
+    | MacroDeclInit ((s, args, ini),ii) ->
+        MacroDeclInit
+          ((s,
+           args +> List.map (fun (e,ii) -> vk_argument_s bigf e, iif ii),
+          vk_ini_s bigf ini),
           iif ii)
 
 
@@ -1305,10 +1329,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 +1349,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 +1408,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 +1526,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 +1547,7 @@ and vk_define_kind_s  = fun bigf defkind ->
         ),
         vk_ii_s bigf ii
         )
+  | Undef -> Undef
 
 
 and vk_define_val_s = fun bigf x ->
@@ -1524,6 +1566,9 @@ and vk_define_val_s = fun bigf x ->
     | DefineText (s, ii) -> DefineText (s, iif ii)
     | DefineEmpty -> DefineEmpty
     | DefineInit ini -> DefineInit (vk_ini_s bigf ini)
+    (* christia: added multi *)
+    | DefineMulti ds ->
+       DefineMulti (List.map (vk_statement_s bigf) ds)
 
     | DefineTodo ->
         pr2_once "DefineTodo";
@@ -1567,9 +1612,15 @@ and vk_node_s = fun bigf node ->
     | F.DoWhileTail (e,ii)  ->
         F.DoWhileTail (vk_expr_s bigf e, iif ii)
 
-    | F.ForHeader (st, (((e1opt,i1), (e2opt,i2), (e3opt,i3)), ii)) ->
+    | F.ForHeader (st, ((first, (e2opt,i2), (e3opt,i3)), ii)) ->
+       let first =
+         match first with
+           ForExp (e1opt,i1) ->
+             ForExp (e1opt +> Common.map_option (vk_expr_s bigf), iif i1)
+         | ForDecl decl -> ForDecl (vk_decl_s bigf decl) in
+
         F.ForHeader (st,
-                    (((e1opt +> Common.map_option (vk_expr_s bigf), iif i1),
+                    ((first,
                      (e2opt +> Common.map_option (vk_expr_s bigf), iif i2),
                      (e3opt +> Common.map_option (vk_expr_s bigf), iif i3)),
                     iif ii))
@@ -1662,39 +1713,37 @@ 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 vk_inis_s = fun bigf inis ->
   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)
-  )
+  inis +> List.map (fun (e, ii) -> vk_ini_s bigf e, 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