The SmPL AST has a separate enum_decl for a enumerator. Make corresponding changes in Unparse_cocci and Pretty_print_cocci to correctly pretty print enumerators.
Signed-off-by: Jaskaran Singh <[email protected]> --- parsing_c/unparse_cocci.ml | 27 ++++++++++++++++++++++++--- parsing_cocci/pretty_print_cocci.ml | 18 +++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/parsing_c/unparse_cocci.ml b/parsing_c/unparse_cocci.ml index 30e755e9..8dff2b81 100644 --- a/parsing_c/unparse_cocci.ml +++ b/parsing_c/unparse_cocci.ml @@ -738,7 +738,7 @@ and typeC ty = | Ast.EnumDef(ty,lb,ids,rb) -> fullType ty; ft_space ty; mcode print_string lb; - dots force_newline expression ids; + dots force_newline enum_decl ids; mcode print_string rb | Ast.StructUnionName(kind,name) -> mcode structUnion kind; print_option_prespace ident name @@ -952,6 +952,24 @@ and annotated_field d = | Ast.OptField(decl) -> raise CantBeInPlus | Ast.Fdots(_,_) -> raise CantBeInPlus +and enum_decl d = + match Ast.unwrap d with + Ast.Enum(name,enum_val) -> + ident name; + pr_space(); + print_option + (function (eq,eval) -> + mcode print_string eq; pr_space(); expression eval) enum_val + | Ast.EnumComma(cm) -> + mcode (print_string_with_hint (SpaceOrNewline (ref " "))) cm + | Ast.EnumDots(dots,whencode) when generating -> + mcode print_string dots; + print_option + (function w -> + print_text " when != "; + enum_decl w) whencode + | Ast.EnumDots(dots,whencode) -> raise CantBeInPlus + (* --------------------------------------------------------------------- *) (* Initialiser *) @@ -1420,6 +1438,7 @@ let pp_any = function | Ast.InitTag(x) -> initialiser false x; false | Ast.DeclarationTag(x) -> declaration x; false | Ast.FieldTag(x) -> field x; false + | Ast.EnumDeclTag(x) -> enum_decl x; false | Ast.StorageTag(x) -> storage x unknown unknown; false | Ast.IncFileTag(x) -> inc_file x unknown unknown; false @@ -1473,6 +1492,7 @@ let pp_any = function | Ast.StmtDotsTag(x) -> dots force_newline (statement "") x; false | Ast.AnnDeclDotsTag(x) -> dots force_newline annotated_decl x; false | Ast.AnnFieldDotsTag(x) -> dots force_newline annotated_field x; false + | Ast.EnumDeclDotsTag(x) -> dots force_newline enum_decl x; false | Ast.DefParDotsTag(x) -> dots (fun _ -> ()) print_define_param x; false | Ast.TypeCTag(x) -> typeC x; false @@ -1505,7 +1525,7 @@ in force_newline(); force_newline() | (Ast.Directive _::_) | (Ast.Rule_elemTag _::_) | (Ast.StatementTag _::_) - | (Ast.FieldTag _::_) | (Ast.InitTag _::_) + | (Ast.FieldTag _::_) | (Ast.EnumDeclTag _::_) | (Ast.InitTag _::_) | (Ast.DeclarationTag _::_) | (Ast.Token ("}",_)::_) -> prnl hd | _ -> () in let newline_after _ = @@ -1516,7 +1536,8 @@ in (if isfn s then force_newline()); force_newline() | (Ast.Directive _::_) | (Ast.StmtDotsTag _::_) - | (Ast.Rule_elemTag _::_) | (Ast.FieldTag _::_) | (Ast.InitTag _::_) + | (Ast.Rule_elemTag _::_) | (Ast.FieldTag _::_) + | (Ast.EnumDeclTag _::_)| (Ast.InitTag _::_) | (Ast.DeclarationTag _::_) | (Ast.Token ("{",_)::_) -> force_newline() | _ -> () in diff --git a/parsing_cocci/pretty_print_cocci.ml b/parsing_cocci/pretty_print_cocci.ml index 6338e464..f6b2894f 100644 --- a/parsing_cocci/pretty_print_cocci.ml +++ b/parsing_cocci/pretty_print_cocci.ml @@ -439,7 +439,7 @@ and typeC ty = print_option (function x -> ident x; print_string " ") name | Ast.EnumDef(ty,lb,ids,rb) -> fullType ty; mcode print_string lb; - dots force_newline expression ids; + dots force_newline enum_decl ids; mcode print_string rb | Ast.StructUnionName(kind,name) -> mcode structUnion kind; @@ -585,6 +585,20 @@ and annotated_field arity d = | Ast.ConjField(decls) -> print_disj_list (annotated_field arity) decls "&" | Ast.OptField(decl) -> print_string "?"; annotated_field arity decl +and enum_decl d = + match Ast.unwrap d with + Ast.Enum(name,enum_val) -> + ident name; + (match enum_val with + None -> () + | Some(eq,eval) -> + mcode print_string eq; + expression eval) + | Ast.EnumComma(cm) -> mcode print_string cm + | Ast.EnumDots(dots,Some whencode) -> + mcode print_string dots; print_string " when != "; enum_decl whencode + | Ast.EnumDots(dots,None) -> mcode print_string dots + (* --------------------------------------------------------------------- *) (* Initialiser *) @@ -1090,6 +1104,7 @@ let _ = | Ast.InitTag(x) -> initialiser x | Ast.DeclarationTag(x) -> declaration x | Ast.FieldTag(x) -> field x + | Ast.EnumDeclTag(x) -> enum_decl x | Ast.StorageTag(x) -> storage x | Ast.IncFileTag(x) -> inc_file x | Ast.Rule_elemTag(x) -> rule_elem "" x @@ -1110,6 +1125,7 @@ let _ = | Ast.StmtDotsTag(x) -> dots (function _ -> ()) (statement "") x | Ast.AnnDeclDotsTag(x) -> dots (function _ -> ()) (annotated_decl "") x | Ast.AnnFieldDotsTag(x) -> dots (function _ -> ()) (annotated_field "") x + | Ast.EnumDeclDotsTag(x) -> dots (function _ -> ()) enum_decl x | Ast.DefParDotsTag(x) -> dots (function _ -> ()) print_define_param x | Ast.TypeCTag(x) -> typeC x | Ast.ParamTag(x) -> parameterTypeDef x -- 2.21.1 _______________________________________________ Cocci mailing list [email protected] https://systeme.lip6.fr/mailman/listinfo/cocci
