1- use rustc_ast:: token:: { Delimiter , TokenKind } ;
1+ use rustc_ast:: token:: TokenKind ;
22use rustc_ast:: tokenstream:: TokenStream ;
33use rustc_ast:: { ast, ptr} ;
44use rustc_parse:: parser:: { ForceCollect , Parser } ;
@@ -69,6 +69,7 @@ fn parse_macro_arg<'a, 'b: 'a>(parser: &'a mut Parser<'b>) -> Option<MacroArg> {
6969 None
7070}
7171
72+ #[ derive( Default ) ]
7273pub ( crate ) struct ParsedMacroArgs {
7374 pub ( crate ) vec_with_semi : bool ,
7475 pub ( crate ) trailing_comma : bool ,
@@ -95,59 +96,56 @@ fn check_keyword<'a, 'b: 'a>(parser: &'a mut Parser<'b>) -> Option<MacroArg> {
9596pub ( crate ) fn parse_macro_args (
9697 context : & RewriteContext < ' _ > ,
9798 tokens : TokenStream ,
98- style : Delimiter ,
9999 forced_bracket : bool ,
100100) -> Option < ParsedMacroArgs > {
101101 let mut parser = build_parser ( context, tokens) ;
102102 let mut args = Vec :: new ( ) ;
103103 let mut vec_with_semi = false ;
104104 let mut trailing_comma = false ;
105105
106- if Delimiter :: Brace != style {
107- loop {
108- if let Some ( arg) = check_keyword ( & mut parser) {
109- args. push ( arg) ;
110- } else if let Some ( arg) = parse_macro_arg ( & mut parser) {
111- args. push ( arg) ;
112- } else {
113- return None ;
114- }
106+ loop {
107+ if let Some ( arg) = check_keyword ( & mut parser) {
108+ args. push ( arg) ;
109+ } else if let Some ( arg) = parse_macro_arg ( & mut parser) {
110+ args. push ( arg) ;
111+ } else {
112+ return None ;
113+ }
115114
116- match parser. token . kind {
117- TokenKind :: Eof => break ,
118- TokenKind :: Comma => ( ) ,
119- TokenKind :: Semi => {
120- // Try to parse `vec![expr; expr]`
121- if forced_bracket {
122- parser. bump ( ) ;
123- if parser. token . kind != TokenKind :: Eof {
124- match parse_macro_arg ( & mut parser) {
125- Some ( arg) => {
126- args. push ( arg) ;
127- parser. bump ( ) ;
128- if parser. token . kind == TokenKind :: Eof && args. len ( ) == 2 {
129- vec_with_semi = true ;
130- break ;
131- }
132- }
133- None => {
134- return None ;
115+ match parser. token . kind {
116+ TokenKind :: Eof => break ,
117+ TokenKind :: Comma => ( ) ,
118+ TokenKind :: Semi => {
119+ // Try to parse `vec![expr; expr]`
120+ if forced_bracket {
121+ parser. bump ( ) ;
122+ if parser. token . kind != TokenKind :: Eof {
123+ match parse_macro_arg ( & mut parser) {
124+ Some ( arg) => {
125+ args. push ( arg) ;
126+ parser. bump ( ) ;
127+ if parser. token . kind == TokenKind :: Eof && args. len ( ) == 2 {
128+ vec_with_semi = true ;
129+ break ;
135130 }
136131 }
132+ None => {
133+ return None ;
134+ }
137135 }
138136 }
139- return None ;
140137 }
141- _ if args. last ( ) . map_or ( false , MacroArg :: is_item) => continue ,
142- _ => return None ,
138+ return None ;
143139 }
140+ _ if args. last ( ) . map_or ( false , MacroArg :: is_item) => continue ,
141+ _ => return None ,
142+ }
144143
145- parser. bump ( ) ;
144+ parser. bump ( ) ;
146145
147- if parser. token . kind == TokenKind :: Eof {
148- trailing_comma = true ;
149- break ;
150- }
146+ if parser. token . kind == TokenKind :: Eof {
147+ trailing_comma = true ;
148+ break ;
151149 }
152150 }
153151
0 commit comments