@@ -16,8 +16,6 @@ use rustc_ast::token::{BinOpToken, DelimToken, Token, TokenKind};
16
16
use rustc_ast:: tokenstream:: { Cursor , Spacing , TokenStream , TokenTree } ;
17
17
use rustc_ast:: { ast, ptr} ;
18
18
use rustc_ast_pretty:: pprust;
19
- use rustc_parse:: parser:: { ForceCollect , Parser } ;
20
- use rustc_parse:: { stream_to_parser, MACRO_ARGUMENTS } ;
21
19
use rustc_span:: {
22
20
symbol:: { self , kw} ,
23
21
BytePos , Span , Symbol , DUMMY_SP ,
@@ -30,6 +28,7 @@ use crate::config::lists::*;
30
28
use crate :: expr:: { rewrite_array, rewrite_assign_rhs, RhsAssignKind } ;
31
29
use crate :: lists:: { itemize_list, write_list, ListFormatting } ;
32
30
use crate :: overflow;
31
+ use crate :: parse:: macros:: { build_parser, parse_macro_args, ParsedMacroArgs } ;
33
32
use crate :: rewrite:: { Rewrite , RewriteContext } ;
34
33
use crate :: shape:: { Indent , Shape } ;
35
34
use crate :: source_map:: SpanUtils ;
@@ -60,7 +59,7 @@ pub(crate) enum MacroArg {
60
59
}
61
60
62
61
impl MacroArg {
63
- fn is_item ( & self ) -> bool {
62
+ pub ( crate ) fn is_item ( & self ) -> bool {
64
63
match self {
65
64
MacroArg :: Item ( ..) => true ,
66
65
_ => false ,
@@ -90,61 +89,6 @@ impl Rewrite for MacroArg {
90
89
}
91
90
}
92
91
93
- fn build_parser < ' a > ( context : & RewriteContext < ' a > , cursor : Cursor ) -> Parser < ' a > {
94
- stream_to_parser (
95
- context. parse_sess . inner ( ) ,
96
- cursor. collect ( ) ,
97
- MACRO_ARGUMENTS ,
98
- )
99
- }
100
-
101
- fn parse_macro_arg < ' a , ' b : ' a > ( parser : & ' a mut Parser < ' b > ) -> Option < MacroArg > {
102
- macro_rules! parse_macro_arg {
103
- ( $macro_arg: ident, $parser: expr, $f: expr) => {
104
- let mut cloned_parser = ( * parser) . clone( ) ;
105
- match $parser( & mut cloned_parser) {
106
- Ok ( x) => {
107
- if parser. sess. span_diagnostic. has_errors( ) {
108
- parser. sess. span_diagnostic. reset_err_count( ) ;
109
- } else {
110
- // Parsing succeeded.
111
- * parser = cloned_parser;
112
- return Some ( MacroArg :: $macro_arg( $f( x) ?) ) ;
113
- }
114
- }
115
- Err ( mut e) => {
116
- e. cancel( ) ;
117
- parser. sess. span_diagnostic. reset_err_count( ) ;
118
- }
119
- }
120
- } ;
121
- }
122
-
123
- parse_macro_arg ! (
124
- Expr ,
125
- |parser: & mut rustc_parse:: parser:: Parser <' b>| parser. parse_expr( ) ,
126
- |x: ptr:: P <ast:: Expr >| Some ( x)
127
- ) ;
128
- parse_macro_arg ! (
129
- Ty ,
130
- |parser: & mut rustc_parse:: parser:: Parser <' b>| parser. parse_ty( ) ,
131
- |x: ptr:: P <ast:: Ty >| Some ( x)
132
- ) ;
133
- parse_macro_arg ! (
134
- Pat ,
135
- |parser: & mut rustc_parse:: parser:: Parser <' b>| parser. parse_pat_no_top_alt( None ) ,
136
- |x: ptr:: P <ast:: Pat >| Some ( x)
137
- ) ;
138
- // `parse_item` returns `Option<ptr::P<ast::Item>>`.
139
- parse_macro_arg ! (
140
- Item ,
141
- |parser: & mut rustc_parse:: parser:: Parser <' b>| parser. parse_item( ForceCollect :: No ) ,
142
- |x: Option <ptr:: P <ast:: Item >>| x
143
- ) ;
144
-
145
- None
146
- }
147
-
148
92
/// Rewrite macro name without using pretty-printer if possible.
149
93
fn rewrite_macro_name (
150
94
context : & RewriteContext < ' _ > ,
@@ -232,25 +176,6 @@ pub(crate) fn rewrite_macro(
232
176
}
233
177
}
234
178
235
- fn check_keyword < ' a , ' b : ' a > ( parser : & ' a mut Parser < ' b > ) -> Option < MacroArg > {
236
- for & keyword in RUST_KW . iter ( ) {
237
- if parser. token . is_keyword ( keyword)
238
- && parser. look_ahead ( 1 , |t| {
239
- t. kind == TokenKind :: Eof
240
- || t. kind == TokenKind :: Comma
241
- || t. kind == TokenKind :: CloseDelim ( DelimToken :: NoDelim )
242
- } )
243
- {
244
- parser. bump ( ) ;
245
- return Some ( MacroArg :: Keyword (
246
- symbol:: Ident :: with_dummy_span ( keyword) ,
247
- parser. prev_token . span ,
248
- ) ) ;
249
- }
250
- }
251
- None
252
- }
253
-
254
179
fn rewrite_macro_inner (
255
180
mac : & ast:: MacCall ,
256
181
extra_ident : Option < symbol:: Ident > ,
@@ -269,8 +194,9 @@ fn rewrite_macro_inner(
269
194
let original_style = macro_style ( mac, context) ;
270
195
271
196
let macro_name = rewrite_macro_name ( context, & mac. path , extra_ident) ;
197
+ let is_forced_bracket = FORCED_BRACKET_MACROS . contains ( & & macro_name[ ..] ) ;
272
198
273
- let style = if FORCED_BRACKET_MACROS . contains ( & & macro_name [ .. ] ) && !is_nested_macro {
199
+ let style = if is_forced_bracket && !is_nested_macro {
274
200
DelimToken :: Bracket
275
201
} else {
276
202
original_style
@@ -294,67 +220,21 @@ fn rewrite_macro_inner(
294
220
}
295
221
// Format well-known macros which cannot be parsed as a valid AST.
296
222
if macro_name == "lazy_static!" && !has_comment {
297
- if let success @ Some ( ..) = format_lazy_static ( context, shape, & ts ) {
223
+ if let success @ Some ( ..) = format_lazy_static ( context, shape, ts . trees ( ) . collect ( ) ) {
298
224
return success;
299
225
}
300
226
}
301
227
302
- let mut parser = build_parser ( context, ts. trees ( ) ) ;
303
- let mut arg_vec = Vec :: new ( ) ;
304
- let mut vec_with_semi = false ;
305
- let mut trailing_comma = false ;
306
-
307
- if DelimToken :: Brace != style {
308
- loop {
309
- if let Some ( arg) = check_keyword ( & mut parser) {
310
- arg_vec. push ( arg) ;
311
- } else if let Some ( arg) = parse_macro_arg ( & mut parser) {
312
- arg_vec. push ( arg) ;
313
- } else {
314
- return return_macro_parse_failure_fallback ( context, shape. indent , mac. span ( ) ) ;
315
- }
316
-
317
- match parser. token . kind {
318
- TokenKind :: Eof => break ,
319
- TokenKind :: Comma => ( ) ,
320
- TokenKind :: Semi => {
321
- // Try to parse `vec![expr; expr]`
322
- if FORCED_BRACKET_MACROS . contains ( & & macro_name[ ..] ) {
323
- parser. bump ( ) ;
324
- if parser. token . kind != TokenKind :: Eof {
325
- match parse_macro_arg ( & mut parser) {
326
- Some ( arg) => {
327
- arg_vec. push ( arg) ;
328
- parser. bump ( ) ;
329
- if parser. token . kind == TokenKind :: Eof && arg_vec. len ( ) == 2 {
330
- vec_with_semi = true ;
331
- break ;
332
- }
333
- }
334
- None => {
335
- return return_macro_parse_failure_fallback (
336
- context,
337
- shape. indent ,
338
- mac. span ( ) ,
339
- ) ;
340
- }
341
- }
342
- }
343
- }
344
- return return_macro_parse_failure_fallback ( context, shape. indent , mac. span ( ) ) ;
345
- }
346
- _ if arg_vec. last ( ) . map_or ( false , MacroArg :: is_item) => continue ,
347
- _ => return return_macro_parse_failure_fallback ( context, shape. indent , mac. span ( ) ) ,
348
- }
349
-
350
- parser. bump ( ) ;
351
-
352
- if parser. token . kind == TokenKind :: Eof {
353
- trailing_comma = true ;
354
- break ;
355
- }
228
+ let ParsedMacroArgs {
229
+ args : arg_vec,
230
+ vec_with_semi,
231
+ trailing_comma,
232
+ } = match parse_macro_args ( context, ts, style, is_forced_bracket) {
233
+ Some ( args) => args,
234
+ None => {
235
+ return return_macro_parse_failure_fallback ( context, shape. indent , mac. span ( ) ) ;
356
236
}
357
- }
237
+ } ;
358
238
359
239
if !arg_vec. is_empty ( ) && arg_vec. iter ( ) . all ( MacroArg :: is_item) {
360
240
return rewrite_macro_with_items (
@@ -1179,7 +1059,7 @@ pub(crate) fn convert_try_mac(
1179
1059
let path = & pprust:: path_to_string ( & mac. path ) ;
1180
1060
if path == "try" || path == "r#try" {
1181
1061
let ts = mac. args . inner_tokens ( ) ;
1182
- let mut parser = build_parser ( context, ts. trees ( ) ) ;
1062
+ let mut parser = build_parser ( context, ts) ;
1183
1063
1184
1064
Some ( ast:: Expr {
1185
1065
id : ast:: NodeId :: root ( ) , // dummy value
@@ -1414,10 +1294,10 @@ impl MacroBranch {
1414
1294
fn format_lazy_static (
1415
1295
context : & RewriteContext < ' _ > ,
1416
1296
shape : Shape ,
1417
- ts : & TokenStream ,
1297
+ ts : TokenStream ,
1418
1298
) -> Option < String > {
1419
1299
let mut result = String :: with_capacity ( 1024 ) ;
1420
- let mut parser = build_parser ( context, ts. trees ( ) ) ;
1300
+ let mut parser = build_parser ( context, ts) ;
1421
1301
let nested_shape = shape
1422
1302
. block_indent ( context. config . tab_spaces ( ) )
1423
1303
. with_max_width ( context. config ) ;
@@ -1528,65 +1408,3 @@ fn rewrite_macro_with_items(
1528
1408
result. push_str ( trailing_semicolon) ;
1529
1409
Some ( result)
1530
1410
}
1531
-
1532
- const RUST_KW : [ Symbol ; 59 ] = [
1533
- kw:: PathRoot ,
1534
- kw:: DollarCrate ,
1535
- kw:: Underscore ,
1536
- kw:: As ,
1537
- kw:: Box ,
1538
- kw:: Break ,
1539
- kw:: Const ,
1540
- kw:: Continue ,
1541
- kw:: Crate ,
1542
- kw:: Else ,
1543
- kw:: Enum ,
1544
- kw:: Extern ,
1545
- kw:: False ,
1546
- kw:: Fn ,
1547
- kw:: For ,
1548
- kw:: If ,
1549
- kw:: Impl ,
1550
- kw:: In ,
1551
- kw:: Let ,
1552
- kw:: Loop ,
1553
- kw:: Match ,
1554
- kw:: Mod ,
1555
- kw:: Move ,
1556
- kw:: Mut ,
1557
- kw:: Pub ,
1558
- kw:: Ref ,
1559
- kw:: Return ,
1560
- kw:: SelfLower ,
1561
- kw:: SelfUpper ,
1562
- kw:: Static ,
1563
- kw:: Struct ,
1564
- kw:: Super ,
1565
- kw:: Trait ,
1566
- kw:: True ,
1567
- kw:: Type ,
1568
- kw:: Unsafe ,
1569
- kw:: Use ,
1570
- kw:: Where ,
1571
- kw:: While ,
1572
- kw:: Abstract ,
1573
- kw:: Become ,
1574
- kw:: Do ,
1575
- kw:: Final ,
1576
- kw:: Macro ,
1577
- kw:: Override ,
1578
- kw:: Priv ,
1579
- kw:: Typeof ,
1580
- kw:: Unsized ,
1581
- kw:: Virtual ,
1582
- kw:: Yield ,
1583
- kw:: Dyn ,
1584
- kw:: Async ,
1585
- kw:: Try ,
1586
- kw:: UnderscoreLifetime ,
1587
- kw:: StaticLifetime ,
1588
- kw:: Auto ,
1589
- kw:: Catch ,
1590
- kw:: Default ,
1591
- kw:: Union ,
1592
- ] ;
0 commit comments