X-Git-Url: https://git.hcoop.net/bpt/coccinelle.git/blobdiff_plain/5636bb2c2537506718da74f85a2b81a5ff3df16f..7fe62b653dbe13c8fc74c58c3ca4b8af523c1637:/parsing_cocci/unparse_ast0.ml diff --git a/parsing_cocci/unparse_ast0.ml b/parsing_cocci/unparse_ast0.ml index b12855e..4e108b5 100644 --- a/parsing_cocci/unparse_ast0.ml +++ b/parsing_cocci/unparse_ast0.ml @@ -1,27 +1,7 @@ (* - * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen - * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix - * This file is part of Coccinelle. - * - * Coccinelle is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, according to version 2 of the License. - * - * Coccinelle is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with Coccinelle. If not, see . - * - * The authors reserve the right to distribute this or future versions of - * Coccinelle under other licenses. - *) - - -(* - * Copyright 2005-2010, Ecole des Mines de Nantes, University of Copenhagen + * Copyright 2010, INRIA, University of Copenhagen + * Julia Lawall, Rene Rydhof Hansen, Gilles Muller, Nicolas Palix + * Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen * Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller, Nicolas Palix * This file is part of Coccinelle. * @@ -63,18 +43,21 @@ let print_between = Common.print_between (* --------------------------------------------------------------------- *) (* Positions *) -let meta_pos = function - Ast0.MetaPos(name,_,_) -> - print_string "@"; - let (_,name) = Ast0.unwrap_mcode name in - print_string name - | Ast0.NoMetaPos -> () +let meta_pos l = + List.iter + (function + Ast0.MetaPos(name,_,_) -> + print_string "@"; + let (_,name) = Ast0.unwrap_mcode name in + print_string name) + l (* --------------------------------------------------------------------- *) (* Modified code *) let mcodekind brackets fn x info mc = - let print = function Ast.Noindent s | Ast.Indent s -> print_string s in + let print = function + Ast.Noindent s | Ast.Indent s | Ast.Space s -> print_string s in List.iter (function (s,_) -> print s) info.Ast0.strings_before; (match mc with Ast0.MINUS(plus_stream) -> @@ -90,7 +73,9 @@ let mcodekind brackets fn x info mc = then fn x else (print_string "-"; print_string lb; fn x; print_string rb); - U.print_anything ">>> " plus_stream + (match plus_stream with + Ast.NOREPLACEMENT -> () + | Ast.REPLACEMENT(plus_stream,_) -> U.print_anything ">>> " plus_stream) | Ast0.CONTEXT(plus_streams) -> let (lb,rb) = if !quiet @@ -142,6 +127,15 @@ let dots between fn d = | Ast0.CIRCLES(l) -> print_between between fn l | Ast0.STARS(l) -> print_between between fn l) +(* --------------------------------------------------------------------- *) +(* Disjunctions *) + +let do_disj lst processor = + print_string "\n("; force_newline(); + print_between (function _ -> print_string "\n|"; force_newline()) + processor lst; + print_string "\n)" + (* --------------------------------------------------------------------- *) let print_types = function @@ -161,9 +155,10 @@ let rec ident i = (function _ -> match Ast0.unwrap i with Ast0.Id(name) -> mcode print_string name - | Ast0.MetaId(name,_,_) -> mcode print_meta name + | Ast0.MetaId(name,_,_,_) -> mcode print_meta name | Ast0.MetaFunc(name,_,_) -> mcode print_meta name | Ast0.MetaLocalFunc(name,_,_) -> mcode print_meta name + | Ast0.DisjId(_,id_list,_,_) -> do_disj id_list ident | Ast0.OptIdent(id) -> print_string "?"; ident id | Ast0.UniqueIdent(id) -> print_string "!"; ident id) @@ -223,6 +218,9 @@ let rec expression e = mcode print_string_box lp; typeC ty; close_box(); mcode print_string rp | Ast0.TypeExp(ty) -> typeC ty + | Ast0.Constructor(lp,ty,rp,init) -> + mcode print_string_box lp; typeC ty; close_box(); + mcode print_string rp; initialiser init | Ast0.MetaErr(name,_,_) -> mcode print_meta name | Ast0.MetaExpr(name,_,ty,_,pure) -> mcode print_meta name; print_types ty(*; @@ -234,12 +232,7 @@ let rec expression e = | Ast0.PureContext -> print_string "pure_context")*) | Ast0.MetaExprList(name,_,_) -> mcode print_meta name | Ast0.EComma(cm) -> mcode print_string cm; print_space() - | Ast0.DisjExpr(_,exp_list,_,_) -> - print_string "\n("; force_newline(); - print_between - (function _ -> print_string "\n|"; force_newline()) - expression exp_list; - print_string "\n)" + | Ast0.DisjExpr(_,exp_list,_,_) -> do_disj exp_list expression | Ast0.NestExpr(starter,expr_dots,ender,None,multi) -> mcode print_string starter; start_block(); dots force_newline expression expr_dots; end_block(); @@ -293,8 +286,13 @@ and typeC t = | Ast0.Array(ty,lb,size,rb) -> typeC ty; mcode print_string lb; print_option expression size; mcode print_string rb - | Ast0.EnumName(kind,name) -> mcode print_string kind; print_string " "; - ident name + | Ast0.EnumName(kind,name) -> + mcode print_string kind; + print_option (function x -> ident x; print_string " ") name + | Ast0.EnumDef(ty,lb,ids,rb) -> + typeC ty; mcode print_string lb; + dots force_newline expression ids; + mcode print_string rb | Ast0.StructUnionName(kind,name) -> mcode U.structUnion kind; print_option (function x -> ident x; print_string " ") name @@ -304,12 +302,7 @@ and typeC t = mcode print_string rb | Ast0.TypeName(name)-> mcode print_string name; print_string " " | Ast0.MetaType(name,_)-> mcode print_meta name; print_string " " - | Ast0.DisjType(lp,types,mids,rp) -> - print_string "\n"; mcode print_string lp; force_newline(); - print_between - (function _ -> print_string "\n|"; force_newline()) - typeC types; - print_string "\n"; mcode print_string rp + | Ast0.DisjType(_,types,_,_) -> do_disj types typeC | Ast0.OptType(ty) -> print_string "?"; typeC ty | Ast0.UniqueType(ty) -> print_string "!"; typeC ty) @@ -344,7 +337,10 @@ and declaration d = print_context d (function _ -> match Ast0.unwrap d with - Ast0.Init(stg,ty,id,eq,ini,sem) -> + Ast0.MetaDecl(name,_) | Ast0.MetaField(name,_) + | Ast0.MetaFieldList(name,_,_) -> + mcode print_meta name + | Ast0.Init(stg,ty,id,eq,ini,sem) -> print_option (mcode U.storage) stg; print_named_type ty id; print_string " "; @@ -384,8 +380,10 @@ and initialiser i = (function _ -> match Ast0.unwrap i with Ast0.MetaInit(name,_)-> mcode print_meta name; print_string " " + | Ast0.MetaInitList(name,_,_)-> mcode print_meta name; print_string " " | Ast0.InitExpr(exp) -> expression exp - | Ast0.InitList(lb,initlist,rb) -> + | Ast0.InitList(lb,initlist,rb,ordered) -> + (*doesn't show commas dropped in unordered case*) mcode print_string lb; open_box 0; let _ = dots (function _ -> ()) initialiser initlist in close_box(); mcode print_string rb @@ -454,13 +452,14 @@ and statement arity s = dots force_newline (statement arity) body; end_block(); print_string arity; mcode print_string rbrace | Ast0.ExprStatement(exp,sem) -> - print_string arity; expression exp; mcode print_string sem + print_string arity; print_option expression exp; + mcode print_string sem | Ast0.IfThen(iff,lp,exp,rp,branch1,(info,aft)) -> print_string arity; mcode print_string iff; print_string " "; mcode print_string_box lp; expression exp; close_box(); mcode print_string rp; print_string " "; statement arity branch1; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) + mcode (function _ -> ()) ((),(),info,aft,ref [],-1) | Ast0.IfThenElse(iff,lp,exp,rp,branch1,els,branch2,(info,aft)) -> print_string arity; mcode print_string iff; print_string " "; mcode print_string_box lp; @@ -468,13 +467,13 @@ and statement arity s = statement arity branch1; print_string arity; mcode print_string els; print_string " "; statement arity branch2; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) + mcode (function _ -> ()) ((),(),info,aft,ref [],-1) | Ast0.While(whl,lp,exp,rp,body,(info,aft)) -> print_string arity; mcode print_string whl; print_string " "; mcode print_string_box lp; expression exp; close_box(); mcode print_string rp; print_string " "; statement arity body; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) + mcode (function _ -> ()) ((),(),info,aft,ref [],-1) | Ast0.Do(d,body,whl,lp,exp,rp,sem) -> print_string arity; mcode print_string d; print_string " "; statement arity body; @@ -489,14 +488,14 @@ and statement arity s = print_option expression e2; mcode print_string sem2; print_option expression e3; close_box(); mcode print_string rp; print_string " "; statement arity body; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) + mcode (function _ -> ()) ((),(),info,aft,ref [],-1) | Ast0.Iterator(nm,lp,args,rp,body,(info,aft)) -> print_string arity; ident nm; print_string " "; mcode print_string_box lp; let _ = dots (function _ -> ()) expression args in close_box(); mcode print_string rp; print_string " "; statement arity body; - mcode (function _ -> ()) ((),(),info,aft,ref Ast0.NoMetaPos,-1) + mcode (function _ -> ()) ((),(),info,aft,ref [],-1) | Ast0.Switch(switch,lp,exp,rp,lb,decls,cases,rb) -> print_string arity; mcode print_string switch; print_string " "; @@ -558,6 +557,8 @@ and statement arity s = whn | Ast0.Include(inc,s) -> mcode print_string inc; print_string " "; mcode U.inc_file s + | Ast0.Undef(def,id) -> + mcode print_string def; print_string " "; ident id | Ast0.Define(def,id,params,body) -> mcode print_string def; print_string " "; ident id; print_define_parameters params; @@ -633,8 +634,8 @@ let top_level t = Ast0.FILEINFO(old_file,new_file) -> print_string "--- "; mcode print_string old_file; force_newline(); print_string "+++ "; mcode print_string new_file - | Ast0.DECL(stmt) -> statement "" stmt - | Ast0.CODE(stmt_dots) -> + | Ast0.NONDECL(stmt) -> statement "" stmt + | Ast0.CODE(stmt_dots) | Ast0.TOPCODE(stmt_dots) -> dots force_newline (statement "") stmt_dots | Ast0.ERRORWORDS(exps) -> print_string "error words = ["; @@ -660,34 +661,25 @@ let unparse_anything x = | Ast0.DotsStmtTag(d) -> print_string "StmDots:"; force_newline(); statement_dots d - | Ast0.DotsDeclTag(d) -> - declaration_dots d - | Ast0.DotsCaseTag(d) -> - case_dots d - | Ast0.IdentTag(d) -> - ident d + | Ast0.DotsDeclTag(d) -> declaration_dots d + | Ast0.DotsCaseTag(d) -> case_dots d + | Ast0.IdentTag(d) -> ident d | Ast0.ExprTag(d) | Ast0.ArgExprTag(d) | Ast0.TestExprTag(d) -> print_string "Exp:"; force_newline(); expression d - | Ast0.TypeCTag(d) -> - typeC d - | Ast0.ParamTag(d) -> - parameterTypeDef d - | Ast0.InitTag(d) -> - initialiser d - | Ast0.DeclTag(d) -> - declaration d - | Ast0.StmtTag(d) -> + | Ast0.TypeCTag(d) -> typeC d + | Ast0.ParamTag(d) -> parameterTypeDef d + | Ast0.InitTag(d) -> initialiser d + | Ast0.DeclTag(d) -> declaration d + | Ast0.StmtTag(d) -> print_string "Stm:"; force_newline(); statement "" d - | Ast0.CaseLineTag(d) -> - case_line "" d - | Ast0.TopTag(d) -> - top_level d - | Ast0.IsoWhenTag(x) -> U.print_when_modif x - | Ast0.IsoWhenTTag(e) -> expression e - | Ast0.IsoWhenFTag(e) -> expression e - | Ast0.MetaPosTag(var) -> meta_pos var); + | Ast0.CaseLineTag(d) -> case_line "" d + | Ast0.TopTag(d) -> top_level d + | Ast0.IsoWhenTag(x) -> U.print_when_modif x + | Ast0.IsoWhenTTag(e) -> expression e + | Ast0.IsoWhenFTag(e) -> expression e + | Ast0.MetaPosTag(var) -> meta_pos [var]); quiet := q; print_newline()