@@ -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 , MacDelimiter , 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 ;
@@ -432,22 +432,18 @@ impl<'a> Parser<'a> {
432
432
let prev_span = self . prev_span ;
433
433
self . complain_if_pub_macro ( & visibility. node , prev_span) ;
434
434
435
- let mac_lo = self . token . span ;
436
-
437
435
// Item macro
438
436
let path = self . parse_path ( PathStyle :: Mod ) ?;
439
437
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 ) {
442
440
self . report_invalid_macro_expansion_item ( ) ;
443
441
}
444
442
445
443
let hi = self . prev_span ;
446
444
let mac = Mac {
447
445
path,
448
- tts,
449
- delim,
450
- span : mac_lo. to ( hi) ,
446
+ args,
451
447
prior_type_ascription : self . last_type_ascription ,
452
448
} ;
453
449
let item =
@@ -500,7 +496,6 @@ impl<'a> Parser<'a> {
500
496
if self . token . is_path_start ( ) &&
501
497
!( self . is_async_fn ( ) && self . token . span . rust_2015 ( ) ) {
502
498
let prev_span = self . prev_span ;
503
- let lo = self . token . span ;
504
499
let path = self . parse_path ( PathStyle :: Mod ) ?;
505
500
506
501
if path. segments . len ( ) == 1 {
@@ -518,16 +513,14 @@ impl<'a> Parser<'a> {
518
513
* at_end = true ;
519
514
520
515
// 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 ( ) {
523
518
self . expect_semi ( ) ?;
524
519
}
525
520
526
521
Ok ( Some ( Mac {
527
522
path,
528
- tts,
529
- delim,
530
- span : lo. to ( self . prev_span ) ,
523
+ args,
531
524
prior_type_ascription : self . last_type_ascription ,
532
525
} ) )
533
526
} else {
@@ -1624,33 +1617,31 @@ impl<'a> Parser<'a> {
1624
1617
vis : & Visibility ,
1625
1618
lo : Span
1626
1619
) -> PResult < ' a , Option < P < Item > > > {
1627
- let token_lo = self . token . span ;
1628
1620
let ( ident, def) = if self . eat_keyword ( kw:: Macro ) {
1629
1621
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 ( ) ?
1635
1624
} 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 ( ) ;
1637
1627
let body = if self . check ( & token:: OpenDelim ( token:: Brace ) ) {
1638
1628
self . parse_token_tree ( )
1639
1629
} else {
1640
- self . unexpected ( ) ?;
1641
- unreachable ! ( )
1630
+ return self . unexpected ( ) ;
1642
1631
} ;
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( ) ,
1646
1636
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) )
1648
1640
} else {
1649
- self . unexpected ( ) ?;
1650
- unreachable ! ( )
1641
+ return self . unexpected ( ) ;
1651
1642
} ;
1652
1643
1653
- ( ident, ast:: MacroDef { tokens : tokens . into ( ) , legacy : false } )
1644
+ ( ident, ast:: MacroDef { body , legacy : false } )
1654
1645
} else if self . check_keyword ( sym:: macro_rules) &&
1655
1646
self . look_ahead ( 1 , |t| * t == token:: Not ) &&
1656
1647
self . look_ahead ( 2 , |t| t. is_ident ( ) ) {
@@ -1660,12 +1651,12 @@ impl<'a> Parser<'a> {
1660
1651
self . bump ( ) ;
1661
1652
1662
1653
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 ) {
1665
1656
self . report_invalid_macro_expansion_item ( ) ;
1666
1657
}
1667
1658
1668
- ( ident, ast:: MacroDef { tokens , legacy : true } )
1659
+ ( ident, ast:: MacroDef { body , legacy : true } )
1669
1660
} else {
1670
1661
return Ok ( None ) ;
1671
1662
} ;
0 commit comments