X-Git-Url: https://git.hcoop.net/bpt/coccinelle.git/blobdiff_plain/faf9a90c4f9e1e85931cb6b01de660587416eb97..17ba07880e1838028b4516ba7a2db2147b3aa1c9:/parsing_cocci/unparse_ast0.ml diff --git a/parsing_cocci/unparse_ast0.ml b/parsing_cocci/unparse_ast0.ml index fe3dd11..4ac55e1 100644 --- a/parsing_cocci/unparse_ast0.ml +++ b/parsing_cocci/unparse_ast0.ml @@ -1,31 +1,38 @@ (* -* Copyright 2005-2009, Ecole des Mines de Nantes, University of Copenhagen -* Yoann Padioleau, Julia Lawall, Rene Rydhof Hansen, Henrik Stuart, Gilles Muller -* 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 2012, INRIA + * Julia Lawall, Gilles Muller + * Copyright 2010-2011, 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. + * + * 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. + *) open Format +module Ast = Ast_cocci module Ast0 = Ast0_cocci module U = Pretty_print_cocci let quiet = ref true (* true = no decoration on - context, etc *) +let full_ids = ref false (* true = print rule name as well *) + let start_block str = force_newline(); print_string " "; open_box 0 @@ -38,17 +45,24 @@ let print_between = Common.print_between (* --------------------------------------------------------------------- *) (* Positions *) -let meta_pos = function - Ast0.MetaPos(name,_,_) -> +let rec meta_pos l = + List.iter + (function var -> + let current_name = Ast0.meta_pos_name var in + let (_,name) = Ast0.unwrap_mcode current_name in print_string "@"; - let (_,name) = Ast0.unwrap_mcode name in - print_string name - | Ast0.NoMetaPos -> () + print_string name; + meta_pos (Ast0.get_pos current_name)) + l (* --------------------------------------------------------------------- *) (* Modified code *) -let mcodekind brackets fn x info = function +let mcodekind brackets fn x info mc = + 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) -> let (lb,rb) = if !quiet @@ -62,7 +76,9 @@ let mcodekind brackets fn x info = function 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 @@ -75,12 +91,7 @@ let mcodekind brackets fn x info = function (function x -> print_string lb; fn x; print_string rb) x plus_streams - | Ast0.PLUS -> - List.iter (function s -> print_string s; force_newline()) - info.Ast0.strings_before; - fn x; - List.iter (function s -> force_newline(); print_string s) - info.Ast0.strings_after + | Ast0.PLUS _ -> print_int (info.Ast0.pos_info.Ast0.column); fn x | Ast0.MIXED(plus_streams) -> let (lb,rb) = if !quiet @@ -91,17 +102,21 @@ let mcodekind brackets fn x info = function ("§","½"^n) in let (plus_streams,_,_) = !plus_streams in U.print_around (function x -> print_string lb; fn x; print_string rb) - x plus_streams + x plus_streams); + List.iter (function (s,_) -> print s) info.Ast0.strings_after -let mcode fn (x,_,info,mc,pos) = +let mcode fn (x,_,info,mc,pos,adj) = let fn x = fn x; meta_pos !pos in - mcodekind (Some info.Ast0.line_start)(*None*) fn x info mc + mcodekind (Some info.Ast0.pos_info.Ast0.line_start)(*None*) fn x info mc let print_context x fn = mcodekind (Some (Ast0.get_line x)) fn () (Ast0.get_info x) (Ast0.get_mcodekind x) -let print_meta (_,name) = print_string name +let print_meta (ctx,name) = + (if !full_ids + then (print_string ctx; print_string ":")); + print_string name (* --------------------------------------------------------------------- *) (* --------------------------------------------------------------------- *) @@ -115,6 +130,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 @@ -134,9 +158,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) @@ -159,6 +184,9 @@ let rec expression e = | Ast0.Assignment(left,op,right,_) -> expression left; print_string " "; mcode U.assignOp op; print_string " "; expression right + | Ast0.Sequence(left,op,right) -> + expression left; mcode print_string op; + print_string " "; expression right | Ast0.CondExpr(exp1,why,exp2,colon,exp3) -> expression exp1; print_string " "; mcode print_string why; print_option (function e -> print_string " "; expression e) exp2; @@ -196,6 +224,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(*; @@ -207,12 +238,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(); @@ -231,7 +257,9 @@ let rec expression e = | Ast0.Ecircles(dots,None) | Ast0.Estars(dots,None) -> mcode print_string dots | Ast0.OptExp(exp) -> print_string "?"; expression exp - | Ast0.UniqueExp(exp) -> print_string "!"; expression exp) + | Ast0.UniqueExp(exp) -> print_string "!"; expression exp + | Ast0.AsExpr(exp,asexp) -> expression exp; print_string "@"; + expression asexp) and expression_dots x = dots (function _ -> ()) expression x @@ -266,8 +294,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 @@ -277,14 +310,10 @@ 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) + | Ast0.UniqueType(ty) -> print_string "!"; typeC ty + | Ast0.AsType(ty,asty) -> typeC ty; print_string "@"; typeC asty) (* --------------------------------------------------------------------- *) (* Variable declaration *) @@ -317,7 +346,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 " "; @@ -330,6 +362,13 @@ and declaration d = ident name; mcode print_string_box lp; let _ = dots (function _ -> ()) expression args in close_box(); mcode print_string rp; mcode print_string sem + | Ast0.MacroDeclInit(name,lp,args,rp,eq,ini,sem) -> + ident name; mcode print_string_box lp; + let _ = dots (function _ -> ()) expression args in + close_box(); mcode print_string rp; + print_string " "; + mcode print_string eq; print_string " "; initialiser ini; + mcode print_string sem | Ast0.TyDecl(ty,sem) -> typeC ty; mcode print_string sem | Ast0.Typedef(stg,ty,id,sem) -> mcode print_string stg; typeC ty; typeC id; @@ -345,7 +384,9 @@ and declaration d = declaration whencode | Ast0.Ddots(dots,None) -> mcode print_string dots | Ast0.OptDecl(decl) -> print_string "?"; declaration decl - | Ast0.UniqueDecl(decl) -> print_string "!"; declaration decl) + | Ast0.UniqueDecl(decl) -> print_string "!"; declaration decl + | Ast0.AsDecl(decl,asdecl) -> + declaration decl; print_string "@"; declaration asdecl) and declaration_dots l = dots (function _ -> ()) declaration l @@ -356,32 +397,36 @@ and initialiser i = print_context i (function _ -> match Ast0.unwrap i with - Ast0.InitExpr(exp) -> expression exp - | Ast0.InitList(lb,initlist,rb) -> + 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,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 - | Ast0.InitGccDotName(dot,name,eq,ini) -> - mcode print_string dot; ident name; print_string " "; + | Ast0.InitGccExt(designators,eq,ini) -> + List.iter designator designators; print_string " "; mcode print_string eq; print_string " "; initialiser ini | Ast0.InitGccName(name,eq,ini) -> ident name; mcode print_string eq; initialiser ini - | Ast0.InitGccIndex(lb,exp,rb,eq,ini) -> - mcode print_string lb; expression exp; mcode print_string rb; - print_string " "; mcode print_string eq; print_string " "; - initialiser ini - | Ast0.InitGccRange(lb,exp1,dots,exp2,rb,eq,ini) -> - mcode print_string lb; expression exp1; mcode print_string dots; - expression exp2; mcode print_string rb; - print_string " "; mcode print_string eq; print_string " "; - initialiser ini | Ast0.IComma(cm) -> mcode print_string cm; force_newline() | Ast0.Idots(d,Some whencode) -> mcode print_string d; print_string " WHEN != "; initialiser whencode | Ast0.Idots(d,None) -> mcode print_string d | Ast0.OptIni(ini) -> print_string "?"; initialiser ini - | Ast0.UniqueIni(ini) -> print_string "!"; initialiser ini) + | Ast0.UniqueIni(ini) -> print_string "!"; initialiser ini + | Ast0.AsInit(ini,asini) -> initialiser ini; print_string "@"; + initialiser asini) + +and designator = function + Ast0.DesignatorField(dot,id) -> mcode print_string dot; ident id + | Ast0.DesignatorIndex(lb,exp,rb) -> + mcode print_string lb; expression exp; mcode print_string rb + | Ast0.DesignatorRange(lb,min,dots,max,rb) -> + mcode print_string lb; expression min; mcode print_string dots; + expression max; mcode print_string rb and initialiser_list l = dots (function _ -> ()) initialiser l @@ -421,19 +466,25 @@ and statement arity s = print_string arity; mcode print_string lbrace; start_block(); dots force_newline (statement arity) body; end_block(); print_string arity; mcode print_string rbrace - | Ast0.Decl(_,decl) -> print_string arity; declaration decl + | Ast0.Decl(_,decl) -> + Printf.printf "statement mcodekind %s\n" + (Dumper.dump (Ast0.get_mcodekind s)); + Printf.printf "decl mcodekind %s\n" + (Dumper.dump (Ast0.get_mcodekind decl)); + print_string arity; declaration decl | Ast0.Seq(lbrace,body,rbrace) -> print_string arity; mcode print_string lbrace; start_block(); 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) + 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; @@ -441,13 +492,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) + 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) + 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; @@ -462,19 +513,20 @@ 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) + 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) - | Ast0.Switch(switch,lp,exp,rp,lb,cases,rb) -> + 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 " "; mcode print_string_box lp; expression exp; close_box(); mcode print_string rp; print_string " "; mcode print_string lb; + dots force_newline (statement arity) decls; dots force_newline (case_line arity) cases; mcode print_string rb | Ast0.Break(br,sem) -> @@ -499,14 +551,14 @@ and statement arity s = | Ast0.PureContext -> print_string "pure_context")*) | Ast0.MetaStmtList(name,_) -> print_string arity; mcode print_meta name - | Ast0.Disj(_,statement_dots_list,_,_) -> + | Ast0.Disj(starter,statement_dots_list,_,ender) -> print_string arity; - print_string "\n("; force_newline(); + print_string "\n"; mcode print_string starter; force_newline(); print_between (function _ -> print_string "\n|"; force_newline()) (dots force_newline (statement arity)) statement_dots_list; - print_string "\n)" + print_string "\n"; mcode print_string ender | Ast0.Nest(starter,stmt_dots,ender,whn,multi) -> print_string arity; mcode print_string starter; @@ -530,13 +582,17 @@ 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; print_string " "; dots force_newline (statement arity) body | Ast0.OptStm(re) -> statement "?" re - | Ast0.UniqueStm(re) -> statement "!" re) + | Ast0.UniqueStm(re) -> statement "!" re + | Ast0.AsStmt(stm,asstm) -> statement arity stm; print_string "@"; + statement arity asstm) and print_define_parameters params = match Ast0.unwrap params with @@ -584,6 +640,12 @@ and case_line arity c = mcode print_string case; print_string " "; expression exp; mcode print_string colon; print_string " "; dots force_newline (statement arity) code + | Ast0.DisjCase(starter,case_lines,mids,ender) -> + print_string "\n("; force_newline(); + print_between + (function _ -> print_string "\n|"; force_newline()) + (case_line arity) case_lines; + print_string "\n)" | Ast0.OptCase(case) -> case_line "?" case) and statement_dots l = dots (function _ -> ()) (statement "") l @@ -599,8 +661,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 = ["; @@ -626,34 +688,26 @@ 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 [x] + | Ast0.HiddenVarTag(var) -> failwith "should not need to be printed"); quiet := q; print_newline()