X-Git-Url: https://git.hcoop.net/bpt/coccinelle.git/blobdiff_plain/90aeb998d88488b4402e7b211b064056d175fcbb..7fe62b653dbe13c8fc74c58c3ca4b8af523c1637:/parsing_cocci/visitor_ast0.ml diff --git a/parsing_cocci/visitor_ast0.ml b/parsing_cocci/visitor_ast0.ml index e64ff94..91066d6 100644 --- a/parsing_cocci/visitor_ast0.ml +++ b/parsing_cocci/visitor_ast0.ml @@ -52,6 +52,15 @@ let visitor mode bind option_default let get_option f = function Some x -> let (n,e) = f x in (n,Some e) | None -> (option_default,None) in + let do_disj starter lst mids ender processor rebuilder = + let (starter_n,starter) = string_mcode starter in + let (lst_n,lst) = map_split processor lst in + let (mids_n,mids) = map_split string_mcode mids in + let (ender_n,ender) = string_mcode ender in + (multibind + [starter_n;List.hd lst_n; + multibind (List.map2 bind mids_n (List.tl lst_n));ender_n], + rebuilder starter lst mids ender) in let rec expression_dots d = let k d = rewrap d @@ -132,15 +141,19 @@ let visitor mode bind option_default (match Ast0.unwrap i with Ast0.Id(name) -> let (n,name) = string_mcode name in (n,Ast0.Id(name)) - | Ast0.MetaId(name,constraints,pure) -> + | Ast0.MetaId(name,constraints,seed,pure) -> let (n,name) = meta_mcode name in - (n,Ast0.MetaId(name,constraints,pure)) + (n,Ast0.MetaId(name,constraints,seed,pure)) | Ast0.MetaFunc(name,constraints,pure) -> let (n,name) = meta_mcode name in (n,Ast0.MetaFunc(name,constraints,pure)) | Ast0.MetaLocalFunc(name,constraints,pure) -> let (n,name) = meta_mcode name in (n,Ast0.MetaLocalFunc(name,constraints,pure)) + | Ast0.DisjId(starter,id_list,mids,ender) -> + do_disj starter id_list mids ender ident + (fun starter id_list mids ender -> + Ast0.DisjId(starter,id_list,mids,ender)) | Ast0.OptIdent(id) -> let (n,id) = ident id in (n,Ast0.OptIdent(id)) | Ast0.UniqueIdent(id) -> @@ -238,6 +251,12 @@ let visitor mode bind option_default | Ast0.TypeExp(ty) -> let (ty_n,ty) = typeC ty in (ty_n,Ast0.TypeExp(ty)) + | Ast0.Constructor(lp,ty,rp,init) -> + let (lp_n,lp) = string_mcode lp in + let (ty_n,ty) = typeC ty in + let (rp_n,rp) = string_mcode rp in + let (init_n,init) = initialiser init in + (multibind [lp_n;ty_n;rp_n;init_n], Ast0.Constructor(lp,ty,rp,init)) | Ast0.MetaErr(name,constraints,pure) -> let (name_n,name) = meta_mcode name in (name_n,Ast0.MetaErr(name,constraints,pure)) @@ -250,15 +269,9 @@ let visitor mode bind option_default | Ast0.EComma(cm) -> let (cm_n,cm) = string_mcode cm in (cm_n,Ast0.EComma(cm)) | Ast0.DisjExpr(starter,expr_list,mids,ender) -> - let (starter_n,starter) = string_mcode starter in - let (expr_list_n,expr_list) = map_split expression expr_list in - let (mids_n,mids) = map_split string_mcode mids in - let (ender_n,ender) = string_mcode ender in - (multibind - [starter_n;List.hd expr_list_n; - multibind (List.map2 bind mids_n (List.tl expr_list_n)); - ender_n], - Ast0.DisjExpr(starter,expr_list,mids,ender)) + do_disj starter expr_list mids ender expression + (fun starter expr_list mids ender -> + Ast0.DisjExpr(starter,expr_list,mids,ender)) | Ast0.NestExpr(starter,expr_dots,ender,whencode,multi) -> let (starter_n,starter) = string_mcode starter in let (expr_dots_n,expr_dots) = expression_dots expr_dots in @@ -311,8 +324,14 @@ let visitor mode bind option_default | Ast0.Array(ty,lb,size,rb) -> array_type (ty,lb,size,rb) [] | Ast0.EnumName(kind,name) -> let (kind_n,kind) = string_mcode kind in - let (name_n,name) = ident name in + let (name_n,name) = get_option ident name in (bind kind_n name_n, Ast0.EnumName(kind,name)) + | Ast0.EnumDef(ty,lb,ids,rb) -> + let (ty_n,ty) = typeC ty in + let (lb_n,lb) = string_mcode lb in + let (ids_n,ids) = expression_dots ids in + let (rb_n,rb) = string_mcode rb in + (multibind [ty_n;lb_n;ids_n;rb_n], Ast0.EnumDef(ty,lb,ids,rb)) | Ast0.StructUnionName(kind,name) -> let (kind_n,kind) = struct_mcode kind in let (name_n,name) = get_option ident name in @@ -331,15 +350,9 @@ let visitor mode bind option_default let (name_n,name) = meta_mcode name in (name_n,Ast0.MetaType(name,pure)) | Ast0.DisjType(starter,types,mids,ender) -> - let (starter_n,starter) = string_mcode starter in - let (types_n,types) = map_split typeC types in - let (mids_n,mids) = map_split string_mcode mids in - let (ender_n,ender) = string_mcode ender in - (multibind - [starter_n;List.hd types_n; - multibind (List.map2 bind mids_n (List.tl types_n)); - ender_n], - Ast0.DisjType(starter,types,mids,ender)) + do_disj starter types mids ender typeC + (fun starter types mids ender -> + Ast0.DisjType(starter,types,mids,ender)) | Ast0.OptType(ty) -> let (ty_n,ty) = typeC ty in (ty_n, Ast0.OptType(ty)) | Ast0.UniqueType(ty) -> @@ -392,7 +405,16 @@ let visitor mode bind option_default let k d = rewrap d (match Ast0.unwrap d with - Ast0.Init(stg,ty,id,eq,ini,sem) -> + Ast0.MetaDecl(name,pure) -> + let (n,name) = meta_mcode name in + (n,Ast0.MetaDecl(name,pure)) + | Ast0.MetaField(name,pure) -> + let (n,name) = meta_mcode name in + (n,Ast0.MetaField(name,pure)) + | Ast0.MetaFieldList(name,lenname,pure) -> + let (n,name) = meta_mcode name in + (n,Ast0.MetaFieldList(name,lenname,pure)) + | Ast0.Init(stg,ty,id,eq,ini,sem) -> let (stg_n,stg) = get_option storage_mcode stg in let ((ty_id_n,ty),id) = named_type ty id in let (eq_n,eq) = string_mcode eq in @@ -424,15 +446,9 @@ let visitor mode bind option_default let (sem_n,sem) = string_mcode sem in (multibind [stg_n;ty_n;id_n;sem_n], Ast0.Typedef(stg,ty,id,sem)) | Ast0.DisjDecl(starter,decls,mids,ender) -> - let (starter_n,starter) = string_mcode starter in - let (decls_n,decls) = map_split declaration decls in - let (mids_n,mids) = map_split string_mcode mids in - let (ender_n,ender) = string_mcode ender in - (multibind - [starter_n;List.hd decls_n; - multibind (List.map2 bind mids_n (List.tl decls_n)); - ender_n], - Ast0.DisjDecl(starter,decls,mids,ender)) + do_disj starter decls mids ender declaration + (fun starter decls mids ender -> + Ast0.DisjDecl(starter,decls,mids,ender)) | Ast0.Ddots(dots,whencode) -> let (dots_n,dots) = string_mcode dots in let (whencode_n,whencode) = get_option declaration whencode in @@ -450,14 +466,18 @@ let visitor mode bind option_default Ast0.MetaInit(name,pure) -> let (name_n,name) = meta_mcode name in (name_n,Ast0.MetaInit(name,pure)) + | Ast0.MetaInitList(name,lenname,pure) -> + let (name_n,name) = meta_mcode name in + (name_n,Ast0.MetaInitList(name,lenname,pure)) | Ast0.InitExpr(exp) -> let (exp_n,exp) = expression exp in (exp_n,Ast0.InitExpr(exp)) - | Ast0.InitList(lb,initlist,rb) -> + | Ast0.InitList(lb,initlist,rb,ordered) -> let (lb_n,lb) = string_mcode lb in let (initlist_n,initlist) = initialiser_list initlist in let (rb_n,rb) = string_mcode rb in - (multibind [lb_n;initlist_n;rb_n], Ast0.InitList(lb,initlist,rb)) + (multibind [lb_n;initlist_n;rb_n], + Ast0.InitList(lb,initlist,rb,ordered)) | Ast0.InitGccExt(designators,eq,ini) -> let (dn,designators) = map_split_bind designator designators in let (eq_n,eq) = string_mcode eq in @@ -570,7 +590,7 @@ let visitor mode bind option_default (multibind [lbrace_n;body_n;rbrace_n], Ast0.Seq(lbrace,body,rbrace)) | Ast0.ExprStatement(exp,sem) -> - let (exp_n,exp) = expression exp in + let (exp_n,exp) = get_option expression exp in let (sem_n,sem) = string_mcode sem in (bind exp_n sem_n, Ast0.ExprStatement(exp,sem)) | Ast0.IfThen(iff,lp,exp,rp,branch1,aft) -> @@ -673,16 +693,9 @@ let visitor mode bind option_default let (name_n,name) = meta_mcode name in (name_n,Ast0.MetaStmtList(name,pure)) | Ast0.Disj(starter,statement_dots_list,mids,ender) -> - let (starter_n,starter) = string_mcode starter in - let (s_n,statement_dots_list) = - map_split statement_dots statement_dots_list in - let (mids_n,mids) = map_split string_mcode mids in - let (ender_n,ender) = string_mcode ender in - (multibind - [starter_n;List.hd s_n; - multibind (List.map2 bind mids_n (List.tl s_n)); - ender_n], - Ast0.Disj(starter,statement_dots_list,mids,ender)) + do_disj starter statement_dots_list mids ender statement_dots + (fun starter statement_dots_list mids ender -> + Ast0.Disj(starter,statement_dots_list,mids,ender)) | Ast0.Nest(starter,stmt_dots,ender,whn,multi) -> let (starter_n,starter) = string_mcode starter in let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in @@ -722,6 +735,10 @@ let visitor mode bind option_default let (inc_n,inc) = string_mcode inc in let (name_n,name) = inc_mcode name in (bind inc_n name_n, Ast0.Include(inc,name)) + | Ast0.Undef(def,id) -> + let (def_n,def) = string_mcode def in + let (id_n,id) = ident id in + (multibind [def_n;id_n],Ast0.Undef(def,id)) | Ast0.Define(def,id,params,body) -> let (def_n,def) = string_mcode def in let (id_n,id) = ident id in @@ -813,15 +830,9 @@ let visitor mode bind option_default (multibind [case_n;exp_n;colon_n;code_n], Ast0.Case(case,exp,colon,code)) | Ast0.DisjCase(starter,case_lines,mids,ender) -> - let (starter_n,starter) = string_mcode starter in - let (case_lines_n,case_lines) = map_split case_line case_lines in - let (mids_n,mids) = map_split string_mcode mids in - let (ender_n,ender) = string_mcode ender in - (multibind - [starter_n;List.hd case_lines_n; - multibind (List.map2 bind mids_n (List.tl case_lines_n)); - ender_n], - Ast0.DisjCase(starter,case_lines,mids,ender)) + do_disj starter case_lines mids ender case_line + (fun starter case_lines mids ender -> + Ast0.DisjCase(starter,case_lines,mids,ender)) | Ast0.OptCase(case) -> let (n,case) = case_line case in (n,Ast0.OptCase(case))) in casefn all_functions k c @@ -834,12 +845,15 @@ let visitor mode bind option_default let (old_file_n,old_file) = string_mcode old_file in let (new_file_n,new_file) = string_mcode new_file in (bind old_file_n new_file_n,Ast0.FILEINFO(old_file,new_file)) - | Ast0.DECL(statement_dots) -> + | Ast0.NONDECL(statement_dots) -> let (n,statement_dots) = statement statement_dots in - (n,Ast0.DECL(statement_dots)) + (n,Ast0.NONDECL(statement_dots)) | Ast0.CODE(stmt_dots) -> let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in (stmt_dots_n, Ast0.CODE(stmt_dots)) + | Ast0.TOPCODE(stmt_dots) -> + let (stmt_dots_n,stmt_dots) = statement_dots stmt_dots in + (stmt_dots_n, Ast0.TOPCODE(stmt_dots)) | Ast0.ERRORWORDS(exps) -> let (n,exps) = map_split_bind expression exps in (n, Ast0.ERRORWORDS(exps))