@@ -364,8 +364,8 @@ pub fn parse_failure_msg(tok: Token) -> String {
364
364
365
365
/// Perform a token equality check, ignoring syntax context (that is, an unhygienic comparison)
366
366
fn token_name_eq ( t1 : & Token , t2 : & Token ) -> bool {
367
- if let ( Some ( id1) , Some ( id2) ) = ( t1. ident ( ) , t2. ident ( ) ) {
368
- id1. name == id2. name
367
+ if let ( Some ( ( id1, is_raw1 ) ) , Some ( ( id2, is_raw2 ) ) ) = ( t1. ident ( ) , t2. ident ( ) ) {
368
+ id1. name == id2. name && is_raw1 == is_raw2
369
369
} else if let ( & token:: Lifetime ( id1) , & token:: Lifetime ( id2) ) = ( t1, t2) {
370
370
id1. name == id2. name
371
371
} else {
@@ -711,9 +711,10 @@ pub fn parse(
711
711
712
712
/// The token is an identifier, but not `_`.
713
713
/// We prohibit passing `_` to macros expecting `ident` for now.
714
- fn get_macro_ident ( token : & Token ) -> Option < Ident > {
714
+ fn get_macro_ident ( token : & Token ) -> Option < ( Ident , bool ) > {
715
715
match * token {
716
- token:: Ident ( ident) if ident. name != keywords:: Underscore . name ( ) => Some ( ident) ,
716
+ token:: Ident ( ident, is_raw) if ident. name != keywords:: Underscore . name ( ) =>
717
+ Some ( ( ident, is_raw) ) ,
717
718
_ => None ,
718
719
}
719
720
}
@@ -737,7 +738,7 @@ fn may_begin_with(name: &str, token: &Token) -> bool {
737
738
"ident" => get_macro_ident ( token) . is_some ( ) ,
738
739
"vis" => match * token {
739
740
// The follow-set of :vis + "priv" keyword + interpolated
740
- Token :: Comma | Token :: Ident ( _ ) | Token :: Interpolated ( _) => true ,
741
+ Token :: Comma | Token :: Ident ( .. ) | Token :: Interpolated ( _) => true ,
741
742
_ => token. can_begin_type ( ) ,
742
743
} ,
743
744
"block" => match * token {
@@ -746,7 +747,7 @@ fn may_begin_with(name: &str, token: &Token) -> bool {
746
747
token:: NtItem ( _)
747
748
| token:: NtPat ( _)
748
749
| token:: NtTy ( _)
749
- | token:: NtIdent ( _ )
750
+ | token:: NtIdent ( .. )
750
751
| token:: NtMeta ( _)
751
752
| token:: NtPath ( _)
752
753
| token:: NtVis ( _) => false , // none of these may start with '{'.
@@ -755,15 +756,15 @@ fn may_begin_with(name: &str, token: &Token) -> bool {
755
756
_ => false ,
756
757
} ,
757
758
"path" | "meta" => match * token {
758
- Token :: ModSep | Token :: Ident ( _ ) => true ,
759
+ Token :: ModSep | Token :: Ident ( .. ) => true ,
759
760
Token :: Interpolated ( ref nt) => match nt. 0 {
760
761
token:: NtPath ( _) | token:: NtMeta ( _) => true ,
761
762
_ => may_be_ident ( & nt. 0 ) ,
762
763
} ,
763
764
_ => false ,
764
765
} ,
765
766
"pat" => match * token {
766
- Token :: Ident ( _ ) | // box, ref, mut, and other identifiers (can stricten)
767
+ Token :: Ident ( .. ) | // box, ref, mut, and other identifiers (can stricten)
767
768
Token :: OpenDelim ( token:: Paren ) | // tuple pattern
768
769
Token :: OpenDelim ( token:: Bracket ) | // slice pattern
769
770
Token :: BinOp ( token:: And ) | // reference
@@ -823,9 +824,9 @@ fn parse_nt<'a>(p: &mut Parser<'a>, sp: Span, name: &str) -> Nonterminal {
823
824
"expr" => token:: NtExpr ( panictry ! ( p. parse_expr( ) ) ) ,
824
825
"ty" => token:: NtTy ( panictry ! ( p. parse_ty( ) ) ) ,
825
826
// this could be handled like a token, since it is one
826
- "ident" => if let Some ( ident) = get_macro_ident ( & p. token ) {
827
+ "ident" => if let Some ( ( ident, is_raw ) ) = get_macro_ident ( & p. token ) {
827
828
p. bump ( ) ;
828
- token:: NtIdent ( respan ( p. prev_span , ident) )
829
+ token:: NtIdent ( respan ( p. prev_span , ident) , is_raw )
829
830
} else {
830
831
let token_str = pprust:: token_to_string ( & p. token ) ;
831
832
p. fatal ( & format ! ( "expected ident, found {}" , & token_str) ) . emit ( ) ;
0 commit comments