- Try to do better pretty printing when array elements are individually
[bpt/coccinelle.git] / parsing_c / visitor_c.ml
index b8f16dd..882d0a5 100644 (file)
@@ -321,16 +321,13 @@ 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
+    | New  t   -> vk_argument bigf t
+    | Delete e -> vk_expr bigf e
 
 
   in exprf expr
@@ -389,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;
@@ -442,7 +441,7 @@ and vk_type = fun bigf t ->
     iif iiq;
     iif iit;
     match unwrap_t with
-    | NoType -> ()
+    | NoType -> ()
     | BaseType _ -> ()
     | Pointer t -> typef t
     | Array (eopt, t) ->
@@ -495,13 +494,19 @@ and vk_decl = fun bigf d ->
        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
@@ -519,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
 
@@ -550,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
@@ -741,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";
       ()
@@ -788,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;
@@ -1048,16 +1067,13 @@ 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)
@@ -1128,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"
          )
@@ -1281,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)
 
 
@@ -1298,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;
@@ -1313,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 =
@@ -1527,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";
@@ -1570,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))
@@ -1669,6 +1717,10 @@ 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_inis_s = fun bigf inis ->
+  let iif ii = vk_ii_s bigf ii in
+  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)