@@ -97,9 +97,10 @@ impl<'a> Parser<'a> {
97
97
fn parse_expr_catch_underscore ( & mut self ) -> PResult < ' a , P < Expr > > {
98
98
match self . parse_expr ( ) {
99
99
Ok ( expr) => Ok ( expr) ,
100
- Err ( mut err) => match self . normalized_token . kind {
101
- token:: Ident ( name, false )
102
- if name == kw:: Underscore && self . look_ahead ( 1 , |t| t == & token:: Comma ) =>
100
+ Err ( mut err) => match self . token . ident ( ) {
101
+ Some ( ( ident, false ) )
102
+ if ident. name == kw:: Underscore
103
+ && self . look_ahead ( 1 , |t| t == & token:: Comma ) =>
103
104
{
104
105
// Special-case handling of `foo(_, _, _)`
105
106
err. emit ( ) ;
@@ -331,21 +332,19 @@ impl<'a> Parser<'a> {
331
332
///
332
333
/// Also performs recovery for `and` / `or` which are mistaken for `&&` and `||` respectively.
333
334
fn check_assoc_op ( & self ) -> Option < Spanned < AssocOp > > {
334
- Some ( Spanned {
335
- node : match ( AssocOp :: from_token ( & self . token ) , & self . normalized_token . kind ) {
336
- ( Some ( op) , _) => op,
337
- ( None , token:: Ident ( sym:: and, false ) ) => {
338
- self . error_bad_logical_op ( "and" , "&&" , "conjunction" ) ;
339
- AssocOp :: LAnd
340
- }
341
- ( None , token:: Ident ( sym:: or, false ) ) => {
342
- self . error_bad_logical_op ( "or" , "||" , "disjunction" ) ;
343
- AssocOp :: LOr
344
- }
345
- _ => return None ,
346
- } ,
347
- span : self . normalized_token . span ,
348
- } )
335
+ let ( op, span) = match ( AssocOp :: from_token ( & self . token ) , self . token . ident ( ) ) {
336
+ ( Some ( op) , _) => ( op, self . token . span ) ,
337
+ ( None , Some ( ( ident, false ) ) ) if ident. name == sym:: and => {
338
+ self . error_bad_logical_op ( "and" , "&&" , "conjunction" ) ;
339
+ ( AssocOp :: LAnd , ident. span )
340
+ }
341
+ ( None , Some ( ( ident, false ) ) ) if ident. name == sym:: or => {
342
+ self . error_bad_logical_op ( "or" , "||" , "disjunction" ) ;
343
+ ( AssocOp :: LOr , ident. span )
344
+ }
345
+ _ => return None ,
346
+ } ;
347
+ Some ( source_map:: respan ( span, op) )
349
348
}
350
349
351
350
/// Error on `and` and `or` suggesting `&&` and `||` respectively.
@@ -1907,20 +1906,23 @@ impl<'a> Parser<'a> {
1907
1906
1908
1907
/// Use in case of error after field-looking code: `S { foo: () with a }`.
1909
1908
fn find_struct_error_after_field_looking_code ( & self ) -> Option < Field > {
1910
- if let token:: Ident ( name, _) = self . normalized_token . kind {
1911
- if !self . token . is_reserved_ident ( ) && self . look_ahead ( 1 , |t| * t == token:: Colon ) {
1912
- return Some ( ast:: Field {
1913
- ident : Ident :: new ( name, self . normalized_token . span ) ,
1909
+ match self . token . ident ( ) {
1910
+ Some ( ( ident, is_raw) )
1911
+ if ( is_raw || !ident. is_reserved ( ) )
1912
+ && self . look_ahead ( 1 , |t| * t == token:: Colon ) =>
1913
+ {
1914
+ Some ( ast:: Field {
1915
+ ident,
1914
1916
span : self . token . span ,
1915
1917
expr : self . mk_expr_err ( self . token . span ) ,
1916
1918
is_shorthand : false ,
1917
1919
attrs : AttrVec :: new ( ) ,
1918
1920
id : DUMMY_NODE_ID ,
1919
1921
is_placeholder : false ,
1920
- } ) ;
1922
+ } )
1921
1923
}
1924
+ _ => None ,
1922
1925
}
1923
- None
1924
1926
}
1925
1927
1926
1928
fn recover_struct_comma_after_dotdot ( & mut self , span : Span ) {
0 commit comments