@@ -80,6 +80,13 @@ impl<'a> State<'a> {
80
80
( self . attrs ) ( id)
81
81
}
82
82
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
+
83
90
fn print_attrs_as_inner ( & mut self , attrs : & [ hir:: Attribute ] ) {
84
91
self . print_either_attributes ( attrs, ast:: AttrStyle :: Inner )
85
92
}
@@ -1164,7 +1171,7 @@ impl<'a> State<'a> {
1164
1171
}
1165
1172
self . space ( ) ;
1166
1173
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 ) ) ;
1168
1175
self . print_expr_cond_paren ( init, Self :: cond_needs_par ( init) || npals ( ) )
1169
1176
}
1170
1177
@@ -1265,7 +1272,7 @@ impl<'a> State<'a> {
1265
1272
fn print_expr_call ( & mut self , func : & hir:: Expr < ' _ > , args : & [ hir:: Expr < ' _ > ] ) {
1266
1273
let needs_paren = match func. kind {
1267
1274
hir:: ExprKind :: Field ( ..) => true ,
1268
- _ => func . precedence ( ) < ExprPrecedence :: Unambiguous ,
1275
+ _ => self . precedence ( func ) < ExprPrecedence :: Unambiguous ,
1269
1276
} ;
1270
1277
1271
1278
self . print_expr_cond_paren ( func, needs_paren) ;
@@ -1279,7 +1286,10 @@ impl<'a> State<'a> {
1279
1286
args : & [ hir:: Expr < ' _ > ] ,
1280
1287
) {
1281
1288
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
+ ) ;
1283
1293
self . word ( "." ) ;
1284
1294
self . print_ident ( segment. ident ) ;
1285
1295
@@ -1293,8 +1303,8 @@ impl<'a> State<'a> {
1293
1303
1294
1304
fn print_expr_binary ( & mut self , op : hir:: BinOpKind , lhs : & hir:: Expr < ' _ > , rhs : & hir:: Expr < ' _ > ) {
1295
1305
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 ) ;
1298
1308
1299
1309
let ( mut left_needs_paren, right_needs_paren) = match op. fixity ( ) {
1300
1310
Fixity :: Left => ( left_prec < binop_prec, right_prec <= binop_prec) ,
@@ -1323,7 +1333,7 @@ impl<'a> State<'a> {
1323
1333
1324
1334
fn print_expr_unary ( & mut self , op : hir:: UnOp , expr : & hir:: Expr < ' _ > ) {
1325
1335
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 ) ;
1327
1337
}
1328
1338
1329
1339
fn print_expr_addr_of (
@@ -1340,7 +1350,7 @@ impl<'a> State<'a> {
1340
1350
self . print_mutability ( mutability, true ) ;
1341
1351
}
1342
1352
}
1343
- self . print_expr_cond_paren ( expr, expr . precedence ( ) < ExprPrecedence :: Prefix ) ;
1353
+ self . print_expr_cond_paren ( expr, self . precedence ( expr ) < ExprPrecedence :: Prefix ) ;
1344
1354
}
1345
1355
1346
1356
fn print_literal ( & mut self , lit : & hir:: Lit ) {
@@ -1483,7 +1493,7 @@ impl<'a> State<'a> {
1483
1493
self . print_literal ( lit) ;
1484
1494
}
1485
1495
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 ) ;
1487
1497
self . space ( ) ;
1488
1498
self . word_space ( "as" ) ;
1489
1499
self . print_type ( ty) ;
@@ -1580,24 +1590,30 @@ impl<'a> State<'a> {
1580
1590
self . print_block ( blk, cb, ib) ;
1581
1591
}
1582
1592
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 ) ;
1584
1594
self . space ( ) ;
1585
1595
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 ) ;
1587
1597
}
1588
1598
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 ) ;
1590
1600
self . space ( ) ;
1591
1601
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 ) ;
1593
1603
}
1594
1604
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
+ ) ;
1596
1609
self . word ( "." ) ;
1597
1610
self . print_ident ( ident) ;
1598
1611
}
1599
1612
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
+ ) ;
1601
1617
self . word ( "[" ) ;
1602
1618
self . print_expr ( index) ;
1603
1619
self . word ( "]" ) ;
@@ -1611,7 +1627,7 @@ impl<'a> State<'a> {
1611
1627
}
1612
1628
if let Some ( expr) = opt_expr {
1613
1629
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 ) ;
1615
1631
}
1616
1632
}
1617
1633
hir:: ExprKind :: Continue ( destination) => {
@@ -1625,13 +1641,13 @@ impl<'a> State<'a> {
1625
1641
self . word ( "return" ) ;
1626
1642
if let Some ( expr) = result {
1627
1643
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 ) ;
1629
1645
}
1630
1646
}
1631
1647
hir:: ExprKind :: Become ( result) => {
1632
1648
self . word ( "become" ) ;
1633
1649
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 ) ;
1635
1651
}
1636
1652
hir:: ExprKind :: InlineAsm ( asm) => {
1637
1653
self . word ( "asm!" ) ;
@@ -1669,7 +1685,7 @@ impl<'a> State<'a> {
1669
1685
}
1670
1686
hir:: ExprKind :: Yield ( expr, _) => {
1671
1687
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 ) ;
1673
1689
}
1674
1690
hir:: ExprKind :: Err ( _) => {
1675
1691
self . popen ( ) ;
0 commit comments