@@ -97,9 +97,10 @@ impl<'a> Parser<'a> {
9797 fn parse_expr_catch_underscore ( & mut self ) -> PResult < ' a , P < Expr > > {
9898 match self . parse_expr ( ) {
9999 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 ) =>
103104 {
104105 // Special-case handling of `foo(_, _, _)`
105106 err. emit ( ) ;
@@ -331,21 +332,19 @@ impl<'a> Parser<'a> {
331332 ///
332333 /// Also performs recovery for `and` / `or` which are mistaken for `&&` and `||` respectively.
333334 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) )
349348 }
350349
351350 /// Error on `and` and `or` suggesting `&&` and `||` respectively.
@@ -1907,20 +1906,23 @@ impl<'a> Parser<'a> {
19071906
19081907 /// Use in case of error after field-looking code: `S { foo: () with a }`.
19091908 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,
19141916 span : self . token . span ,
19151917 expr : self . mk_expr_err ( self . token . span ) ,
19161918 is_shorthand : false ,
19171919 attrs : AttrVec :: new ( ) ,
19181920 id : DUMMY_NODE_ID ,
19191921 is_placeholder : false ,
1920- } ) ;
1922+ } )
19211923 }
1924+ _ => None ,
19221925 }
1923- None
19241926 }
19251927
19261928 fn recover_struct_comma_after_dotdot ( & mut self , span : Span ) {
0 commit comments