1
1
//! Interface with `rustc_pattern_analysis`.
2
2
3
3
use std:: fmt;
4
+ use tracing:: debug;
4
5
5
6
use hir_def:: { DefWithBodyId , EnumVariantId , HasModule , LocalFieldId , ModuleId , VariantId } ;
6
7
use rustc_hash:: FxHashMap ;
@@ -11,7 +12,6 @@ use rustc_pattern_analysis::{
11
12
} ;
12
13
use smallvec:: { smallvec, SmallVec } ;
13
14
use stdx:: never;
14
- use typed_arena:: Arena ;
15
15
16
16
use crate :: {
17
17
db:: HirDatabase ,
@@ -26,7 +26,7 @@ use Constructor::*;
26
26
27
27
// Re-export r-a-specific versions of all these types.
28
28
pub ( crate ) type DeconstructedPat < ' p > =
29
- rustc_pattern_analysis:: pat:: DeconstructedPat < ' p , MatchCheckCtx < ' p > > ;
29
+ rustc_pattern_analysis:: pat:: DeconstructedPat < MatchCheckCtx < ' p > > ;
30
30
pub ( crate ) type MatchArm < ' p > = rustc_pattern_analysis:: MatchArm < ' p , MatchCheckCtx < ' p > > ;
31
31
pub ( crate ) type WitnessPat < ' p > = rustc_pattern_analysis:: pat:: WitnessPat < MatchCheckCtx < ' p > > ;
32
32
@@ -40,7 +40,6 @@ pub(crate) struct MatchCheckCtx<'p> {
40
40
module : ModuleId ,
41
41
body : DefWithBodyId ,
42
42
pub ( crate ) db : & ' p dyn HirDatabase ,
43
- pub ( crate ) pattern_arena : & ' p Arena < DeconstructedPat < ' p > > ,
44
43
exhaustive_patterns : bool ,
45
44
min_exhaustive_patterns : bool ,
46
45
}
@@ -52,17 +51,12 @@ pub(crate) struct PatData<'p> {
52
51
}
53
52
54
53
impl < ' p > MatchCheckCtx < ' p > {
55
- pub ( crate ) fn new (
56
- module : ModuleId ,
57
- body : DefWithBodyId ,
58
- db : & ' p dyn HirDatabase ,
59
- pattern_arena : & ' p Arena < DeconstructedPat < ' p > > ,
60
- ) -> Self {
54
+ pub ( crate ) fn new ( module : ModuleId , body : DefWithBodyId , db : & ' p dyn HirDatabase ) -> Self {
61
55
let def_map = db. crate_def_map ( module. krate ( ) ) ;
62
56
let exhaustive_patterns = def_map. is_unstable_feature_enabled ( "exhaustive_patterns" ) ;
63
57
let min_exhaustive_patterns =
64
58
def_map. is_unstable_feature_enabled ( "min_exhaustive_patterns" ) ;
65
- Self { module, body, db, pattern_arena , exhaustive_patterns, min_exhaustive_patterns }
59
+ Self { module, body, db, exhaustive_patterns, min_exhaustive_patterns }
66
60
}
67
61
68
62
fn is_uninhabited ( & self , ty : & Ty ) -> bool {
@@ -131,15 +125,15 @@ impl<'p> MatchCheckCtx<'p> {
131
125
}
132
126
133
127
pub ( crate ) fn lower_pat ( & self , pat : & Pat ) -> DeconstructedPat < ' p > {
134
- let singleton = |pat| std :: slice :: from_ref ( self . pattern_arena . alloc ( pat) ) ;
128
+ let singleton = |pat| vec ! [ pat] ;
135
129
let ctor;
136
- let fields: & [ _ ] ;
130
+ let fields: Vec < _ > ;
137
131
138
132
match pat. kind . as_ref ( ) {
139
133
PatKind :: Binding { subpattern : Some ( subpat) , .. } => return self . lower_pat ( subpat) ,
140
134
PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
141
135
ctor = Wildcard ;
142
- fields = & [ ] ;
136
+ fields = Vec :: new ( ) ;
143
137
}
144
138
PatKind :: Deref { subpattern } => {
145
139
ctor = match pat. ty . kind ( Interner ) {
@@ -157,7 +151,7 @@ impl<'p> MatchCheckCtx<'p> {
157
151
match pat. ty . kind ( Interner ) {
158
152
TyKind :: Tuple ( _, substs) => {
159
153
ctor = Struct ;
160
- let mut wilds: SmallVec < [ _ ; 2 ] > = substs
154
+ let mut wilds: Vec < _ > = substs
161
155
. iter ( Interner )
162
156
. map ( |arg| arg. assert_ty_ref ( Interner ) . clone ( ) )
163
157
. map ( DeconstructedPat :: wildcard)
@@ -166,7 +160,7 @@ impl<'p> MatchCheckCtx<'p> {
166
160
let idx: u32 = pat. field . into_raw ( ) . into ( ) ;
167
161
wilds[ idx as usize ] = self . lower_pat ( & pat. pattern ) ;
168
162
}
169
- fields = self . pattern_arena . alloc_extend ( wilds)
163
+ fields = wilds
170
164
}
171
165
TyKind :: Adt ( adt, substs) if is_box ( self . db , adt. 0 ) => {
172
166
// The only legal patterns of type `Box` (outside `std`) are `_` and box
@@ -216,33 +210,29 @@ impl<'p> MatchCheckCtx<'p> {
216
210
field_id_to_id[ field_idx as usize ] = Some ( i) ;
217
211
ty
218
212
} ) ;
219
- let mut wilds: SmallVec < [ _ ; 2 ] > =
220
- tys. map ( DeconstructedPat :: wildcard) . collect ( ) ;
213
+ let mut wilds: Vec < _ > = tys. map ( DeconstructedPat :: wildcard) . collect ( ) ;
221
214
for pat in subpatterns {
222
215
let field_idx: u32 = pat. field . into_raw ( ) . into ( ) ;
223
216
if let Some ( i) = field_id_to_id[ field_idx as usize ] {
224
217
wilds[ i] = self . lower_pat ( & pat. pattern ) ;
225
218
}
226
219
}
227
- fields = self . pattern_arena . alloc_extend ( wilds) ;
220
+ fields = wilds;
228
221
}
229
222
_ => {
230
223
never ! ( "pattern has unexpected type: pat: {:?}, ty: {:?}" , pat, & pat. ty) ;
231
224
ctor = Wildcard ;
232
- fields = & [ ] ;
225
+ fields = Vec :: new ( ) ;
233
226
}
234
227
}
235
228
}
236
229
& PatKind :: LiteralBool { value } => {
237
230
ctor = Bool ( value) ;
238
- fields = & [ ] ;
231
+ fields = Vec :: new ( ) ;
239
232
}
240
233
PatKind :: Or { pats } => {
241
234
ctor = Or ;
242
- // Collect here because `Arena::alloc_extend` panics on reentrancy.
243
- let subpats: SmallVec < [ _ ; 2 ] > =
244
- pats. iter ( ) . map ( |pat| self . lower_pat ( pat) ) . collect ( ) ;
245
- fields = self . pattern_arena . alloc_extend ( subpats) ;
235
+ fields = pats. iter ( ) . map ( |pat| self . lower_pat ( pat) ) . collect ( ) ;
246
236
}
247
237
}
248
238
let data = PatData { db : self . db } ;
@@ -307,7 +297,7 @@ impl<'p> MatchCheckCtx<'p> {
307
297
}
308
298
309
299
impl < ' p > TypeCx for MatchCheckCtx < ' p > {
310
- type Error = Void ;
300
+ type Error = ( ) ;
311
301
type Ty = Ty ;
312
302
type VariantIdx = EnumVariantId ;
313
303
type StrLit = Void ;
@@ -463,7 +453,7 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
463
453
464
454
fn write_variant_name (
465
455
f : & mut fmt:: Formatter < ' _ > ,
466
- pat : & rustc_pattern_analysis:: pat:: DeconstructedPat < ' _ , Self > ,
456
+ pat : & rustc_pattern_analysis:: pat:: DeconstructedPat < Self > ,
467
457
) -> fmt:: Result {
468
458
let variant =
469
459
pat. ty ( ) . as_adt ( ) . and_then ( |( adt, _) | Self :: variant_id_for_adt ( pat. ctor ( ) , adt) ) ;
@@ -485,8 +475,8 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
485
475
Ok ( ( ) )
486
476
}
487
477
488
- fn bug ( & self , fmt : fmt:: Arguments < ' _ > ) -> ! {
489
- panic ! ( "{}" , fmt)
478
+ fn bug ( & self , fmt : fmt:: Arguments < ' _ > ) {
479
+ debug ! ( "{}" , fmt)
490
480
}
491
481
}
492
482
0 commit comments