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