@@ -75,18 +75,15 @@ impl<'p> MatchCheckCtx<'p> {
75
75
}
76
76
}
77
77
78
- fn variant_id_for_adt ( & self , ctor : & Constructor < Self > , adt : hir_def:: AdtId ) -> VariantId {
78
+ fn variant_id_for_adt ( ctor : & Constructor < Self > , adt : hir_def:: AdtId ) -> Option < VariantId > {
79
79
match ctor {
80
- & Variant ( id) => id. into ( ) ,
81
- Struct | UnionField => {
82
- assert ! ( !matches!( adt, hir_def:: AdtId :: EnumId ( _) ) ) ;
83
- match adt {
84
- hir_def:: AdtId :: EnumId ( _) => unreachable ! ( ) ,
85
- hir_def:: AdtId :: StructId ( id) => id. into ( ) ,
86
- hir_def:: AdtId :: UnionId ( id) => id. into ( ) ,
87
- }
88
- }
89
- _ => panic ! ( "bad constructor {self:?} for adt {adt:?}" ) ,
80
+ & Variant ( id) => Some ( id. into ( ) ) ,
81
+ Struct | UnionField => match adt {
82
+ hir_def:: AdtId :: EnumId ( _) => None ,
83
+ hir_def:: AdtId :: StructId ( id) => Some ( id. into ( ) ) ,
84
+ hir_def:: AdtId :: UnionId ( id) => Some ( id. into ( ) ) ,
85
+ } ,
86
+ _ => panic ! ( "bad constructor {ctor:?} for adt {adt:?}" ) ,
90
87
}
91
88
}
92
89
@@ -200,7 +197,7 @@ impl<'p> MatchCheckCtx<'p> {
200
197
Wildcard
201
198
}
202
199
} ;
203
- let variant = self . variant_id_for_adt ( & ctor, adt. 0 ) ;
200
+ let variant = Self :: variant_id_for_adt ( & ctor, adt. 0 ) . unwrap ( ) ;
204
201
let fields_len = variant. variant_data ( self . db . upcast ( ) ) . fields ( ) . len ( ) ;
205
202
// For each field in the variant, we store the relevant index into `self.fields` if any.
206
203
let mut field_id_to_id: Vec < Option < usize > > = vec ! [ None ; fields_len] ;
@@ -266,7 +263,7 @@ impl<'p> MatchCheckCtx<'p> {
266
263
PatKind :: Deref { subpattern : subpatterns. next ( ) . unwrap ( ) }
267
264
}
268
265
TyKind :: Adt ( adt, substs) => {
269
- let variant = self . variant_id_for_adt ( pat. ctor ( ) , adt. 0 ) ;
266
+ let variant = Self :: variant_id_for_adt ( pat. ctor ( ) , adt. 0 ) . unwrap ( ) ;
270
267
let subpatterns = self
271
268
. list_variant_nonhidden_fields ( pat. ty ( ) , variant)
272
269
. zip ( subpatterns)
@@ -327,7 +324,7 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
327
324
// patterns. If we're here we can assume this is a box pattern.
328
325
1
329
326
} else {
330
- let variant = self . variant_id_for_adt ( ctor, adt) ;
327
+ let variant = Self :: variant_id_for_adt ( ctor, adt) . unwrap ( ) ;
331
328
self . list_variant_nonhidden_fields ( ty, variant) . count ( )
332
329
}
333
330
}
@@ -370,7 +367,7 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
370
367
let subst_ty = substs. at ( Interner , 0 ) . assert_ty_ref ( Interner ) . clone ( ) ;
371
368
alloc ( self , once ( subst_ty) )
372
369
} else {
373
- let variant = self . variant_id_for_adt ( ctor, adt) ;
370
+ let variant = Self :: variant_id_for_adt ( ctor, adt) . unwrap ( ) ;
374
371
let tys = self . list_variant_nonhidden_fields ( ty, variant) . map ( |( _, ty) | ty) ;
375
372
alloc ( self , tys)
376
373
}
0 commit comments