@@ -78,6 +78,13 @@ impl<'a> State<'a> {
78
78
( self . attrs ) ( id)
79
79
}
80
80
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
+
81
88
fn print_inner_attributes ( & mut self , attrs : & [ hir:: Attribute ] ) -> bool {
82
89
self . print_either_attributes ( attrs, ast:: AttrStyle :: Inner , false , true )
83
90
}
@@ -1155,7 +1162,7 @@ impl<'a> State<'a> {
1155
1162
}
1156
1163
self . space ( ) ;
1157
1164
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 ) ) ;
1159
1166
self . print_expr_cond_paren ( init, Self :: cond_needs_par ( init) || npals ( ) )
1160
1167
}
1161
1168
@@ -1262,7 +1269,7 @@ impl<'a> State<'a> {
1262
1269
fn print_expr_call ( & mut self , func : & hir:: Expr < ' _ > , args : & [ hir:: Expr < ' _ > ] ) {
1263
1270
let needs_paren = match func. kind {
1264
1271
hir:: ExprKind :: Field ( ..) => true ,
1265
- _ => func . precedence ( ) < ExprPrecedence :: Unambiguous ,
1272
+ _ => self . precedence ( func ) < ExprPrecedence :: Unambiguous ,
1266
1273
} ;
1267
1274
1268
1275
self . print_expr_cond_paren ( func, needs_paren) ;
@@ -1276,7 +1283,10 @@ impl<'a> State<'a> {
1276
1283
args : & [ hir:: Expr < ' _ > ] ,
1277
1284
) {
1278
1285
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
+ ) ;
1280
1290
self . word ( "." ) ;
1281
1291
self . print_ident ( segment. ident ) ;
1282
1292
@@ -1291,8 +1301,8 @@ impl<'a> State<'a> {
1291
1301
fn print_expr_binary ( & mut self , op : hir:: BinOp , lhs : & hir:: Expr < ' _ > , rhs : & hir:: Expr < ' _ > ) {
1292
1302
let assoc_op = AssocOp :: from_ast_binop ( op. node ) ;
1293
1303
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 ) ;
1296
1306
1297
1307
let ( mut left_needs_paren, right_needs_paren) = match assoc_op. fixity ( ) {
1298
1308
Fixity :: Left => ( left_prec < binop_prec, right_prec <= binop_prec) ,
@@ -1321,7 +1331,7 @@ impl<'a> State<'a> {
1321
1331
1322
1332
fn print_expr_unary ( & mut self , op : hir:: UnOp , expr : & hir:: Expr < ' _ > ) {
1323
1333
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 ) ;
1325
1335
}
1326
1336
1327
1337
fn print_expr_addr_of (
@@ -1338,7 +1348,7 @@ impl<'a> State<'a> {
1338
1348
self . print_mutability ( mutability, true ) ;
1339
1349
}
1340
1350
}
1341
- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Prefix ) ;
1351
+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Prefix ) ;
1342
1352
}
1343
1353
1344
1354
fn print_literal ( & mut self , lit : & hir:: Lit ) {
@@ -1476,7 +1486,7 @@ impl<'a> State<'a> {
1476
1486
self . print_literal ( lit) ;
1477
1487
}
1478
1488
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 ) ;
1480
1490
self . space ( ) ;
1481
1491
self . word_space ( "as" ) ;
1482
1492
self . print_type ( ty) ;
@@ -1577,25 +1587,31 @@ impl<'a> State<'a> {
1577
1587
self . print_block ( blk) ;
1578
1588
}
1579
1589
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 ) ;
1581
1591
self . space ( ) ;
1582
1592
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 ) ;
1584
1594
}
1585
1595
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 ) ;
1587
1597
self . space ( ) ;
1588
1598
self . word ( op. node . as_str ( ) ) ;
1589
1599
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 ) ;
1591
1601
}
1592
1602
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
+ ) ;
1594
1607
self . word ( "." ) ;
1595
1608
self . print_ident ( ident) ;
1596
1609
}
1597
1610
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
+ ) ;
1599
1615
self . word ( "[" ) ;
1600
1616
self . print_expr ( index) ;
1601
1617
self . word ( "]" ) ;
@@ -1609,7 +1625,7 @@ impl<'a> State<'a> {
1609
1625
}
1610
1626
if let Some ( expr) = opt_expr {
1611
1627
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 ) ;
1613
1629
}
1614
1630
}
1615
1631
hir:: ExprKind :: Continue ( destination) => {
@@ -1623,13 +1639,13 @@ impl<'a> State<'a> {
1623
1639
self . word ( "return" ) ;
1624
1640
if let Some ( expr) = result {
1625
1641
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 ) ;
1627
1643
}
1628
1644
}
1629
1645
hir:: ExprKind :: Become ( result) => {
1630
1646
self . word ( "become" ) ;
1631
1647
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 ) ;
1633
1649
}
1634
1650
hir:: ExprKind :: InlineAsm ( asm) => {
1635
1651
self . word ( "asm!" ) ;
@@ -1667,7 +1683,7 @@ impl<'a> State<'a> {
1667
1683
}
1668
1684
hir:: ExprKind :: Yield ( expr, _) => {
1669
1685
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 ) ;
1671
1687
}
1672
1688
hir:: ExprKind :: Err ( _) => {
1673
1689
self . popen ( ) ;
0 commit comments