@@ -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 , MacDelimiter , 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 ;
@@ -432,22 +432,18 @@ impl<'a> Parser<'a> {
432432 let prev_span = self . prev_span ;
433433 self . complain_if_pub_macro ( & visibility. node , prev_span) ;
434434
435- let mac_lo = self . token . span ;
436-
437435 // Item macro
438436 let path = self . parse_path ( PathStyle :: Mod ) ?;
439437 self . expect ( & token:: Not ) ?;
440- let ( delim , tts ) = self . expect_delimited_token_tree ( ) ?;
441- if delim != MacDelimiter :: Brace && !self . eat ( & token:: Semi ) {
438+ let args = self . parse_mac_args ( ) ?;
439+ if args . need_semicolon ( ) && !self . eat ( & token:: Semi ) {
442440 self . report_invalid_macro_expansion_item ( ) ;
443441 }
444442
445443 let hi = self . prev_span ;
446444 let mac = Mac {
447445 path,
448- tts,
449- delim,
450- span : mac_lo. to ( hi) ,
446+ args,
451447 prior_type_ascription : self . last_type_ascription ,
452448 } ;
453449 let item =
@@ -500,7 +496,6 @@ impl<'a> Parser<'a> {
500496 if self . token . is_path_start ( ) &&
501497 !( self . is_async_fn ( ) && self . token . span . rust_2015 ( ) ) {
502498 let prev_span = self . prev_span ;
503- let lo = self . token . span ;
504499 let path = self . parse_path ( PathStyle :: Mod ) ?;
505500
506501 if path. segments . len ( ) == 1 {
@@ -518,16 +513,14 @@ impl<'a> Parser<'a> {
518513 * at_end = true ;
519514
520515 // eat a matched-delimiter token tree:
521- let ( delim , tts ) = self . expect_delimited_token_tree ( ) ?;
522- if delim != MacDelimiter :: Brace {
516+ let args = self . parse_mac_args ( ) ?;
517+ if args . need_semicolon ( ) {
523518 self . expect_semi ( ) ?;
524519 }
525520
526521 Ok ( Some ( Mac {
527522 path,
528- tts,
529- delim,
530- span : lo. to ( self . prev_span ) ,
523+ args,
531524 prior_type_ascription : self . last_type_ascription ,
532525 } ) )
533526 } else {
@@ -1624,33 +1617,31 @@ impl<'a> Parser<'a> {
16241617 vis : & Visibility ,
16251618 lo : Span
16261619 ) -> PResult < ' a , Option < P < Item > > > {
1627- let token_lo = self . token . span ;
16281620 let ( ident, def) = if self . eat_keyword ( kw:: Macro ) {
16291621 let ident = self . parse_ident ( ) ?;
1630- let tokens = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
1631- match self . parse_token_tree ( ) {
1632- TokenTree :: Delimited ( _, _, tts) => tts,
1633- _ => unreachable ! ( ) ,
1634- }
1622+ let body = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
1623+ self . parse_mac_args ( ) ?
16351624 } else if self . check ( & token:: OpenDelim ( token:: Paren ) ) {
1636- let args = self . parse_token_tree ( ) ;
1625+ let params = self . parse_token_tree ( ) ;
1626+ let pspan = params. span ( ) ;
16371627 let body = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
16381628 self . parse_token_tree ( )
16391629 } else {
1640- self . unexpected ( ) ?;
1641- unreachable ! ( )
1630+ return self . unexpected ( ) ;
16421631 } ;
1643- TokenStream :: new ( vec ! [
1644- args. into( ) ,
1645- 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( ) ,
16461636 body. into( ) ,
1647- ] )
1637+ ] ) ;
1638+ let dspan = DelimSpan :: from_pair ( pspan. shrink_to_lo ( ) , bspan. shrink_to_hi ( ) ) ;
1639+ P ( MacArgs :: Delimited ( dspan, MacDelimiter :: Brace , tokens) )
16481640 } else {
1649- self . unexpected ( ) ?;
1650- unreachable ! ( )
1641+ return self . unexpected ( ) ;
16511642 } ;
16521643
1653- ( ident, ast:: MacroDef { tokens : tokens . into ( ) , legacy : false } )
1644+ ( ident, ast:: MacroDef { body , legacy : false } )
16541645 } else if self . check_keyword ( sym:: macro_rules) &&
16551646 self . look_ahead ( 1 , |t| * t == token:: Not ) &&
16561647 self . look_ahead ( 2 , |t| t. is_ident ( ) ) {
@@ -1660,12 +1651,12 @@ impl<'a> Parser<'a> {
16601651 self . bump ( ) ;
16611652
16621653 let ident = self . parse_ident ( ) ?;
1663- let ( delim , tokens ) = self . expect_delimited_token_tree ( ) ?;
1664- if delim != MacDelimiter :: Brace && !self . eat ( & token:: Semi ) {
1654+ let body = self . parse_mac_args ( ) ?;
1655+ if body . need_semicolon ( ) && !self . eat ( & token:: Semi ) {
16651656 self . report_invalid_macro_expansion_item ( ) ;
16661657 }
16671658
1668- ( ident, ast:: MacroDef { tokens , legacy : true } )
1659+ ( ident, ast:: MacroDef { body , legacy : true } )
16691660 } else {
16701661 return Ok ( None ) ;
16711662 } ;
0 commit comments