@@ -80,6 +80,13 @@ impl<'a> State<'a> {
8080 ( self . attrs ) ( id)
8181 }
8282
83+ fn precedence ( & self , expr : & hir:: Expr < ' _ > ) -> ExprPrecedence {
84+ let for_each_attr = |id : HirId , callback : & mut dyn FnMut ( & hir:: Attribute ) | {
85+ self . attrs ( id) . iter ( ) . for_each ( callback) ;
86+ } ;
87+ expr. precedence ( & for_each_attr)
88+ }
89+
8390 fn print_attrs_as_inner ( & mut self , attrs : & [ hir:: Attribute ] ) {
8491 self . print_either_attributes ( attrs, ast:: AttrStyle :: Inner )
8592 }
@@ -1164,7 +1171,7 @@ impl<'a> State<'a> {
11641171 }
11651172 self . space ( ) ;
11661173 self . word_space ( "=" ) ;
1167- let npals = || parser:: needs_par_as_let_scrutinee ( init . precedence ( ) ) ;
1174+ let npals = || parser:: needs_par_as_let_scrutinee ( self . precedence ( init ) ) ;
11681175 self . print_expr_cond_paren ( init, Self :: cond_needs_par ( init) || npals ( ) )
11691176 }
11701177
@@ -1265,7 +1272,7 @@ impl<'a> State<'a> {
12651272 fn print_expr_call ( & mut self , func : & hir:: Expr < ' _ > , args : & [ hir:: Expr < ' _ > ] ) {
12661273 let needs_paren = match func. kind {
12671274 hir:: ExprKind :: Field ( ..) => true ,
1268- _ => func . precedence ( ) < ExprPrecedence :: Unambiguous ,
1275+ _ => self . precedence ( func ) < ExprPrecedence :: Unambiguous ,
12691276 } ;
12701277
12711278 self . print_expr_cond_paren ( func, needs_paren) ;
@@ -1279,7 +1286,10 @@ impl<'a> State<'a> {
12791286 args : & [ hir:: Expr < ' _ > ] ,
12801287 ) {
12811288 let base_args = args;
1282- self . print_expr_cond_paren ( receiver, receiver. precedence ( ) < ExprPrecedence :: Unambiguous ) ;
1289+ self . print_expr_cond_paren (
1290+ receiver,
1291+ self . precedence ( receiver) < ExprPrecedence :: Unambiguous ,
1292+ ) ;
12831293 self . word ( "." ) ;
12841294 self . print_ident ( segment. ident ) ;
12851295
@@ -1293,8 +1303,8 @@ impl<'a> State<'a> {
12931303
12941304 fn print_expr_binary ( & mut self , op : hir:: BinOpKind , lhs : & hir:: Expr < ' _ > , rhs : & hir:: Expr < ' _ > ) {
12951305 let binop_prec = op. precedence ( ) ;
1296- let left_prec = lhs . precedence ( ) ;
1297- let right_prec = rhs . precedence ( ) ;
1306+ let left_prec = self . precedence ( lhs ) ;
1307+ let right_prec = self . precedence ( rhs ) ;
12981308
12991309 let ( mut left_needs_paren, right_needs_paren) = match op. fixity ( ) {
13001310 Fixity :: Left => ( left_prec < binop_prec, right_prec <= binop_prec) ,
@@ -1323,7 +1333,7 @@ impl<'a> State<'a> {
13231333
13241334 fn print_expr_unary ( & mut self , op : hir:: UnOp , expr : & hir:: Expr < ' _ > ) {
13251335 self . word ( op. as_str ( ) ) ;
1326- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Prefix ) ;
1336+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Prefix ) ;
13271337 }
13281338
13291339 fn print_expr_addr_of (
@@ -1340,7 +1350,7 @@ impl<'a> State<'a> {
13401350 self . print_mutability ( mutability, true ) ;
13411351 }
13421352 }
1343- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Prefix ) ;
1353+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Prefix ) ;
13441354 }
13451355
13461356 fn print_literal ( & mut self , lit : & hir:: Lit ) {
@@ -1483,7 +1493,7 @@ impl<'a> State<'a> {
14831493 self . print_literal ( lit) ;
14841494 }
14851495 hir:: ExprKind :: Cast ( expr, ty) => {
1486- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Cast ) ;
1496+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Cast ) ;
14871497 self . space ( ) ;
14881498 self . word_space ( "as" ) ;
14891499 self . print_type ( ty) ;
@@ -1580,24 +1590,30 @@ impl<'a> State<'a> {
15801590 self . print_block ( blk, cb, ib) ;
15811591 }
15821592 hir:: ExprKind :: Assign ( lhs, rhs, _) => {
1583- self . print_expr_cond_paren ( lhs, lhs . precedence ( ) <= ExprPrecedence :: Assign ) ;
1593+ self . print_expr_cond_paren ( lhs, self . precedence ( lhs ) <= ExprPrecedence :: Assign ) ;
15841594 self . space ( ) ;
15851595 self . word_space ( "=" ) ;
1586- self . print_expr_cond_paren ( rhs, rhs . precedence ( ) < ExprPrecedence :: Assign ) ;
1596+ self . print_expr_cond_paren ( rhs, self . precedence ( rhs ) < ExprPrecedence :: Assign ) ;
15871597 }
15881598 hir:: ExprKind :: AssignOp ( op, lhs, rhs) => {
1589- self . print_expr_cond_paren ( lhs, lhs . precedence ( ) <= ExprPrecedence :: Assign ) ;
1599+ self . print_expr_cond_paren ( lhs, self . precedence ( lhs ) <= ExprPrecedence :: Assign ) ;
15901600 self . space ( ) ;
15911601 self . word_space ( op. node . as_str ( ) ) ;
1592- self . print_expr_cond_paren ( rhs, rhs . precedence ( ) < ExprPrecedence :: Assign ) ;
1602+ self . print_expr_cond_paren ( rhs, self . precedence ( rhs ) < ExprPrecedence :: Assign ) ;
15931603 }
15941604 hir:: ExprKind :: Field ( expr, ident) => {
1595- self . print_expr_cond_paren ( expr, expr. precedence ( ) < ExprPrecedence :: Unambiguous ) ;
1605+ self . print_expr_cond_paren (
1606+ expr,
1607+ self . precedence ( expr) < ExprPrecedence :: Unambiguous ,
1608+ ) ;
15961609 self . word ( "." ) ;
15971610 self . print_ident ( ident) ;
15981611 }
15991612 hir:: ExprKind :: Index ( expr, index, _) => {
1600- self . print_expr_cond_paren ( expr, expr. precedence ( ) < ExprPrecedence :: Unambiguous ) ;
1613+ self . print_expr_cond_paren (
1614+ expr,
1615+ self . precedence ( expr) < ExprPrecedence :: Unambiguous ,
1616+ ) ;
16011617 self . word ( "[" ) ;
16021618 self . print_expr ( index) ;
16031619 self . word ( "]" ) ;
@@ -1611,7 +1627,7 @@ impl<'a> State<'a> {
16111627 }
16121628 if let Some ( expr) = opt_expr {
16131629 self . space ( ) ;
1614- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Jump ) ;
1630+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Jump ) ;
16151631 }
16161632 }
16171633 hir:: ExprKind :: Continue ( destination) => {
@@ -1625,13 +1641,13 @@ impl<'a> State<'a> {
16251641 self . word ( "return" ) ;
16261642 if let Some ( expr) = result {
16271643 self . word ( " " ) ;
1628- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Jump ) ;
1644+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Jump ) ;
16291645 }
16301646 }
16311647 hir:: ExprKind :: Become ( result) => {
16321648 self . word ( "become" ) ;
16331649 self . word ( " " ) ;
1634- self . print_expr_cond_paren ( result, result . precedence ( ) < ExprPrecedence :: Jump ) ;
1650+ self . print_expr_cond_paren ( result, self . precedence ( result ) < ExprPrecedence :: Jump ) ;
16351651 }
16361652 hir:: ExprKind :: InlineAsm ( asm) => {
16371653 self . word ( "asm!" ) ;
@@ -1669,7 +1685,7 @@ impl<'a> State<'a> {
16691685 }
16701686 hir:: ExprKind :: Yield ( expr, _) => {
16711687 self . word_space ( "yield" ) ;
1672- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Jump ) ;
1688+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Jump ) ;
16731689 }
16741690 hir:: ExprKind :: Err ( _) => {
16751691 self . popen ( ) ;
0 commit comments