@@ -7,8 +7,8 @@ use rustc_ast::util::classify;
77use rustc_ast:: util:: literal:: escape_byte_str_symbol;
88use rustc_ast:: util:: parser:: { self , ExprPrecedence , Fixity } ;
99use rustc_ast:: {
10- self as ast, BlockCheckMode , FormatAlignment , FormatArgPosition , FormatArgsPiece , FormatCount ,
11- FormatDebugHex , FormatSign , FormatTrait , YieldKind , token,
10+ self as ast, BinOpKind , BlockCheckMode , FormatAlignment , FormatArgPosition , FormatArgsPiece ,
11+ FormatCount , FormatDebugHex , FormatSign , FormatTrait , YieldKind , token,
1212} ;
1313
1414use crate :: pp:: Breaks :: Inconsistent ;
@@ -214,13 +214,6 @@ impl<'a> State<'a> {
214214 }
215215
216216 fn print_expr_call ( & mut self , func : & ast:: Expr , args : & [ P < ast:: Expr > ] , fixup : FixupContext ) {
217- let needs_paren = match func. kind {
218- // In order to call a named field, needs parens: `(self.fun)()`
219- // But not for an unnamed field: `self.0()`
220- ast:: ExprKind :: Field ( _, name) => !name. is_numeric ( ) ,
221- _ => func. precedence ( ) < ExprPrecedence :: Unambiguous ,
222- } ;
223-
224217 // Independent of parenthesization related to precedence, we must
225218 // parenthesize `func` if this is a statement context in which without
226219 // parentheses, a statement boundary would occur inside `func` or
@@ -237,8 +230,16 @@ impl<'a> State<'a> {
237230 // because the latter is valid syntax but with the incorrect meaning.
238231 // It's a match-expression followed by tuple-expression, not a function
239232 // call.
240- self . print_expr_cond_paren ( func, needs_paren, fixup. leftmost_subexpression ( ) ) ;
233+ let func_fixup = fixup. leftmost_subexpression_with_operator ( true ) ;
234+
235+ let needs_paren = match func. kind {
236+ // In order to call a named field, needs parens: `(self.fun)()`
237+ // But not for an unnamed field: `self.0()`
238+ ast:: ExprKind :: Field ( _, name) => !name. is_numeric ( ) ,
239+ _ => func_fixup. precedence ( func) < ExprPrecedence :: Unambiguous ,
240+ } ;
241241
242+ self . print_expr_cond_paren ( func, needs_paren, func_fixup) ;
242243 self . print_call_post ( args)
243244 }
244245
@@ -281,9 +282,24 @@ impl<'a> State<'a> {
281282 rhs : & ast:: Expr ,
282283 fixup : FixupContext ,
283284 ) {
285+ let operator_can_begin_expr = match op {
286+ | BinOpKind :: Sub // -x
287+ | BinOpKind :: Mul // *x
288+ | BinOpKind :: And // &&x
289+ | BinOpKind :: Or // || x
290+ | BinOpKind :: BitAnd // &x
291+ | BinOpKind :: BitOr // |x| x
292+ | BinOpKind :: Shl // <<T as Trait>::Type as Trait>::CONST
293+ | BinOpKind :: Lt // <T as Trait>::CONST
294+ => true ,
295+ _ => false ,
296+ } ;
297+
298+ let left_fixup = fixup. leftmost_subexpression_with_operator ( operator_can_begin_expr) ;
299+
284300 let binop_prec = op. precedence ( ) ;
285- let left_prec = lhs . precedence ( ) ;
286- let right_prec = rhs . precedence ( ) ;
301+ let left_prec = left_fixup . precedence ( lhs ) ;
302+ let right_prec = fixup . precedence ( rhs ) ;
287303
288304 let ( mut left_needs_paren, right_needs_paren) = match op. fixity ( ) {
289305 Fixity :: Left => ( left_prec < binop_prec, right_prec <= binop_prec) ,
@@ -312,18 +328,18 @@ impl<'a> State<'a> {
312328 _ => { }
313329 }
314330
315- self . print_expr_cond_paren ( lhs, left_needs_paren, fixup . leftmost_subexpression ( ) ) ;
331+ self . print_expr_cond_paren ( lhs, left_needs_paren, left_fixup ) ;
316332 self . space ( ) ;
317333 self . word_space ( op. as_str ( ) ) ;
318- self . print_expr_cond_paren ( rhs, right_needs_paren, fixup. subsequent_subexpression ( ) ) ;
334+ self . print_expr_cond_paren ( rhs, right_needs_paren, fixup. rightmost_subexpression ( ) ) ;
319335 }
320336
321337 fn print_expr_unary ( & mut self , op : ast:: UnOp , expr : & ast:: Expr , fixup : FixupContext ) {
322338 self . word ( op. as_str ( ) ) ;
323339 self . print_expr_cond_paren (
324340 expr,
325- expr . precedence ( ) < ExprPrecedence :: Prefix ,
326- fixup. subsequent_subexpression ( ) ,
341+ fixup . precedence ( expr ) < ExprPrecedence :: Prefix ,
342+ fixup. rightmost_subexpression ( ) ,
327343 ) ;
328344 }
329345
@@ -344,8 +360,8 @@ impl<'a> State<'a> {
344360 }
345361 self . print_expr_cond_paren (
346362 expr,
347- expr . precedence ( ) < ExprPrecedence :: Prefix ,
348- fixup. subsequent_subexpression ( ) ,
363+ fixup . precedence ( expr ) < ExprPrecedence :: Prefix ,
364+ fixup. rightmost_subexpression ( ) ,
349365 ) ;
350366 }
351367
@@ -590,8 +606,8 @@ impl<'a> State<'a> {
590606 self . word_space ( "=" ) ;
591607 self . print_expr_cond_paren (
592608 rhs,
593- rhs . precedence ( ) < ExprPrecedence :: Assign ,
594- fixup. subsequent_subexpression ( ) ,
609+ fixup . precedence ( rhs ) < ExprPrecedence :: Assign ,
610+ fixup. rightmost_subexpression ( ) ,
595611 ) ;
596612 }
597613 ast:: ExprKind :: AssignOp ( op, lhs, rhs) => {
@@ -604,8 +620,8 @@ impl<'a> State<'a> {
604620 self . word_space ( op. node . as_str ( ) ) ;
605621 self . print_expr_cond_paren (
606622 rhs,
607- rhs . precedence ( ) < ExprPrecedence :: Assign ,
608- fixup. subsequent_subexpression ( ) ,
623+ fixup . precedence ( rhs ) < ExprPrecedence :: Assign ,
624+ fixup. rightmost_subexpression ( ) ,
609625 ) ;
610626 }
611627 ast:: ExprKind :: Field ( expr, ident) => {
@@ -618,10 +634,11 @@ impl<'a> State<'a> {
618634 self . print_ident ( * ident) ;
619635 }
620636 ast:: ExprKind :: Index ( expr, index, _) => {
637+ let expr_fixup = fixup. leftmost_subexpression_with_operator ( true ) ;
621638 self . print_expr_cond_paren (
622639 expr,
623- expr . precedence ( ) < ExprPrecedence :: Unambiguous ,
624- fixup . leftmost_subexpression ( ) ,
640+ expr_fixup . precedence ( expr ) < ExprPrecedence :: Unambiguous ,
641+ expr_fixup ,
625642 ) ;
626643 self . word ( "[" ) ;
627644 self . print_expr ( index, FixupContext :: default ( ) ) ;
@@ -634,10 +651,11 @@ impl<'a> State<'a> {
634651 // a "normal" binop gets parenthesized. (`LOr` is the lowest-precedence binop.)
635652 let fake_prec = ExprPrecedence :: LOr ;
636653 if let Some ( e) = start {
654+ let start_fixup = fixup. leftmost_subexpression_with_operator ( true ) ;
637655 self . print_expr_cond_paren (
638656 e,
639- e . precedence ( ) < fake_prec,
640- fixup . leftmost_subexpression ( ) ,
657+ start_fixup . precedence ( e ) < fake_prec,
658+ start_fixup ,
641659 ) ;
642660 }
643661 match limits {
@@ -647,8 +665,8 @@ impl<'a> State<'a> {
647665 if let Some ( e) = end {
648666 self . print_expr_cond_paren (
649667 e,
650- e . precedence ( ) < fake_prec,
651- fixup. subsequent_subexpression ( ) ,
668+ fixup . precedence ( e ) < fake_prec,
669+ fixup. rightmost_subexpression ( ) ,
652670 ) ;
653671 }
654672 }
@@ -665,11 +683,10 @@ impl<'a> State<'a> {
665683 self . space ( ) ;
666684 self . print_expr_cond_paren (
667685 expr,
668- // Parenthesize if required by precedence, or in the
669- // case of `break 'inner: loop { break 'inner 1 } + 1`
670- expr. precedence ( ) < ExprPrecedence :: Jump
671- || ( opt_label. is_none ( ) && classify:: leading_labeled_expr ( expr) ) ,
672- fixup. subsequent_subexpression ( ) ,
686+ // Parenthesize `break 'inner: loop { break 'inner 1 } + 1`
687+ // ^---------------------------------^
688+ opt_label. is_none ( ) && classify:: leading_labeled_expr ( expr) ,
689+ fixup. rightmost_subexpression ( ) ,
673690 ) ;
674691 }
675692 }
@@ -684,11 +701,7 @@ impl<'a> State<'a> {
684701 self . word ( "return" ) ;
685702 if let Some ( expr) = result {
686703 self . word ( " " ) ;
687- self . print_expr_cond_paren (
688- expr,
689- expr. precedence ( ) < ExprPrecedence :: Jump ,
690- fixup. subsequent_subexpression ( ) ,
691- ) ;
704+ self . print_expr ( expr, fixup. rightmost_subexpression ( ) ) ;
692705 }
693706 }
694707 ast:: ExprKind :: Yeet ( result) => {
@@ -697,21 +710,13 @@ impl<'a> State<'a> {
697710 self . word ( "yeet" ) ;
698711 if let Some ( expr) = result {
699712 self . word ( " " ) ;
700- self . print_expr_cond_paren (
701- expr,
702- expr. precedence ( ) < ExprPrecedence :: Jump ,
703- fixup. subsequent_subexpression ( ) ,
704- ) ;
713+ self . print_expr ( expr, fixup. rightmost_subexpression ( ) ) ;
705714 }
706715 }
707716 ast:: ExprKind :: Become ( result) => {
708717 self . word ( "become" ) ;
709718 self . word ( " " ) ;
710- self . print_expr_cond_paren (
711- result,
712- result. precedence ( ) < ExprPrecedence :: Jump ,
713- fixup. subsequent_subexpression ( ) ,
714- ) ;
719+ self . print_expr ( result, fixup. rightmost_subexpression ( ) ) ;
715720 }
716721 ast:: ExprKind :: InlineAsm ( a) => {
717722 // FIXME: Print `builtin # asm` once macro `asm` uses `builtin_syntax`.
@@ -761,11 +766,7 @@ impl<'a> State<'a> {
761766
762767 if let Some ( expr) = e {
763768 self . space ( ) ;
764- self . print_expr_cond_paren (
765- expr,
766- expr. precedence ( ) < ExprPrecedence :: Jump ,
767- fixup. subsequent_subexpression ( ) ,
768- ) ;
769+ self . print_expr ( expr, fixup. rightmost_subexpression ( ) ) ;
769770 }
770771 }
771772 ast:: ExprKind :: Yield ( YieldKind :: Postfix ( e) ) => {
0 commit comments