Coccinelle release 1.0.0-rc4
[bpt/coccinelle.git] / parsing_c / pretty_print_c.ml
index 80e8eea..8029f09 100644 (file)
@@ -41,7 +41,9 @@ type pretty_printers = {
   statement       : Ast_c.statement printer;
   decl            : Ast_c.declaration printer;
   field           : Ast_c.field printer;
+  field_list      : Ast_c.field list printer;
   init            : Ast_c.initialiser printer;
+  init_list       : (Ast_c.initialiser wrap2 list) printer;
   param           : Ast_c.parameterType printer;
   paramlist       : (Ast_c.parameterType Ast_c.wrap2 list) printer;
   ty              : Ast_c.fullType printer;
@@ -78,7 +80,11 @@ let mk_pretty_printers
        start_block(); f(); pr_unindent() in
 
 
-
+  let pp_list printer l =
+    l +> List.iter (fun (e, opt) ->
+      assert (List.length opt <= 1); (* opt must be a comma? *)
+      opt +> List.iter (function x -> pr_elem x; pr_space());
+      printer e) in
 
   let rec pp_expression = fun ((exp, typ), ii) ->
     (match exp, ii with
@@ -145,7 +151,8 @@ let mk_pretty_printers
 
     | ParenExpr (e), [i1;i2] -> pr_elem i1; pp_expression e; pr_elem i2;
 
-    | New  (t),      [i1] -> pr_elem i1; pp_argument t
+    | New   (t),     [i1] -> pr_elem i1; pp_argument t
+    | Delete(t),     [i1] -> pr_elem i1; pp_expression t
 
     | (Ident (_) | Constant _ | FunCall (_,_) | CondExpr (_,_,_)
     | Sequence (_,_)
@@ -154,7 +161,7 @@ let mk_pretty_printers
     | ArrayAccess (_,_) | RecordAccess (_,_) | RecordPtAccess (_,_)
     | SizeOfExpr (_) | SizeOfType (_) | Cast (_,_)
     | StatementExpr (_) | Constructor _
-    | ParenExpr (_) | New (_)),_ -> raise Impossible
+    | ParenExpr (_) | New (_) | Delete (_)),_ -> raise Impossible
     );
 
     if !Flag_parsing_c.pretty_print_type_info
@@ -171,11 +178,7 @@ let mk_pretty_printers
       pr_elem (Ast_c.fakeInfo() +> Ast_c.rewrap_str "*/");
     end
 
-  and pp_arg_list es =
-    es +> List.iter (fun (e, opt) ->
-      assert (List.length opt <= 1); (* opt must be a comma? *)
-      opt +> List.iter (function x -> pr_elem x; pr_space());
-      pp_argument e)
+  and pp_arg_list es = pp_list pp_argument es
 
   and pp_argument argument =
     let rec pp_action (ActMisc ii) = ii +> List.iter pr_elem in
@@ -552,6 +555,7 @@ let mk_pretty_printers
             (* | TypeOfExpr _ | TypeOfType _ *)
          ), _ -> raise Impossible
 
+  and pp_field_list fields = fields +>  Common.print_between pr_nl pp_field
   and pp_field = function
       DeclarationField(FieldDeclList(onefield_multivars,iiptvirg))->
         (match onefield_multivars with
@@ -860,9 +864,12 @@ let mk_pretty_printers
            pp_type_with_ident
              (Some (s, iis)) (Some (storage, iisto))
              returnType attrs;
-           iniopt +> do_option (fun (iini, init) ->
-             pr_elem iini;
-              pp_init init);
+           (match iniopt with
+             Ast_c.NoInit -> ()
+           | Ast_c.ValInit(iini,init) -> pr_elem iini; pp_init init
+           | Ast_c.ConstrInit((init,[lp;rp])) ->
+               pr_elem lp; pp_arg_list init; pr_elem rp
+           | Ast_c.ConstrInit _ -> raise Impossible)
        | None -> pp_type returnType
        );
 
@@ -879,9 +886,12 @@ let mk_pretty_printers
            iivirg +> List.iter pr_elem;
            pp_type_with_ident_rest
              (Some (s, iis)) returnType attrs;
-           iniopt +> do_option (fun (iini, init) ->
-             pr_elem iini; pp_init init
-            );
+           (match iniopt with
+             Ast_c.NoInit -> ()
+           | Ast_c.ValInit(iini,init) -> pr_elem iini; pp_init init
+           | Ast_c.ConstrInit((init,[lp;rp])) ->
+               pr_elem lp; pp_arg_list init; pr_elem rp
+           | Ast_c.ConstrInit _ -> raise Impossible);
 
 
        | x -> raise Impossible
@@ -889,7 +899,7 @@ let mk_pretty_printers
 
        pr_elem iivirg;
 
-    | MacroDecl ((s, es), iis::lp::rp::iiend::ifakestart::iisto) ->
+    | MacroDecl ((s, es, true), iis::lp::rp::iiend::ifakestart::iisto) ->
        pr_elem ifakestart;
        iisto +> List.iter pr_elem; (* static and const *)
        pr_elem iis;
@@ -903,6 +913,19 @@ let mk_pretty_printers
        pr_elem rp;
        pr_elem iiend;
 
+    | MacroDecl ((s, es, false), iis::lp::rp::ifakestart::iisto) ->
+       pr_elem ifakestart;
+       iisto +> List.iter pr_elem; (* static and const *)
+       pr_elem iis;
+       pr_elem lp;
+       es +> List.iter (fun (e, opt) ->
+          assert (List.length opt <= 1);
+          opt +> List.iter pr_elem;
+          pp_argument e;
+       );
+
+       pr_elem rp;
+
     | (DeclList (_, _) | (MacroDecl _)) -> raise Impossible
 
 
@@ -937,7 +960,7 @@ and pp_init (init, iinit) =
       | InitList _ | InitExpr _
          ), _ -> raise Impossible
 
-
+  and pp_init_list ini = pp_list pp_init ini
 
   and pp_designator = function
     | DesignatorField (s), [i1; i2] ->
@@ -1029,11 +1052,7 @@ and pp_init (init, iinit) =
         pr_elem i2;
     | _ -> raise Impossible
 
-  and pp_param_list paramst =
-    paramst +> List.iter (fun (param,iicomma) ->
-      assert ((List.length iicomma) <= 1);
-      iicomma +> List.iter (function x -> pr_elem x; pr_space());
-      pp_param param)
+  and pp_param_list paramst = pp_list pp_param paramst
 
 (* ---------------------- *)
 
@@ -1302,9 +1321,11 @@ and pp_init (init, iinit) =
     statement  = pp_statement;
     decl       = pp_decl;
     field      = pp_field;
+    field_list = pp_field_list;
     init       = pp_init;
+    init_list  = pp_init_list;
     param      = pp_param;
-    paramlist = pp_param_list;
+    paramlist  = pp_param_list;
     ty         = pp_type;
     type_with_ident = pp_type_with_ident;
     toplevel   = pp_toplevel;
@@ -1371,9 +1392,15 @@ let pp_decl_gen ~pr_elem ~pr_space =
 let pp_field_gen ~pr_elem ~pr_space =
   (pp_elem_sp pr_elem pr_space).field
 
+let pp_field_list_gen ~pr_elem ~pr_space =
+  (pp_elem_sp pr_elem pr_space).field_list
+
 let pp_init_gen ~pr_elem ~pr_space =
   (pp_elem_sp pr_elem pr_space).init
 
+let pp_init_list_gen ~pr_elem ~pr_space =
+  (pp_elem_sp pr_elem pr_space).init_list
+
 let pp_param_gen ~pr_elem ~pr_space =
   (pp_elem_sp pr_elem pr_space).param