@@ -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`
@@ -2195,19 +2196,27 @@ impl<'a> Parser<'a> {
2195
2196
} )
2196
2197
}
2197
2198
2198
- fn expect_delimited_token_tree ( & mut self ) -> PResult < ' a , ( token:: DelimToken , ThinTokenStream ) > {
2199
- match self . token {
2200
- token:: OpenDelim ( delim) => match self . parse_token_tree ( ) {
2201
- TokenTree :: Delimited ( _, delimited) => Ok ( ( delim, delimited. stream ( ) . into ( ) ) ) ,
2202
- _ => unreachable ! ( ) ,
2203
- } ,
2199
+ fn expect_delimited_token_tree ( & mut self ) -> PResult < ' a , ( MacDelimiter , ThinTokenStream ) > {
2200
+ let delim = match self . token {
2201
+ token:: OpenDelim ( delim) => delim,
2204
2202
_ => {
2205
2203
let msg = "expected open delimiter" ;
2206
2204
let mut err = self . fatal ( msg) ;
2207
2205
err. span_label ( self . span , msg) ;
2208
- Err ( err)
2206
+ return Err ( err)
2209
2207
}
2210
- }
2208
+ } ;
2209
+ let delimited = match self . parse_token_tree ( ) {
2210
+ TokenTree :: Delimited ( _, delimited) => delimited,
2211
+ _ => unreachable ! ( ) ,
2212
+ } ;
2213
+ let delim = match delim {
2214
+ token:: Paren => MacDelimiter :: Parenthesis ,
2215
+ token:: Bracket => MacDelimiter :: Bracket ,
2216
+ token:: Brace => MacDelimiter :: Brace ,
2217
+ token:: NoDelim => self . bug ( "unexpected no delimiter" ) ,
2218
+ } ;
2219
+ Ok ( ( delim, delimited. stream ( ) . into ( ) ) )
2211
2220
}
2212
2221
2213
2222
/// At the bottom (top?) of the precedence hierarchy,
@@ -2420,9 +2429,10 @@ impl<'a> Parser<'a> {
2420
2429
// `!`, as an operator, is prefix, so we know this isn't that
2421
2430
if self . eat ( & token:: Not ) {
2422
2431
// MACRO INVOCATION expression
2423
- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
2432
+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
2424
2433
let hi = self . prev_span ;
2425
- return Ok ( self . mk_mac_expr ( lo. to ( hi) , Mac_ { path : pth, tts : tts } , attrs) ) ;
2434
+ let node = Mac_ { path : pth, tts, delim } ;
2435
+ return Ok ( self . mk_mac_expr ( lo. to ( hi) , node, attrs) )
2426
2436
}
2427
2437
if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
2428
2438
// This is a struct literal, unless we're prohibited
@@ -3895,8 +3905,8 @@ impl<'a> Parser<'a> {
3895
3905
token:: Not if qself. is_none ( ) => {
3896
3906
// Parse macro invocation
3897
3907
self . bump ( ) ;
3898
- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
3899
- let mac = respan ( lo. to ( self . prev_span ) , Mac_ { path : path , tts : tts } ) ;
3908
+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
3909
+ let mac = respan ( lo. to ( self . prev_span ) , Mac_ { path, tts, delim } ) ;
3900
3910
pat = PatKind :: Mac ( mac) ;
3901
3911
}
3902
3912
token:: DotDotDot | token:: DotDotEq | token:: DotDot => {
@@ -4289,7 +4299,7 @@ impl<'a> Parser<'a> {
4289
4299
4290
4300
let ident = self . parse_ident ( ) ?;
4291
4301
let ( delim, tokens) = self . expect_delimited_token_tree ( ) ?;
4292
- if delim != token :: Brace {
4302
+ if delim != MacDelimiter :: Brace {
4293
4303
if !self . eat ( & token:: Semi ) {
4294
4304
let msg = "macros that expand to items must either \
4295
4305
be surrounded with braces or followed by a semicolon";
@@ -4374,8 +4384,8 @@ impl<'a> Parser<'a> {
4374
4384
// check that we're pointing at delimiters (need to check
4375
4385
// again after the `if`, because of `parse_ident`
4376
4386
// consuming more tokens).
4377
- let delim = match self . token {
4378
- token:: OpenDelim ( delim ) => delim ,
4387
+ match self . token {
4388
+ token:: OpenDelim ( _ ) => { }
4379
4389
_ => {
4380
4390
// we only expect an ident if we didn't parse one
4381
4391
// above.
@@ -4391,20 +4401,20 @@ impl<'a> Parser<'a> {
4391
4401
err. span_label ( self . span , format ! ( "expected {}`(` or `{{`" , ident_str) ) ;
4392
4402
return Err ( err)
4393
4403
} ,
4394
- } ;
4404
+ }
4395
4405
4396
- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
4406
+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
4397
4407
let hi = self . prev_span ;
4398
4408
4399
- let style = if delim == token :: Brace {
4409
+ let style = if delim == MacDelimiter :: Brace {
4400
4410
MacStmtStyle :: Braces
4401
4411
} else {
4402
4412
MacStmtStyle :: NoBraces
4403
4413
} ;
4404
4414
4405
4415
if id. name == keywords:: Invalid . name ( ) {
4406
- let mac = respan ( lo. to ( hi) , Mac_ { path : pth, tts : tts } ) ;
4407
- let node = if delim == token :: Brace ||
4416
+ let mac = respan ( lo. to ( hi) , Mac_ { path : pth, tts, delim } ) ;
4417
+ let node = if delim == MacDelimiter :: Brace ||
4408
4418
self . token == token:: Semi || self . token == token:: Eof {
4409
4419
StmtKind :: Mac ( P ( ( mac, style, attrs. into ( ) ) ) )
4410
4420
}
@@ -4452,7 +4462,7 @@ impl<'a> Parser<'a> {
4452
4462
node : StmtKind :: Item ( {
4453
4463
self . mk_item (
4454
4464
span, id /*id is good here*/ ,
4455
- ItemKind :: Mac ( respan ( span, Mac_ { path : pth, tts : tts } ) ) ,
4465
+ ItemKind :: Mac ( respan ( span, Mac_ { path : pth, tts, delim } ) ) ,
4456
4466
respan ( lo, VisibilityKind :: Inherited ) ,
4457
4467
attrs)
4458
4468
} ) ,
@@ -6894,7 +6904,7 @@ impl<'a> Parser<'a> {
6894
6904
} ;
6895
6905
// eat a matched-delimiter token tree:
6896
6906
let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
6897
- if delim != token :: Brace {
6907
+ if delim != MacDelimiter :: Brace {
6898
6908
if !self . eat ( & token:: Semi ) {
6899
6909
self . span_err ( self . prev_span ,
6900
6910
"macros that expand to items must either \
@@ -6904,7 +6914,7 @@ impl<'a> Parser<'a> {
6904
6914
}
6905
6915
6906
6916
let hi = self . prev_span ;
6907
- let mac = respan ( mac_lo. to ( hi) , Mac_ { path : pth, tts : tts } ) ;
6917
+ let mac = respan ( mac_lo. to ( hi) , Mac_ { path : pth, tts, delim } ) ;
6908
6918
let item = self . mk_item ( lo. to ( hi) , id, ItemKind :: Mac ( mac) , visibility, attrs) ;
6909
6919
return Ok ( Some ( item) ) ;
6910
6920
}
@@ -6948,11 +6958,11 @@ impl<'a> Parser<'a> {
6948
6958
6949
6959
// eat a matched-delimiter token tree:
6950
6960
let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
6951
- if delim != token :: Brace {
6961
+ if delim != MacDelimiter :: Brace {
6952
6962
self . expect ( & token:: Semi ) ?
6953
6963
}
6954
6964
6955
- Ok ( Some ( respan ( lo. to ( self . prev_span ) , Mac_ { path : pth, tts : tts } ) ) )
6965
+ Ok ( Some ( respan ( lo. to ( self . prev_span ) , Mac_ { path : pth, tts, delim } ) ) )
6956
6966
} else {
6957
6967
Ok ( None )
6958
6968
}
0 commit comments