@@ -1231,23 +1231,43 @@ pub fn is_unsafe_block(block: &ast::Block) -> bool {
1231
1231
}
1232
1232
}
1233
1233
1234
- // A simple wrapper type against ast::Arm. Used inside write_list().
1234
+ /// A simple wrapper type against ast::Arm. Used inside write_list().
1235
1235
struct ArmWrapper < ' a > {
1236
1236
pub arm : & ' a ast:: Arm ,
1237
- // True if the arm is the last one in match expression. Used to decide on whether we should add
1238
- // trailing comma to the match arm when `config.trailing_comma() == Never`.
1237
+ /// True if the arm is the last one in match expression. Used to decide on whether we should add
1238
+ /// trailing comma to the match arm when `config.trailing_comma() == Never`.
1239
1239
pub is_last : bool ,
1240
+ /// Holds a byte position of `|` at the beginning of the arm pattern, if available.
1241
+ pub beginning_vert : Option < BytePos > ,
1240
1242
}
1241
1243
1242
1244
impl < ' a > ArmWrapper < ' a > {
1243
- pub fn new ( arm : & ' a ast:: Arm , is_last : bool ) -> ArmWrapper < ' a > {
1244
- ArmWrapper { arm, is_last }
1245
+ pub fn new (
1246
+ arm : & ' a ast:: Arm ,
1247
+ is_last : bool ,
1248
+ beginning_vert : Option < BytePos > ,
1249
+ ) -> ArmWrapper < ' a > {
1250
+ ArmWrapper {
1251
+ arm,
1252
+ is_last,
1253
+ beginning_vert,
1254
+ }
1255
+ }
1256
+ }
1257
+
1258
+ impl < ' a > Spanned for ArmWrapper < ' a > {
1259
+ fn span ( & self ) -> Span {
1260
+ if let Some ( lo) = self . beginning_vert {
1261
+ mk_sp ( lo, self . arm . span ( ) . hi ( ) )
1262
+ } else {
1263
+ self . arm . span ( )
1264
+ }
1245
1265
}
1246
1266
}
1247
1267
1248
1268
impl < ' a > Rewrite for ArmWrapper < ' a > {
1249
1269
fn rewrite ( & self , context : & RewriteContext , shape : Shape ) -> Option < String > {
1250
- rewrite_match_arm ( context, self . arm , shape, self . is_last )
1270
+ rewrite_match_arm ( context, self . arm , shape, self . is_last , self . beginning_vert )
1251
1271
}
1252
1272
}
1253
1273
@@ -1344,6 +1364,23 @@ fn arm_comma(config: &Config, body: &ast::Expr, is_last: bool) -> &'static str {
1344
1364
}
1345
1365
}
1346
1366
1367
+ /// Collect a byte position of the beginning `|` for each arm, if available.
1368
+ fn collect_beginning_verts (
1369
+ context : & RewriteContext ,
1370
+ arms : & [ ast:: Arm ] ,
1371
+ span : Span ,
1372
+ ) -> Vec < Option < BytePos > > {
1373
+ let mut beginning_verts = Vec :: with_capacity ( arms. len ( ) ) ;
1374
+ let mut lo = context. snippet_provider . span_after ( span, "{" ) ;
1375
+ for arm in arms {
1376
+ let hi = arm. pats [ 0 ] . span . lo ( ) ;
1377
+ let missing_span = mk_sp ( lo, hi) ;
1378
+ beginning_verts. push ( context. snippet_provider . opt_span_before ( missing_span, "|" ) ) ;
1379
+ lo = arm. span ( ) . hi ( ) ;
1380
+ }
1381
+ beginning_verts
1382
+ }
1383
+
1347
1384
fn rewrite_match_arms (
1348
1385
context : & RewriteContext ,
1349
1386
arms : & [ ast:: Arm ] ,
@@ -1359,15 +1396,17 @@ fn rewrite_match_arms(
1359
1396
let is_last_iter = repeat ( false )
1360
1397
. take ( arm_len. checked_sub ( 1 ) . unwrap_or ( 0 ) )
1361
1398
. chain ( repeat ( true ) ) ;
1399
+ let beginning_verts = collect_beginning_verts ( context, arms, span) ;
1362
1400
let items = itemize_list (
1363
1401
context. snippet_provider ,
1364
1402
arms. iter ( )
1365
1403
. zip ( is_last_iter)
1366
- . map ( |( arm, is_last) | ArmWrapper :: new ( arm, is_last) ) ,
1404
+ . zip ( beginning_verts. into_iter ( ) )
1405
+ . map ( |( ( arm, is_last) , beginning_vert) | ArmWrapper :: new ( arm, is_last, beginning_vert) ) ,
1367
1406
"}" ,
1368
1407
"|" ,
1369
- |arm| arm. arm . span ( ) . lo ( ) ,
1370
- |arm| arm. arm . span ( ) . hi ( ) ,
1408
+ |arm| arm. span ( ) . lo ( ) ,
1409
+ |arm| arm. span ( ) . hi ( ) ,
1371
1410
|arm| arm. rewrite ( context, arm_shape) ,
1372
1411
open_brace_pos,
1373
1412
span. hi ( ) ,
@@ -1394,6 +1433,7 @@ fn rewrite_match_arm(
1394
1433
arm : & ast:: Arm ,
1395
1434
shape : Shape ,
1396
1435
is_last : bool ,
1436
+ beginning_vert : Option < BytePos > ,
1397
1437
) -> Option < String > {
1398
1438
let ( missing_span, attrs_str) = if !arm. attrs . is_empty ( ) {
1399
1439
if contains_skip ( & arm. attrs ) {
@@ -1417,7 +1457,7 @@ fn rewrite_match_arm(
1417
1457
context,
1418
1458
& arm. pats ,
1419
1459
& arm. guard ,
1420
- arm . beginning_vert . is_some ( ) ,
1460
+ beginning_vert. is_some ( ) ,
1421
1461
shape,
1422
1462
) . and_then ( |pats_str| {
1423
1463
combine_strs_with_missing_comments (
0 commit comments