@@ -8,12 +8,12 @@ use syntax::ast::{ItemKind, ImplItem, ImplItemKind, TraitItem, TraitItemKind, Us
88use syntax:: ast:: { PathSegment , IsAuto , Constness , IsAsync , Unsafety , Defaultness , Extern , StrLit } ;
99use syntax:: ast:: { Visibility , VisibilityKind , Mutability , FnHeader , ForeignItem , ForeignItemKind } ;
1010use 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 } ;
1212use syntax:: print:: pprust;
1313use syntax:: ptr:: P ;
1414use syntax:: ThinVec ;
1515use syntax:: token;
16- use syntax:: tokenstream:: { TokenTree , TokenStream } ;
16+ use syntax:: tokenstream:: { DelimSpan , TokenTree , TokenStream } ;
1717use syntax:: source_map:: { self , respan, Span } ;
1818use syntax:: struct_span_err;
1919use syntax_pos:: BytePos ;
@@ -1617,33 +1617,31 @@ impl<'a> Parser<'a> {
16171617 vis : & Visibility ,
16181618 lo : Span
16191619 ) -> PResult < ' a , Option < P < Item > > > {
1620- let token_lo = self . token . span ;
16211620 let ( ident, def) = if self . eat_keyword ( kw:: Macro ) {
16221621 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 ( ) ?
16281624 } 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 ( ) ;
16301627 let body = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
16311628 self . parse_token_tree ( )
16321629 } else {
1633- self . unexpected ( ) ?;
1634- unreachable ! ( )
1630+ return self . unexpected ( ) ;
16351631 } ;
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( ) ,
16391636 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) )
16411640 } else {
1642- self . unexpected ( ) ?;
1643- unreachable ! ( )
1641+ return self . unexpected ( ) ;
16441642 } ;
16451643
1646- ( ident, ast:: MacroDef { tokens : tokens . into ( ) , legacy : false } )
1644+ ( ident, ast:: MacroDef { body , legacy : false } )
16471645 } else if self . check_keyword ( sym:: macro_rules) &&
16481646 self . look_ahead ( 1 , |t| * t == token:: Not ) &&
16491647 self . look_ahead ( 2 , |t| t. is_ident ( ) ) {
@@ -1653,12 +1651,12 @@ impl<'a> Parser<'a> {
16531651 self . bump ( ) ;
16541652
16551653 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 ) {
16581656 self . report_invalid_macro_expansion_item ( ) ;
16591657 }
16601658
1661- ( ident, ast:: MacroDef { tokens : args . inner_tokens ( ) , legacy : true } )
1659+ ( ident, ast:: MacroDef { body , legacy : true } )
16621660 } else {
16631661 return Ok ( None ) ;
16641662 } ;
0 commit comments