@@ -175,6 +175,11 @@ pub enum PatternKind<'tcx> {
175
175
slice : Option < Pattern < ' tcx > > ,
176
176
suffix : Vec < Pattern < ' tcx > > ,
177
177
} ,
178
+
179
+ /// or-pattern
180
+ Or {
181
+ pats : Vec < Pattern < ' tcx > > ,
182
+ } ,
178
183
}
179
184
180
185
#[ derive( Copy , Clone , Debug , PartialEq ) ]
@@ -186,6 +191,18 @@ pub struct PatternRange<'tcx> {
186
191
187
192
impl < ' tcx > fmt:: Display for Pattern < ' tcx > {
188
193
fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
194
+ // Printing lists is a chore.
195
+ let mut first = true ;
196
+ let mut start_or_continue = |s| {
197
+ if first {
198
+ first = false ;
199
+ ""
200
+ } else {
201
+ s
202
+ }
203
+ } ;
204
+ let mut start_or_comma = || start_or_continue ( ", " ) ;
205
+
189
206
match * self . kind {
190
207
PatternKind :: Wild => write ! ( f, "_" ) ,
191
208
PatternKind :: AscribeUserType { ref subpattern, .. } =>
@@ -224,9 +241,6 @@ impl<'tcx> fmt::Display for Pattern<'tcx> {
224
241
}
225
242
} ;
226
243
227
- let mut first = true ;
228
- let mut start_or_continue = || if first { first = false ; "" } else { ", " } ;
229
-
230
244
if let Some ( variant) = variant {
231
245
write ! ( f, "{}" , variant. ident) ?;
232
246
@@ -241,12 +255,12 @@ impl<'tcx> fmt::Display for Pattern<'tcx> {
241
255
continue ;
242
256
}
243
257
let name = variant. fields [ p. field . index ( ) ] . ident ;
244
- write ! ( f, "{}{}: {}" , start_or_continue ( ) , name, p. pattern) ?;
258
+ write ! ( f, "{}{}: {}" , start_or_comma ( ) , name, p. pattern) ?;
245
259
printed += 1 ;
246
260
}
247
261
248
262
if printed < variant. fields . len ( ) {
249
- write ! ( f, "{}.." , start_or_continue ( ) ) ?;
263
+ write ! ( f, "{}.." , start_or_comma ( ) ) ?;
250
264
}
251
265
252
266
return write ! ( f, " }}" ) ;
@@ -257,7 +271,7 @@ impl<'tcx> fmt::Display for Pattern<'tcx> {
257
271
if num_fields != 0 || variant. is_none ( ) {
258
272
write ! ( f, "(" ) ?;
259
273
for i in 0 ..num_fields {
260
- write ! ( f, "{}" , start_or_continue ( ) ) ?;
274
+ write ! ( f, "{}" , start_or_comma ( ) ) ?;
261
275
262
276
// Common case: the field is where we expect it.
263
277
if let Some ( p) = subpatterns. get ( i) {
@@ -305,25 +319,29 @@ impl<'tcx> fmt::Display for Pattern<'tcx> {
305
319
}
306
320
PatternKind :: Slice { ref prefix, ref slice, ref suffix } |
307
321
PatternKind :: Array { ref prefix, ref slice, ref suffix } => {
308
- let mut first = true ;
309
- let mut start_or_continue = || if first { first = false ; "" } else { ", " } ;
310
322
write ! ( f, "[" ) ?;
311
323
for p in prefix {
312
- write ! ( f, "{}{}" , start_or_continue ( ) , p) ?;
324
+ write ! ( f, "{}{}" , start_or_comma ( ) , p) ?;
313
325
}
314
326
if let Some ( ref slice) = * slice {
315
- write ! ( f, "{}" , start_or_continue ( ) ) ?;
327
+ write ! ( f, "{}" , start_or_comma ( ) ) ?;
316
328
match * slice. kind {
317
329
PatternKind :: Wild => { }
318
330
_ => write ! ( f, "{}" , slice) ?
319
331
}
320
332
write ! ( f, ".." ) ?;
321
333
}
322
334
for p in suffix {
323
- write ! ( f, "{}{}" , start_or_continue ( ) , p) ?;
335
+ write ! ( f, "{}{}" , start_or_comma ( ) , p) ?;
324
336
}
325
337
write ! ( f, "]" )
326
338
}
339
+ PatternKind :: Or { ref pats } => {
340
+ for pat in pats {
341
+ write ! ( f, "{}{}" , start_or_continue( " | " ) , pat) ?;
342
+ }
343
+ Ok ( ( ) )
344
+ }
327
345
}
328
346
}
329
347
}
@@ -655,6 +673,12 @@ impl<'a, 'tcx> PatternContext<'a, 'tcx> {
655
673
656
674
self . lower_variant_or_leaf ( res, pat. hir_id , pat. span , ty, subpatterns)
657
675
}
676
+
677
+ PatKind :: Or ( ref pats) => {
678
+ PatternKind :: Or {
679
+ pats : pats. iter ( ) . map ( |p| self . lower_pattern ( p) ) . collect ( ) ,
680
+ }
681
+ }
658
682
} ;
659
683
660
684
Pattern {
@@ -1436,6 +1460,7 @@ impl<'tcx> PatternFoldable<'tcx> for PatternKind<'tcx> {
1436
1460
slice : slice. fold_with ( folder) ,
1437
1461
suffix : suffix. fold_with ( folder)
1438
1462
} ,
1463
+ PatternKind :: Or { ref pats } => PatternKind :: Or { pats : pats. fold_with ( folder) } ,
1439
1464
}
1440
1465
}
1441
1466
}
0 commit comments