@@ -26,7 +26,7 @@ use ast::{Ident, ImplItem, IsAuto, Item, ItemKind};
26
26
use ast:: { Label , Lifetime , LifetimeDef , Lit , LitKind , UintTy } ;
27
27
use ast:: Local ;
28
28
use ast:: MacStmtStyle ;
29
- use ast:: { Mac , Mac_ } ;
29
+ use ast:: { Mac , Mac_ , MacDelimiter } ;
30
30
use ast:: { MutTy , Mutability } ;
31
31
use ast:: { Pat , PatKind , PathSegment } ;
32
32
use ast:: { PolyTraitRef , QSelf } ;
@@ -1611,8 +1611,9 @@ impl<'a> Parser<'a> {
1611
1611
let path = self . parse_path ( PathStyle :: Type ) ?;
1612
1612
if self . eat ( & token:: Not ) {
1613
1613
// Macro invocation in type position
1614
- let ( _, tts) = self . expect_delimited_token_tree ( ) ?;
1615
- TyKind :: Mac ( respan ( lo. to ( self . prev_span ) , Mac_ { path : path, tts : tts } ) )
1614
+ let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
1615
+ let node = Mac_ { path, tts, delim } ;
1616
+ TyKind :: Mac ( respan ( lo. to ( self . prev_span ) , node) )
1616
1617
} else {
1617
1618
// Just a type path or bound list (trait object type) starting with a trait.
1618
1619
// `Type`
@@ -2181,19 +2182,27 @@ impl<'a> Parser<'a> {
2181
2182
} )
2182
2183
}
2183
2184
2184
- fn expect_delimited_token_tree ( & mut self ) -> PResult < ' a , ( token:: DelimToken , ThinTokenStream ) > {
2185
- match self . token {
2186
- token:: OpenDelim ( delim) => match self . parse_token_tree ( ) {
2187
- TokenTree :: Delimited ( _, delimited) => Ok ( ( delim, delimited. stream ( ) . into ( ) ) ) ,
2188
- _ => unreachable ! ( ) ,
2189
- } ,
2185
+ fn expect_delimited_token_tree ( & mut self ) -> PResult < ' a , ( MacDelimiter , ThinTokenStream ) > {
2186
+ let delim = match self . token {
2187
+ token:: OpenDelim ( delim) => delim,
2190
2188
_ => {
2191
2189
let msg = "expected open delimiter" ;
2192
2190
let mut err = self . fatal ( msg) ;
2193
2191
err. span_label ( self . span , msg) ;
2194
- Err ( err)
2192
+ return Err ( err)
2195
2193
}
2196
- }
2194
+ } ;
2195
+ let delimited = match self . parse_token_tree ( ) {
2196
+ TokenTree :: Delimited ( _, delimited) => delimited,
2197
+ _ => unreachable ! ( ) ,
2198
+ } ;
2199
+ let delim = match delim {
2200
+ token:: Paren => MacDelimiter :: Parenthesis ,
2201
+ token:: Bracket => MacDelimiter :: Bracket ,
2202
+ token:: Brace => MacDelimiter :: Brace ,
2203
+ token:: NoDelim => self . bug ( "unexpected no delimiter" ) ,
2204
+ } ;
2205
+ Ok ( ( delim, delimited. stream ( ) . into ( ) ) )
2197
2206
}
2198
2207
2199
2208
/// At the bottom (top?) of the precedence hierarchy,
@@ -2406,9 +2415,10 @@ impl<'a> Parser<'a> {
2406
2415
// `!`, as an operator, is prefix, so we know this isn't that
2407
2416
if self . eat ( & token:: Not ) {
2408
2417
// MACRO INVOCATION expression
2409
- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
2418
+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
2410
2419
let hi = self . prev_span ;
2411
- return Ok ( self . mk_mac_expr ( lo. to ( hi) , Mac_ { path : pth, tts : tts } , attrs) ) ;
2420
+ let node = Mac_ { path : pth, tts, delim } ;
2421
+ return Ok ( self . mk_mac_expr ( lo. to ( hi) , node, attrs) )
2412
2422
}
2413
2423
if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
2414
2424
// This is a struct literal, unless we're prohibited
@@ -3881,8 +3891,8 @@ impl<'a> Parser<'a> {
3881
3891
token:: Not if qself. is_none ( ) => {
3882
3892
// Parse macro invocation
3883
3893
self . bump ( ) ;
3884
- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
3885
- let mac = respan ( lo. to ( self . prev_span ) , Mac_ { path : path , tts : tts } ) ;
3894
+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
3895
+ let mac = respan ( lo. to ( self . prev_span ) , Mac_ { path, tts, delim } ) ;
3886
3896
pat = PatKind :: Mac ( mac) ;
3887
3897
}
3888
3898
token:: DotDotDot | token:: DotDotEq | token:: DotDot => {
@@ -4275,7 +4285,7 @@ impl<'a> Parser<'a> {
4275
4285
4276
4286
let ident = self . parse_ident ( ) ?;
4277
4287
let ( delim, tokens) = self . expect_delimited_token_tree ( ) ?;
4278
- if delim != token :: Brace {
4288
+ if delim != MacDelimiter :: Brace {
4279
4289
if !self . eat ( & token:: Semi ) {
4280
4290
let msg = "macros that expand to items must either \
4281
4291
be surrounded with braces or followed by a semicolon";
@@ -4360,8 +4370,8 @@ impl<'a> Parser<'a> {
4360
4370
// check that we're pointing at delimiters (need to check
4361
4371
// again after the `if`, because of `parse_ident`
4362
4372
// consuming more tokens).
4363
- let delim = match self . token {
4364
- token:: OpenDelim ( delim ) => delim ,
4373
+ match self . token {
4374
+ token:: OpenDelim ( _ ) => { }
4365
4375
_ => {
4366
4376
// we only expect an ident if we didn't parse one
4367
4377
// above.
@@ -4377,20 +4387,20 @@ impl<'a> Parser<'a> {
4377
4387
err. span_label ( self . span , format ! ( "expected {}`(` or `{{`" , ident_str) ) ;
4378
4388
return Err ( err)
4379
4389
} ,
4380
- } ;
4390
+ }
4381
4391
4382
- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
4392
+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
4383
4393
let hi = self . prev_span ;
4384
4394
4385
- let style = if delim == token :: Brace {
4395
+ let style = if delim == MacDelimiter :: Brace {
4386
4396
MacStmtStyle :: Braces
4387
4397
} else {
4388
4398
MacStmtStyle :: NoBraces
4389
4399
} ;
4390
4400
4391
4401
if id. name == keywords:: Invalid . name ( ) {
4392
- let mac = respan ( lo. to ( hi) , Mac_ { path : pth, tts : tts } ) ;
4393
- let node = if delim == token :: Brace ||
4402
+ let mac = respan ( lo. to ( hi) , Mac_ { path : pth, tts, delim } ) ;
4403
+ let node = if delim == MacDelimiter :: Brace ||
4394
4404
self . token == token:: Semi || self . token == token:: Eof {
4395
4405
StmtKind :: Mac ( P ( ( mac, style, attrs. into ( ) ) ) )
4396
4406
}
@@ -4438,7 +4448,7 @@ impl<'a> Parser<'a> {
4438
4448
node : StmtKind :: Item ( {
4439
4449
self . mk_item (
4440
4450
span, id /*id is good here*/ ,
4441
- ItemKind :: Mac ( respan ( span, Mac_ { path : pth, tts : tts } ) ) ,
4451
+ ItemKind :: Mac ( respan ( span, Mac_ { path : pth, tts, delim } ) ) ,
4442
4452
respan ( lo, VisibilityKind :: Inherited ) ,
4443
4453
attrs)
4444
4454
} ) ,
@@ -6871,7 +6881,7 @@ impl<'a> Parser<'a> {
6871
6881
} ;
6872
6882
// eat a matched-delimiter token tree:
6873
6883
let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
6874
- if delim != token :: Brace {
6884
+ if delim != MacDelimiter :: Brace {
6875
6885
if !self . eat ( & token:: Semi ) {
6876
6886
self . span_err ( self . prev_span ,
6877
6887
"macros that expand to items must either \
@@ -6881,7 +6891,7 @@ impl<'a> Parser<'a> {
6881
6891
}
6882
6892
6883
6893
let hi = self . prev_span ;
6884
- let mac = respan ( mac_lo. to ( hi) , Mac_ { path : pth, tts : tts } ) ;
6894
+ let mac = respan ( mac_lo. to ( hi) , Mac_ { path : pth, tts, delim } ) ;
6885
6895
let item = self . mk_item ( lo. to ( hi) , id, ItemKind :: Mac ( mac) , visibility, attrs) ;
6886
6896
return Ok ( Some ( item) ) ;
6887
6897
}
@@ -6925,11 +6935,11 @@ impl<'a> Parser<'a> {
6925
6935
6926
6936
// eat a matched-delimiter token tree:
6927
6937
let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
6928
- if delim != token :: Brace {
6938
+ if delim != MacDelimiter :: Brace {
6929
6939
self . expect ( & token:: Semi ) ?
6930
6940
}
6931
6941
6932
- Ok ( Some ( respan ( lo. to ( self . prev_span ) , Mac_ { path : pth, tts : tts } ) ) )
6942
+ Ok ( Some ( respan ( lo. to ( self . prev_span ) , Mac_ { path : pth, tts, delim } ) ) )
6933
6943
} else {
6934
6944
Ok ( None )
6935
6945
}
0 commit comments