11//! Interface with `rustc_pattern_analysis`.
22
33use std:: fmt;
4+ use tracing:: debug;
45
56use hir_def:: { DefWithBodyId , EnumVariantId , HasModule , LocalFieldId , ModuleId , VariantId } ;
67use rustc_hash:: FxHashMap ;
@@ -11,7 +12,6 @@ use rustc_pattern_analysis::{
1112} ;
1213use smallvec:: { smallvec, SmallVec } ;
1314use stdx:: never;
14- use typed_arena:: Arena ;
1515
1616use crate :: {
1717 db:: HirDatabase ,
@@ -26,7 +26,7 @@ use Constructor::*;
2626
2727// Re-export r-a-specific versions of all these types.
2828pub ( crate ) type DeconstructedPat < ' p > =
29- rustc_pattern_analysis:: pat:: DeconstructedPat < ' p , MatchCheckCtx < ' p > > ;
29+ rustc_pattern_analysis:: pat:: DeconstructedPat < MatchCheckCtx < ' p > > ;
3030pub ( crate ) type MatchArm < ' p > = rustc_pattern_analysis:: MatchArm < ' p , MatchCheckCtx < ' p > > ;
3131pub ( crate ) type WitnessPat < ' p > = rustc_pattern_analysis:: pat:: WitnessPat < MatchCheckCtx < ' p > > ;
3232
@@ -40,7 +40,6 @@ pub(crate) struct MatchCheckCtx<'p> {
4040 module : ModuleId ,
4141 body : DefWithBodyId ,
4242 pub ( crate ) db : & ' p dyn HirDatabase ,
43- pub ( crate ) pattern_arena : & ' p Arena < DeconstructedPat < ' p > > ,
4443 exhaustive_patterns : bool ,
4544 min_exhaustive_patterns : bool ,
4645}
@@ -52,17 +51,12 @@ pub(crate) struct PatData<'p> {
5251}
5352
5453impl < ' 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 {
6155 let def_map = db. crate_def_map ( module. krate ( ) ) ;
6256 let exhaustive_patterns = def_map. is_unstable_feature_enabled ( "exhaustive_patterns" ) ;
6357 let min_exhaustive_patterns =
6458 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 }
6660 }
6761
6862 fn is_uninhabited ( & self , ty : & Ty ) -> bool {
@@ -131,15 +125,15 @@ impl<'p> MatchCheckCtx<'p> {
131125 }
132126
133127 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] ;
135129 let ctor;
136- let fields: & [ _ ] ;
130+ let fields: Vec < _ > ;
137131
138132 match pat. kind . as_ref ( ) {
139133 PatKind :: Binding { subpattern : Some ( subpat) , .. } => return self . lower_pat ( subpat) ,
140134 PatKind :: Binding { subpattern : None , .. } | PatKind :: Wild => {
141135 ctor = Wildcard ;
142- fields = & [ ] ;
136+ fields = Vec :: new ( ) ;
143137 }
144138 PatKind :: Deref { subpattern } => {
145139 ctor = match pat. ty . kind ( Interner ) {
@@ -157,7 +151,7 @@ impl<'p> MatchCheckCtx<'p> {
157151 match pat. ty . kind ( Interner ) {
158152 TyKind :: Tuple ( _, substs) => {
159153 ctor = Struct ;
160- let mut wilds: SmallVec < [ _ ; 2 ] > = substs
154+ let mut wilds: Vec < _ > = substs
161155 . iter ( Interner )
162156 . map ( |arg| arg. assert_ty_ref ( Interner ) . clone ( ) )
163157 . map ( DeconstructedPat :: wildcard)
@@ -166,7 +160,7 @@ impl<'p> MatchCheckCtx<'p> {
166160 let idx: u32 = pat. field . into_raw ( ) . into ( ) ;
167161 wilds[ idx as usize ] = self . lower_pat ( & pat. pattern ) ;
168162 }
169- fields = self . pattern_arena . alloc_extend ( wilds)
163+ fields = wilds
170164 }
171165 TyKind :: Adt ( adt, substs) if is_box ( self . db , adt. 0 ) => {
172166 // The only legal patterns of type `Box` (outside `std`) are `_` and box
@@ -216,33 +210,29 @@ impl<'p> MatchCheckCtx<'p> {
216210 field_id_to_id[ field_idx as usize ] = Some ( i) ;
217211 ty
218212 } ) ;
219- let mut wilds: SmallVec < [ _ ; 2 ] > =
220- tys. map ( DeconstructedPat :: wildcard) . collect ( ) ;
213+ let mut wilds: Vec < _ > = tys. map ( DeconstructedPat :: wildcard) . collect ( ) ;
221214 for pat in subpatterns {
222215 let field_idx: u32 = pat. field . into_raw ( ) . into ( ) ;
223216 if let Some ( i) = field_id_to_id[ field_idx as usize ] {
224217 wilds[ i] = self . lower_pat ( & pat. pattern ) ;
225218 }
226219 }
227- fields = self . pattern_arena . alloc_extend ( wilds) ;
220+ fields = wilds;
228221 }
229222 _ => {
230223 never ! ( "pattern has unexpected type: pat: {:?}, ty: {:?}" , pat, & pat. ty) ;
231224 ctor = Wildcard ;
232- fields = & [ ] ;
225+ fields = Vec :: new ( ) ;
233226 }
234227 }
235228 }
236229 & PatKind :: LiteralBool { value } => {
237230 ctor = Bool ( value) ;
238- fields = & [ ] ;
231+ fields = Vec :: new ( ) ;
239232 }
240233 PatKind :: Or { pats } => {
241234 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 ( ) ;
246236 }
247237 }
248238 let data = PatData { db : self . db } ;
@@ -307,7 +297,7 @@ impl<'p> MatchCheckCtx<'p> {
307297}
308298
309299impl < ' p > TypeCx for MatchCheckCtx < ' p > {
310- type Error = Void ;
300+ type Error = ( ) ;
311301 type Ty = Ty ;
312302 type VariantIdx = EnumVariantId ;
313303 type StrLit = Void ;
@@ -463,7 +453,7 @@ impl<'p> TypeCx for MatchCheckCtx<'p> {
463453
464454 fn write_variant_name (
465455 f : & mut fmt:: Formatter < ' _ > ,
466- pat : & rustc_pattern_analysis:: pat:: DeconstructedPat < ' _ , Self > ,
456+ pat : & rustc_pattern_analysis:: pat:: DeconstructedPat < Self > ,
467457 ) -> fmt:: Result {
468458 let variant =
469459 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> {
485475 Ok ( ( ) )
486476 }
487477
488- fn bug ( & self , fmt : fmt:: Arguments < ' _ > ) -> ! {
489- panic ! ( "{}" , fmt)
478+ fn bug ( & self , fmt : fmt:: Arguments < ' _ > ) {
479+ debug ! ( "{}" , fmt)
490480 }
491481}
492482
0 commit comments