@@ -442,35 +442,37 @@ impl<'a> Parser<'a> {
442442 }
443443
444444 /// Parses a prefix-unary-operator expr.
445- fn parse_prefix_expr ( & mut self , already_parsed_attrs : Option < AttrVec > ) -> PResult < ' a , P < Expr > > {
446- let attrs = self . parse_or_use_outer_attributes ( already_parsed_attrs ) ?;
445+ fn parse_prefix_expr ( & mut self , attrs : Option < AttrVec > ) -> PResult < ' a , P < Expr > > {
446+ let attrs = self . parse_or_use_outer_attributes ( attrs ) ?;
447447 let lo = self . token . span ;
448448 // Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr()
449449 let ( hi, ex) = match self . token . kind {
450- token:: Not => {
451- self . bump ( ) ;
452- let e = self . parse_prefix_expr ( None ) ;
453- let ( span, e) = self . interpolated_or_expr_span ( e) ?;
454- ( lo. to ( span) , self . mk_unary ( UnOp :: Not , e) )
455- }
456- token:: Tilde => self . recover_tilde_expr ( lo) ?,
457- token:: BinOp ( token:: Minus ) => self . parse_neg_expr ( lo) ?,
458- token:: BinOp ( token:: Star ) => self . parse_deref_expr ( lo) ?,
459- token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_borrow_expr ( lo) ?,
460- token:: Ident ( ..) if self . token . is_keyword ( kw:: Box ) => self . parse_box_expr ( lo) ?,
461- token:: Ident ( ..) if self . is_mistaken_not_ident_negation ( ) => {
462- self . recover_not_expr ( lo) ?
463- }
450+ token:: Not => self . parse_unary_expr ( lo, UnOp :: Not ) , // `!expr`
451+ token:: Tilde => self . recover_tilde_expr ( lo) , // `~expr`
452+ token:: BinOp ( token:: Minus ) => self . parse_unary_expr ( lo, UnOp :: Neg ) , // `-expr`
453+ token:: BinOp ( token:: Star ) => self . parse_unary_expr ( lo, UnOp :: Deref ) , // `*expr`
454+ token:: BinOp ( token:: And ) | token:: AndAnd => self . parse_borrow_expr ( lo) ,
455+ token:: Ident ( ..) if self . token . is_keyword ( kw:: Box ) => self . parse_box_expr ( lo) ,
456+ token:: Ident ( ..) if self . is_mistaken_not_ident_negation ( ) => self . recover_not_expr ( lo) ,
464457 _ => return self . parse_dot_or_call_expr ( Some ( attrs) ) ,
465- } ;
466- return Ok ( self . mk_expr ( lo. to ( hi) , ex, attrs) ) ;
458+ } ? ;
459+ Ok ( self . mk_expr ( lo. to ( hi) , ex, attrs) )
467460 }
468461
469- // Recover on `!` suggesting for bitwise negation instead.
470- fn recover_tilde_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
462+ fn parse_prefix_expr_common ( & mut self , lo : Span ) -> PResult < ' a , ( Span , P < Expr > ) > {
471463 self . bump ( ) ;
472464 let expr = self . parse_prefix_expr ( None ) ;
473465 let ( span, expr) = self . interpolated_or_expr_span ( expr) ?;
466+ Ok ( ( lo. to ( span) , expr) )
467+ }
468+
469+ fn parse_unary_expr ( & mut self , lo : Span , op : UnOp ) -> PResult < ' a , ( Span , ExprKind ) > {
470+ let ( span, expr) = self . parse_prefix_expr_common ( lo) ?;
471+ Ok ( ( span, self . mk_unary ( op, expr) ) )
472+ }
473+
474+ // Recover on `!` suggesting for bitwise negation instead.
475+ fn recover_tilde_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
474476 self . struct_span_err ( lo, "`~` cannot be used as a unary operator" )
475477 . span_suggestion_short (
476478 lo,
@@ -479,31 +481,13 @@ impl<'a> Parser<'a> {
479481 Applicability :: MachineApplicable ,
480482 )
481483 . emit ( ) ;
482- Ok ( ( lo. to ( span) , self . mk_unary ( UnOp :: Not , expr) ) )
483- }
484484
485- /// Parse `-expr`.
486- fn parse_neg_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
487- self . bump ( ) ; // `-`
488- let expr = self . parse_prefix_expr ( None ) ;
489- let ( span, expr) = self . interpolated_or_expr_span ( expr) ?;
490- Ok ( ( lo. to ( span) , self . mk_unary ( UnOp :: Neg , expr) ) )
491- }
492-
493- /// Parse `*expr`.
494- fn parse_deref_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
495- self . bump ( ) ; // `*`
496- let expr = self . parse_prefix_expr ( None ) ;
497- let ( span, expr) = self . interpolated_or_expr_span ( expr) ?;
498- Ok ( ( lo. to ( span) , self . mk_unary ( UnOp :: Deref , expr) ) )
485+ self . parse_unary_expr ( lo, UnOp :: Not )
499486 }
500487
501488 /// Parse `box expr`.
502489 fn parse_box_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
503- self . bump ( ) ; // `box`
504- let expr = self . parse_prefix_expr ( None ) ;
505- let ( span, expr) = self . interpolated_or_expr_span ( expr) ?;
506- let span = lo. to ( span) ;
490+ let ( span, expr) = self . parse_prefix_expr_common ( lo) ?;
507491 self . sess . gated_spans . gate ( sym:: box_syntax, span) ;
508492 Ok ( ( span, ExprKind :: Box ( expr) ) )
509493 }
@@ -521,26 +505,24 @@ impl<'a> Parser<'a> {
521505
522506 /// Recover on `not expr` in favor of `!expr`.
523507 fn recover_not_expr ( & mut self , lo : Span ) -> PResult < ' a , ( Span , ExprKind ) > {
524- self . bump ( ) ;
525- // Emit the error ...
508+ // Emit the error...
509+ let not_token = self . look_ahead ( 1 , |t| t . clone ( ) ) ;
526510 self . struct_span_err (
527- self . token . span ,
528- & format ! ( "unexpected {} after identifier" , self . this_token_descr ( ) ) ,
511+ not_token . span ,
512+ & format ! ( "unexpected {} after identifier" , super :: token_descr ( & not_token ) ) ,
529513 )
530514 . span_suggestion_short (
531515 // Span the `not` plus trailing whitespace to avoid
532516 // trailing whitespace after the `!` in our suggestion
533- self . sess . source_map ( ) . span_until_non_whitespace ( lo. to ( self . token . span ) ) ,
517+ self . sess . source_map ( ) . span_until_non_whitespace ( lo. to ( not_token . span ) ) ,
534518 "use `!` to perform logical negation" ,
535519 "!" . to_owned ( ) ,
536520 Applicability :: MachineApplicable ,
537521 )
538522 . emit ( ) ;
539- // —and recover! (just as if we were in the block
540- // for the `token::Not` arm)
541- let expr = self . parse_prefix_expr ( None ) ;
542- let ( span, e) = self . interpolated_or_expr_span ( expr) ?;
543- Ok ( ( lo. to ( span) , self . mk_unary ( UnOp :: Not , e) ) )
523+
524+ // ...and recover!
525+ self . parse_unary_expr ( lo, UnOp :: Not )
544526 }
545527
546528 /// Returns the span of expr, if it was not interpolated or the span of the interpolated token.
@@ -738,7 +720,7 @@ impl<'a> Parser<'a> {
738720
739721 fn error_unexpected_after_dot ( & self ) {
740722 // FIXME Could factor this out into non_fatal_unexpected or something.
741- let actual = self . this_token_to_string ( ) ;
723+ let actual = pprust :: token_to_string ( & self . token ) ;
742724 self . struct_span_err ( self . token . span , & format ! ( "unexpected token: `{}`" , actual) ) . emit ( ) ;
743725 }
744726
@@ -1142,7 +1124,7 @@ impl<'a> Parser<'a> {
11421124
11431125 pub ( super ) fn parse_lit ( & mut self ) -> PResult < ' a , Lit > {
11441126 self . parse_opt_lit ( ) . ok_or_else ( || {
1145- let msg = format ! ( "unexpected token: {}" , self . this_token_descr ( ) ) ;
1127+ let msg = format ! ( "unexpected token: {}" , super :: token_descr ( & self . token ) ) ;
11461128 self . span_fatal ( self . token . span , & msg)
11471129 } )
11481130 }
0 commit comments