@@ -442,35 +442,37 @@ impl<'a> Parser<'a> {
442
442
}
443
443
444
444
/// 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 ) ?;
447
447
let lo = self . token . span ;
448
448
// Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr()
449
449
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) ,
464
457
_ => 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) )
467
460
}
468
461
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 > ) > {
471
463
self . bump ( ) ;
472
464
let expr = self . parse_prefix_expr ( None ) ;
473
465
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 ) > {
474
476
self . struct_span_err ( lo, "`~` cannot be used as a unary operator" )
475
477
. span_suggestion_short (
476
478
lo,
@@ -479,31 +481,13 @@ impl<'a> Parser<'a> {
479
481
Applicability :: MachineApplicable ,
480
482
)
481
483
. emit ( ) ;
482
- Ok ( ( lo. to ( span) , self . mk_unary ( UnOp :: Not , expr) ) )
483
- }
484
484
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 )
499
486
}
500
487
501
488
/// Parse `box expr`.
502
489
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) ?;
507
491
self . sess . gated_spans . gate ( sym:: box_syntax, span) ;
508
492
Ok ( ( span, ExprKind :: Box ( expr) ) )
509
493
}
@@ -521,26 +505,24 @@ impl<'a> Parser<'a> {
521
505
522
506
/// Recover on `not expr` in favor of `!expr`.
523
507
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 ( ) ) ;
526
510
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 ) ) ,
529
513
)
530
514
. span_suggestion_short (
531
515
// Span the `not` plus trailing whitespace to avoid
532
516
// 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 ) ) ,
534
518
"use `!` to perform logical negation" ,
535
519
"!" . to_owned ( ) ,
536
520
Applicability :: MachineApplicable ,
537
521
)
538
522
. 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 )
544
526
}
545
527
546
528
/// 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> {
738
720
739
721
fn error_unexpected_after_dot ( & self ) {
740
722
// 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 ) ;
742
724
self . struct_span_err ( self . token . span , & format ! ( "unexpected token: `{}`" , actual) ) . emit ( ) ;
743
725
}
744
726
@@ -1142,7 +1124,7 @@ impl<'a> Parser<'a> {
1142
1124
1143
1125
pub ( super ) fn parse_lit ( & mut self ) -> PResult < ' a , Lit > {
1144
1126
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 ) ) ;
1146
1128
self . span_fatal ( self . token . span , & msg)
1147
1129
} )
1148
1130
}
0 commit comments