@@ -26,7 +26,7 @@ use ast::{Ident, ImplItem, IsAuto, Item, ItemKind};
2626use ast:: { Label , Lifetime , LifetimeDef , Lit , LitKind , UintTy } ;
2727use ast:: Local ;
2828use ast:: MacStmtStyle ;
29- use ast:: { Mac , Mac_ } ;
29+ use ast:: { Mac , Mac_ , MacDelimiter } ;
3030use ast:: { MutTy , Mutability } ;
3131use ast:: { Pat , PatKind , PathSegment } ;
3232use ast:: { PolyTraitRef , QSelf } ;
@@ -1611,8 +1611,9 @@ impl<'a> Parser<'a> {
16111611 let path = self . parse_path ( PathStyle :: Type ) ?;
16121612 if self . eat ( & token:: Not ) {
16131613 // 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) )
16161617 } else {
16171618 // Just a type path or bound list (trait object type) starting with a trait.
16181619 // `Type`
@@ -2195,19 +2196,27 @@ impl<'a> Parser<'a> {
21952196 } )
21962197 }
21972198
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,
22042202 _ => {
22052203 let msg = "expected open delimiter" ;
22062204 let mut err = self . fatal ( msg) ;
22072205 err. span_label ( self . span , msg) ;
2208- Err ( err)
2206+ return Err ( err)
22092207 }
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 ( ) ) )
22112220 }
22122221
22132222 /// At the bottom (top?) of the precedence hierarchy,
@@ -2420,9 +2429,10 @@ impl<'a> Parser<'a> {
24202429 // `!`, as an operator, is prefix, so we know this isn't that
24212430 if self . eat ( & token:: Not ) {
24222431 // MACRO INVOCATION expression
2423- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
2432+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
24242433 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) )
24262436 }
24272437 if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
24282438 // This is a struct literal, unless we're prohibited
@@ -3895,8 +3905,8 @@ impl<'a> Parser<'a> {
38953905 token:: Not if qself. is_none ( ) => {
38963906 // Parse macro invocation
38973907 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 } ) ;
39003910 pat = PatKind :: Mac ( mac) ;
39013911 }
39023912 token:: DotDotDot | token:: DotDotEq | token:: DotDot => {
@@ -4289,7 +4299,7 @@ impl<'a> Parser<'a> {
42894299
42904300 let ident = self . parse_ident ( ) ?;
42914301 let ( delim, tokens) = self . expect_delimited_token_tree ( ) ?;
4292- if delim != token :: Brace {
4302+ if delim != MacDelimiter :: Brace {
42934303 if !self . eat ( & token:: Semi ) {
42944304 let msg = "macros that expand to items must either \
42954305 be surrounded with braces or followed by a semicolon";
@@ -4374,8 +4384,8 @@ impl<'a> Parser<'a> {
43744384 // check that we're pointing at delimiters (need to check
43754385 // again after the `if`, because of `parse_ident`
43764386 // consuming more tokens).
4377- let delim = match self . token {
4378- token:: OpenDelim ( delim ) => delim ,
4387+ match self . token {
4388+ token:: OpenDelim ( _ ) => { }
43794389 _ => {
43804390 // we only expect an ident if we didn't parse one
43814391 // above.
@@ -4391,20 +4401,20 @@ impl<'a> Parser<'a> {
43914401 err. span_label ( self . span , format ! ( "expected {}`(` or `{{`" , ident_str) ) ;
43924402 return Err ( err)
43934403 } ,
4394- } ;
4404+ }
43954405
4396- let ( _ , tts) = self . expect_delimited_token_tree ( ) ?;
4406+ let ( delim , tts) = self . expect_delimited_token_tree ( ) ?;
43974407 let hi = self . prev_span ;
43984408
4399- let style = if delim == token :: Brace {
4409+ let style = if delim == MacDelimiter :: Brace {
44004410 MacStmtStyle :: Braces
44014411 } else {
44024412 MacStmtStyle :: NoBraces
44034413 } ;
44044414
44054415 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 ||
44084418 self . token == token:: Semi || self . token == token:: Eof {
44094419 StmtKind :: Mac ( P ( ( mac, style, attrs. into ( ) ) ) )
44104420 }
@@ -4452,7 +4462,7 @@ impl<'a> Parser<'a> {
44524462 node : StmtKind :: Item ( {
44534463 self . mk_item (
44544464 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 } ) ) ,
44564466 respan ( lo, VisibilityKind :: Inherited ) ,
44574467 attrs)
44584468 } ) ,
@@ -6894,7 +6904,7 @@ impl<'a> Parser<'a> {
68946904 } ;
68956905 // eat a matched-delimiter token tree:
68966906 let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
6897- if delim != token :: Brace {
6907+ if delim != MacDelimiter :: Brace {
68986908 if !self . eat ( & token:: Semi ) {
68996909 self . span_err ( self . prev_span ,
69006910 "macros that expand to items must either \
@@ -6904,7 +6914,7 @@ impl<'a> Parser<'a> {
69046914 }
69056915
69066916 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 } ) ;
69086918 let item = self . mk_item ( lo. to ( hi) , id, ItemKind :: Mac ( mac) , visibility, attrs) ;
69096919 return Ok ( Some ( item) ) ;
69106920 }
@@ -6948,11 +6958,11 @@ impl<'a> Parser<'a> {
69486958
69496959 // eat a matched-delimiter token tree:
69506960 let ( delim, tts) = self . expect_delimited_token_tree ( ) ?;
6951- if delim != token :: Brace {
6961+ if delim != MacDelimiter :: Brace {
69526962 self . expect ( & token:: Semi ) ?
69536963 }
69546964
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 } ) ) )
69566966 } else {
69576967 Ok ( None )
69586968 }
0 commit comments