@@ -58,10 +58,6 @@ impl<'a> State<'a> {
58
58
self . pclose ( )
59
59
}
60
60
61
- fn print_expr_maybe_paren ( & mut self , expr : & ast:: Expr , prec : i8 , fixup : FixupContext ) {
62
- self . print_expr_cond_paren ( expr, expr. precedence ( ) < prec, fixup) ;
63
- }
64
-
65
61
/// Prints an expr using syntax that's acceptable in a condition position, such as the `cond` in
66
62
/// `if cond { ... }`.
67
63
fn print_expr_as_cond ( & mut self , expr : & ast:: Expr ) {
@@ -237,7 +233,7 @@ impl<'a> State<'a> {
237
233
// because the latter is valid syntax but with the incorrect meaning.
238
234
// It's a match-expression followed by tuple-expression, not a function
239
235
// call.
240
- self . print_expr_maybe_paren ( func, prec, fixup. leftmost_subexpression ( ) ) ;
236
+ self . print_expr_cond_paren ( func, func . precedence ( ) < prec, fixup. leftmost_subexpression ( ) ) ;
241
237
242
238
self . print_call_post ( args)
243
239
}
@@ -258,7 +254,11 @@ impl<'a> State<'a> {
258
254
// boundaries, `$receiver.method()` can be parsed back as a statement
259
255
// containing an expression if and only if `$receiver` can be parsed as
260
256
// a statement containing an expression.
261
- self . print_expr_maybe_paren ( receiver, parser:: PREC_UNAMBIGUOUS , fixup) ;
257
+ self . print_expr_cond_paren (
258
+ receiver,
259
+ receiver. precedence ( ) < parser:: PREC_UNAMBIGUOUS ,
260
+ fixup,
261
+ ) ;
262
262
263
263
self . word ( "." ) ;
264
264
self . print_ident ( segment. ident ) ;
@@ -306,17 +306,29 @@ impl<'a> State<'a> {
306
306
_ => left_prec,
307
307
} ;
308
308
309
- self . print_expr_maybe_paren ( lhs, left_prec, fixup. leftmost_subexpression ( ) ) ;
309
+ self . print_expr_cond_paren (
310
+ lhs,
311
+ lhs. precedence ( ) < left_prec,
312
+ fixup. leftmost_subexpression ( ) ,
313
+ ) ;
310
314
311
315
self . space ( ) ;
312
316
self . word_space ( op. node . as_str ( ) ) ;
313
317
314
- self . print_expr_maybe_paren ( rhs, right_prec, fixup. subsequent_subexpression ( ) ) ;
318
+ self . print_expr_cond_paren (
319
+ rhs,
320
+ rhs. precedence ( ) < right_prec,
321
+ fixup. subsequent_subexpression ( ) ,
322
+ ) ;
315
323
}
316
324
317
325
fn print_expr_unary ( & mut self , op : ast:: UnOp , expr : & ast:: Expr , fixup : FixupContext ) {
318
326
self . word ( op. as_str ( ) ) ;
319
- self . print_expr_maybe_paren ( expr, parser:: PREC_PREFIX , fixup. subsequent_subexpression ( ) ) ;
327
+ self . print_expr_cond_paren (
328
+ expr,
329
+ expr. precedence ( ) < parser:: PREC_PREFIX ,
330
+ fixup. subsequent_subexpression ( ) ,
331
+ ) ;
320
332
}
321
333
322
334
fn print_expr_addr_of (
@@ -334,7 +346,11 @@ impl<'a> State<'a> {
334
346
self . print_mutability ( mutability, true ) ;
335
347
}
336
348
}
337
- self . print_expr_maybe_paren ( expr, parser:: PREC_PREFIX , fixup. subsequent_subexpression ( ) ) ;
349
+ self . print_expr_cond_paren (
350
+ expr,
351
+ expr. precedence ( ) < parser:: PREC_PREFIX ,
352
+ fixup. subsequent_subexpression ( ) ,
353
+ ) ;
338
354
}
339
355
340
356
pub ( super ) fn print_expr ( & mut self , expr : & ast:: Expr , fixup : FixupContext ) {
@@ -417,7 +433,11 @@ impl<'a> State<'a> {
417
433
}
418
434
ast:: ExprKind :: Cast ( expr, ty) => {
419
435
let prec = AssocOp :: As . precedence ( ) as i8 ;
420
- self . print_expr_maybe_paren ( expr, prec, fixup. leftmost_subexpression ( ) ) ;
436
+ self . print_expr_cond_paren (
437
+ expr,
438
+ expr. precedence ( ) < prec,
439
+ fixup. leftmost_subexpression ( ) ,
440
+ ) ;
421
441
self . space ( ) ;
422
442
self . word_space ( "as" ) ;
423
443
self . print_type ( ty) ;
@@ -490,7 +510,11 @@ impl<'a> State<'a> {
490
510
self . space ( ) ;
491
511
}
492
512
MatchKind :: Postfix => {
493
- self . print_expr_maybe_paren ( expr, parser:: PREC_UNAMBIGUOUS , fixup) ;
513
+ self . print_expr_cond_paren (
514
+ expr,
515
+ expr. precedence ( ) < parser:: PREC_UNAMBIGUOUS ,
516
+ fixup,
517
+ ) ;
494
518
self . word_nbsp ( ".match" ) ;
495
519
}
496
520
}
@@ -550,33 +574,57 @@ impl<'a> State<'a> {
550
574
self . print_block_with_attrs ( blk, attrs) ;
551
575
}
552
576
ast:: ExprKind :: Await ( expr, _) => {
553
- self . print_expr_maybe_paren ( expr, parser:: PREC_UNAMBIGUOUS , fixup) ;
577
+ self . print_expr_cond_paren (
578
+ expr,
579
+ expr. precedence ( ) < parser:: PREC_UNAMBIGUOUS ,
580
+ fixup,
581
+ ) ;
554
582
self . word ( ".await" ) ;
555
583
}
556
584
ast:: ExprKind :: Assign ( lhs, rhs, _) => {
557
585
let prec = AssocOp :: Assign . precedence ( ) as i8 ;
558
- self . print_expr_maybe_paren ( lhs, prec + 1 , fixup. leftmost_subexpression ( ) ) ;
586
+ self . print_expr_cond_paren (
587
+ lhs,
588
+ lhs. precedence ( ) <= prec,
589
+ fixup. leftmost_subexpression ( ) ,
590
+ ) ;
559
591
self . space ( ) ;
560
592
self . word_space ( "=" ) ;
561
- self . print_expr_maybe_paren ( rhs, prec, fixup. subsequent_subexpression ( ) ) ;
593
+ self . print_expr_cond_paren (
594
+ rhs,
595
+ rhs. precedence ( ) < prec,
596
+ fixup. subsequent_subexpression ( ) ,
597
+ ) ;
562
598
}
563
599
ast:: ExprKind :: AssignOp ( op, lhs, rhs) => {
564
600
let prec = AssocOp :: Assign . precedence ( ) as i8 ;
565
- self . print_expr_maybe_paren ( lhs, prec + 1 , fixup. leftmost_subexpression ( ) ) ;
601
+ self . print_expr_cond_paren (
602
+ lhs,
603
+ lhs. precedence ( ) <= prec,
604
+ fixup. leftmost_subexpression ( ) ,
605
+ ) ;
566
606
self . space ( ) ;
567
607
self . word ( op. node . as_str ( ) ) ;
568
608
self . word_space ( "=" ) ;
569
- self . print_expr_maybe_paren ( rhs, prec, fixup. subsequent_subexpression ( ) ) ;
609
+ self . print_expr_cond_paren (
610
+ rhs,
611
+ rhs. precedence ( ) < prec,
612
+ fixup. subsequent_subexpression ( ) ,
613
+ ) ;
570
614
}
571
615
ast:: ExprKind :: Field ( expr, ident) => {
572
- self . print_expr_maybe_paren ( expr, parser:: PREC_UNAMBIGUOUS , fixup) ;
616
+ self . print_expr_cond_paren (
617
+ expr,
618
+ expr. precedence ( ) < parser:: PREC_UNAMBIGUOUS ,
619
+ fixup,
620
+ ) ;
573
621
self . word ( "." ) ;
574
622
self . print_ident ( * ident) ;
575
623
}
576
624
ast:: ExprKind :: Index ( expr, index, _) => {
577
- self . print_expr_maybe_paren (
625
+ self . print_expr_cond_paren (
578
626
expr,
579
- parser:: PREC_UNAMBIGUOUS ,
627
+ expr . precedence ( ) < parser:: PREC_UNAMBIGUOUS ,
580
628
fixup. leftmost_subexpression ( ) ,
581
629
) ;
582
630
self . word ( "[" ) ;
@@ -590,14 +638,22 @@ impl<'a> State<'a> {
590
638
// a "normal" binop gets parenthesized. (`LOr` is the lowest-precedence binop.)
591
639
let fake_prec = AssocOp :: LOr . precedence ( ) as i8 ;
592
640
if let Some ( e) = start {
593
- self . print_expr_maybe_paren ( e, fake_prec, fixup. leftmost_subexpression ( ) ) ;
641
+ self . print_expr_cond_paren (
642
+ e,
643
+ e. precedence ( ) < fake_prec,
644
+ fixup. leftmost_subexpression ( ) ,
645
+ ) ;
594
646
}
595
647
match limits {
596
648
ast:: RangeLimits :: HalfOpen => self . word ( ".." ) ,
597
649
ast:: RangeLimits :: Closed => self . word ( "..=" ) ,
598
650
}
599
651
if let Some ( e) = end {
600
- self . print_expr_maybe_paren ( e, fake_prec, fixup. subsequent_subexpression ( ) ) ;
652
+ self . print_expr_cond_paren (
653
+ e,
654
+ e. precedence ( ) < fake_prec,
655
+ fixup. subsequent_subexpression ( ) ,
656
+ ) ;
601
657
}
602
658
}
603
659
ast:: ExprKind :: Underscore => self . word ( "_" ) ,
@@ -632,9 +688,9 @@ impl<'a> State<'a> {
632
688
self . word ( "return" ) ;
633
689
if let Some ( expr) = result {
634
690
self . word ( " " ) ;
635
- self . print_expr_maybe_paren (
691
+ self . print_expr_cond_paren (
636
692
expr,
637
- parser:: PREC_JUMP ,
693
+ expr . precedence ( ) < parser:: PREC_JUMP ,
638
694
fixup. subsequent_subexpression ( ) ,
639
695
) ;
640
696
}
@@ -645,19 +701,19 @@ impl<'a> State<'a> {
645
701
self . word ( "yeet" ) ;
646
702
if let Some ( expr) = result {
647
703
self . word ( " " ) ;
648
- self . print_expr_maybe_paren (
704
+ self . print_expr_cond_paren (
649
705
expr,
650
- parser:: PREC_JUMP ,
706
+ expr . precedence ( ) < parser:: PREC_JUMP ,
651
707
fixup. subsequent_subexpression ( ) ,
652
708
) ;
653
709
}
654
710
}
655
711
ast:: ExprKind :: Become ( result) => {
656
712
self . word ( "become" ) ;
657
713
self . word ( " " ) ;
658
- self . print_expr_maybe_paren (
714
+ self . print_expr_cond_paren (
659
715
result,
660
- parser:: PREC_JUMP ,
716
+ result . precedence ( ) < parser:: PREC_JUMP ,
661
717
fixup. subsequent_subexpression ( ) ,
662
718
) ;
663
719
}
@@ -709,15 +765,15 @@ impl<'a> State<'a> {
709
765
710
766
if let Some ( expr) = e {
711
767
self . space ( ) ;
712
- self . print_expr_maybe_paren (
768
+ self . print_expr_cond_paren (
713
769
expr,
714
- parser:: PREC_JUMP ,
770
+ expr . precedence ( ) < parser:: PREC_JUMP ,
715
771
fixup. subsequent_subexpression ( ) ,
716
772
) ;
717
773
}
718
774
}
719
775
ast:: ExprKind :: Try ( e) => {
720
- self . print_expr_maybe_paren ( e, parser:: PREC_UNAMBIGUOUS , fixup) ;
776
+ self . print_expr_cond_paren ( e, e . precedence ( ) < parser:: PREC_UNAMBIGUOUS , fixup) ;
721
777
self . word ( "?" )
722
778
}
723
779
ast:: ExprKind :: TryBlock ( blk) => {
0 commit comments