@@ -78,6 +78,13 @@ impl<'a> State<'a> {
7878 ( self . attrs ) ( id)
7979 }
8080
81+ fn precedence ( & self , expr : & hir:: Expr < ' _ > ) -> ExprPrecedence {
82+ let for_each_attr = |id : HirId , callback : & mut dyn FnMut ( & hir:: Attribute ) | {
83+ self . attrs ( id) . iter ( ) . for_each ( callback) ;
84+ } ;
85+ expr. precedence ( & for_each_attr)
86+ }
87+
8188 fn print_inner_attributes ( & mut self , attrs : & [ hir:: Attribute ] ) -> bool {
8289 self . print_either_attributes ( attrs, ast:: AttrStyle :: Inner , false , true )
8390 }
@@ -1155,7 +1162,7 @@ impl<'a> State<'a> {
11551162 }
11561163 self . space ( ) ;
11571164 self . word_space ( "=" ) ;
1158- let npals = || parser:: needs_par_as_let_scrutinee ( init . precedence ( ) ) ;
1165+ let npals = || parser:: needs_par_as_let_scrutinee ( self . precedence ( init ) ) ;
11591166 self . print_expr_cond_paren ( init, Self :: cond_needs_par ( init) || npals ( ) )
11601167 }
11611168
@@ -1262,7 +1269,7 @@ impl<'a> State<'a> {
12621269 fn print_expr_call ( & mut self , func : & hir:: Expr < ' _ > , args : & [ hir:: Expr < ' _ > ] ) {
12631270 let needs_paren = match func. kind {
12641271 hir:: ExprKind :: Field ( ..) => true ,
1265- _ => func . precedence ( ) < ExprPrecedence :: Unambiguous ,
1272+ _ => self . precedence ( func ) < ExprPrecedence :: Unambiguous ,
12661273 } ;
12671274
12681275 self . print_expr_cond_paren ( func, needs_paren) ;
@@ -1276,7 +1283,10 @@ impl<'a> State<'a> {
12761283 args : & [ hir:: Expr < ' _ > ] ,
12771284 ) {
12781285 let base_args = args;
1279- self . print_expr_cond_paren ( receiver, receiver. precedence ( ) < ExprPrecedence :: Unambiguous ) ;
1286+ self . print_expr_cond_paren (
1287+ receiver,
1288+ self . precedence ( receiver) < ExprPrecedence :: Unambiguous ,
1289+ ) ;
12801290 self . word ( "." ) ;
12811291 self . print_ident ( segment. ident ) ;
12821292
@@ -1291,8 +1301,8 @@ impl<'a> State<'a> {
12911301 fn print_expr_binary ( & mut self , op : hir:: BinOp , lhs : & hir:: Expr < ' _ > , rhs : & hir:: Expr < ' _ > ) {
12921302 let assoc_op = AssocOp :: from_ast_binop ( op. node ) ;
12931303 let binop_prec = assoc_op. precedence ( ) ;
1294- let left_prec = lhs . precedence ( ) ;
1295- let right_prec = rhs . precedence ( ) ;
1304+ let left_prec = self . precedence ( lhs ) ;
1305+ let right_prec = self . precedence ( rhs ) ;
12961306
12971307 let ( mut left_needs_paren, right_needs_paren) = match assoc_op. fixity ( ) {
12981308 Fixity :: Left => ( left_prec < binop_prec, right_prec <= binop_prec) ,
@@ -1321,7 +1331,7 @@ impl<'a> State<'a> {
13211331
13221332 fn print_expr_unary ( & mut self , op : hir:: UnOp , expr : & hir:: Expr < ' _ > ) {
13231333 self . word ( op. as_str ( ) ) ;
1324- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Prefix ) ;
1334+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Prefix ) ;
13251335 }
13261336
13271337 fn print_expr_addr_of (
@@ -1338,7 +1348,7 @@ impl<'a> State<'a> {
13381348 self . print_mutability ( mutability, true ) ;
13391349 }
13401350 }
1341- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Prefix ) ;
1351+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Prefix ) ;
13421352 }
13431353
13441354 fn print_literal ( & mut self , lit : & hir:: Lit ) {
@@ -1476,7 +1486,7 @@ impl<'a> State<'a> {
14761486 self . print_literal ( lit) ;
14771487 }
14781488 hir:: ExprKind :: Cast ( expr, ty) => {
1479- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Cast ) ;
1489+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Cast ) ;
14801490 self . space ( ) ;
14811491 self . word_space ( "as" ) ;
14821492 self . print_type ( ty) ;
@@ -1577,25 +1587,31 @@ impl<'a> State<'a> {
15771587 self . print_block ( blk) ;
15781588 }
15791589 hir:: ExprKind :: Assign ( lhs, rhs, _) => {
1580- self . print_expr_cond_paren ( lhs, lhs . precedence ( ) <= ExprPrecedence :: Assign ) ;
1590+ self . print_expr_cond_paren ( lhs, self . precedence ( lhs ) <= ExprPrecedence :: Assign ) ;
15811591 self . space ( ) ;
15821592 self . word_space ( "=" ) ;
1583- self . print_expr_cond_paren ( rhs, rhs . precedence ( ) < ExprPrecedence :: Assign ) ;
1593+ self . print_expr_cond_paren ( rhs, self . precedence ( rhs ) < ExprPrecedence :: Assign ) ;
15841594 }
15851595 hir:: ExprKind :: AssignOp ( op, lhs, rhs) => {
1586- self . print_expr_cond_paren ( lhs, lhs . precedence ( ) <= ExprPrecedence :: Assign ) ;
1596+ self . print_expr_cond_paren ( lhs, self . precedence ( lhs ) <= ExprPrecedence :: Assign ) ;
15871597 self . space ( ) ;
15881598 self . word ( op. node . as_str ( ) ) ;
15891599 self . word_space ( "=" ) ;
1590- self . print_expr_cond_paren ( rhs, rhs . precedence ( ) < ExprPrecedence :: Assign ) ;
1600+ self . print_expr_cond_paren ( rhs, self . precedence ( rhs ) < ExprPrecedence :: Assign ) ;
15911601 }
15921602 hir:: ExprKind :: Field ( expr, ident) => {
1593- self . print_expr_cond_paren ( expr, expr. precedence ( ) < ExprPrecedence :: Unambiguous ) ;
1603+ self . print_expr_cond_paren (
1604+ expr,
1605+ self . precedence ( expr) < ExprPrecedence :: Unambiguous ,
1606+ ) ;
15941607 self . word ( "." ) ;
15951608 self . print_ident ( ident) ;
15961609 }
15971610 hir:: ExprKind :: Index ( expr, index, _) => {
1598- self . print_expr_cond_paren ( expr, expr. precedence ( ) < ExprPrecedence :: Unambiguous ) ;
1611+ self . print_expr_cond_paren (
1612+ expr,
1613+ self . precedence ( expr) < ExprPrecedence :: Unambiguous ,
1614+ ) ;
15991615 self . word ( "[" ) ;
16001616 self . print_expr ( index) ;
16011617 self . word ( "]" ) ;
@@ -1609,7 +1625,7 @@ impl<'a> State<'a> {
16091625 }
16101626 if let Some ( expr) = opt_expr {
16111627 self . space ( ) ;
1612- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Jump ) ;
1628+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Jump ) ;
16131629 }
16141630 }
16151631 hir:: ExprKind :: Continue ( destination) => {
@@ -1623,13 +1639,13 @@ impl<'a> State<'a> {
16231639 self . word ( "return" ) ;
16241640 if let Some ( expr) = result {
16251641 self . word ( " " ) ;
1626- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Jump ) ;
1642+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Jump ) ;
16271643 }
16281644 }
16291645 hir:: ExprKind :: Become ( result) => {
16301646 self . word ( "become" ) ;
16311647 self . word ( " " ) ;
1632- self . print_expr_cond_paren ( result, result . precedence ( ) < ExprPrecedence :: Jump ) ;
1648+ self . print_expr_cond_paren ( result, self . precedence ( result ) < ExprPrecedence :: Jump ) ;
16331649 }
16341650 hir:: ExprKind :: InlineAsm ( asm) => {
16351651 self . word ( "asm!" ) ;
@@ -1667,7 +1683,7 @@ impl<'a> State<'a> {
16671683 }
16681684 hir:: ExprKind :: Yield ( expr, _) => {
16691685 self . word_space ( "yield" ) ;
1670- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Jump ) ;
1686+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Jump ) ;
16711687 }
16721688 hir:: ExprKind :: Err ( _) => {
16731689 self . popen ( ) ;
0 commit comments