@@ -8,12 +8,12 @@ use syntax::ast::{ItemKind, ImplItem, ImplItemKind, TraitItem, TraitItemKind, Us
8
8
use syntax:: ast:: { PathSegment , IsAuto , Constness , IsAsync , Unsafety , Defaultness , Extern , StrLit } ;
9
9
use syntax:: ast:: { Visibility , VisibilityKind , Mutability , FnHeader , ForeignItem , ForeignItemKind } ;
10
10
use syntax:: ast:: { Ty , TyKind , Generics , TraitRef , EnumDef , Variant , VariantData , StructField } ;
11
- use syntax:: ast:: { Mac , Block , BindingMode , FnDecl , FnSig , SelfKind , Param } ;
11
+ use syntax:: ast:: { Mac , MacArgs , MacDelimiter , Block , BindingMode , FnDecl , FnSig , SelfKind , Param } ;
12
12
use syntax:: print:: pprust;
13
13
use syntax:: ptr:: P ;
14
14
use syntax:: ThinVec ;
15
15
use syntax:: token;
16
- use syntax:: tokenstream:: { TokenTree , TokenStream } ;
16
+ use syntax:: tokenstream:: { DelimSpan , TokenTree , TokenStream } ;
17
17
use syntax:: source_map:: { self , respan, Span } ;
18
18
use syntax:: struct_span_err;
19
19
use syntax_pos:: BytePos ;
@@ -1617,33 +1617,31 @@ impl<'a> Parser<'a> {
1617
1617
vis : & Visibility ,
1618
1618
lo : Span
1619
1619
) -> PResult < ' a , Option < P < Item > > > {
1620
- let token_lo = self . token . span ;
1621
1620
let ( ident, def) = if self . eat_keyword ( kw:: Macro ) {
1622
1621
let ident = self . parse_ident ( ) ?;
1623
- let tokens = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
1624
- match self . parse_token_tree ( ) {
1625
- TokenTree :: Delimited ( _, _, tts) => tts,
1626
- _ => unreachable ! ( ) ,
1627
- }
1622
+ let body = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
1623
+ self . parse_mac_args ( ) ?
1628
1624
} else if self . check ( & token:: OpenDelim ( token:: Paren ) ) {
1629
- let args = self . parse_token_tree ( ) ;
1625
+ let params = self . parse_token_tree ( ) ;
1626
+ let pspan = params. span ( ) ;
1630
1627
let body = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
1631
1628
self . parse_token_tree ( )
1632
1629
} else {
1633
- self . unexpected ( ) ?;
1634
- unreachable ! ( )
1630
+ return self . unexpected ( ) ;
1635
1631
} ;
1636
- TokenStream :: new ( vec ! [
1637
- args. into( ) ,
1638
- TokenTree :: token( token:: FatArrow , token_lo. to( self . prev_span) ) . into( ) ,
1632
+ let bspan = body. span ( ) ;
1633
+ let tokens = TokenStream :: new ( vec ! [
1634
+ params. into( ) ,
1635
+ TokenTree :: token( token:: FatArrow , pspan. between( bspan) ) . into( ) ,
1639
1636
body. into( ) ,
1640
- ] )
1637
+ ] ) ;
1638
+ let dspan = DelimSpan :: from_pair ( pspan. shrink_to_lo ( ) , bspan. shrink_to_hi ( ) ) ;
1639
+ P ( MacArgs :: Delimited ( dspan, MacDelimiter :: Brace , tokens) )
1641
1640
} else {
1642
- self . unexpected ( ) ?;
1643
- unreachable ! ( )
1641
+ return self . unexpected ( ) ;
1644
1642
} ;
1645
1643
1646
- ( ident, ast:: MacroDef { tokens : tokens . into ( ) , legacy : false } )
1644
+ ( ident, ast:: MacroDef { body , legacy : false } )
1647
1645
} else if self . check_keyword ( sym:: macro_rules) &&
1648
1646
self . look_ahead ( 1 , |t| * t == token:: Not ) &&
1649
1647
self . look_ahead ( 2 , |t| t. is_ident ( ) ) {
@@ -1653,12 +1651,12 @@ impl<'a> Parser<'a> {
1653
1651
self . bump ( ) ;
1654
1652
1655
1653
let ident = self . parse_ident ( ) ?;
1656
- let args = self . parse_mac_args ( ) ?;
1657
- if args . need_semicolon ( ) && !self . eat ( & token:: Semi ) {
1654
+ let body = self . parse_mac_args ( ) ?;
1655
+ if body . need_semicolon ( ) && !self . eat ( & token:: Semi ) {
1658
1656
self . report_invalid_macro_expansion_item ( ) ;
1659
1657
}
1660
1658
1661
- ( ident, ast:: MacroDef { tokens : args . inner_tokens ( ) , legacy : true } )
1659
+ ( ident, ast:: MacroDef { body , legacy : true } )
1662
1660
} else {
1663
1661
return Ok ( None ) ;
1664
1662
} ;
0 commit comments