3131//! variable only once, and it does so as soon as it can, so it is reasonable to ask what the type 
3232//! inferencer knows "so far". 
3333
34- use  std:: collections:: hash_map:: Entry ; 
35- 
36- use  rustc_data_structures:: fx:: FxHashMap ; 
3734use  rustc_middle:: bug; 
3835use  rustc_middle:: ty:: { 
3936    self ,  Ty ,  TyCtxt ,  TypeFoldable ,  TypeFolder ,  TypeSuperFoldable ,  TypeVisitableExt , 
@@ -43,63 +40,11 @@ use super::InferCtxt;
4340
4441pub  struct  TypeFreshener < ' a ,  ' tcx >  { 
4542    infcx :  & ' a  InferCtxt < ' tcx > , 
46-     ty_freshen_count :  u32 , 
47-     const_freshen_count :  u32 , 
48-     ty_freshen_map :  FxHashMap < ty:: InferTy ,  Ty < ' tcx > > , 
49-     const_freshen_map :  FxHashMap < ty:: InferConst ,  ty:: Const < ' tcx > > , 
5043} 
5144
5245impl < ' a ,  ' tcx >  TypeFreshener < ' a ,  ' tcx >  { 
5346    pub  fn  new ( infcx :  & ' a  InferCtxt < ' tcx > )  -> TypeFreshener < ' a ,  ' tcx >  { 
54-         TypeFreshener  { 
55-             infcx, 
56-             ty_freshen_count :  0 , 
57-             const_freshen_count :  0 , 
58-             ty_freshen_map :  Default :: default ( ) , 
59-             const_freshen_map :  Default :: default ( ) , 
60-         } 
61-     } 
62- 
63-     fn  freshen_ty < F > ( & mut  self ,  input :  Result < Ty < ' tcx > ,  ty:: InferTy > ,  mk_fresh :  F )  -> Ty < ' tcx > 
64-     where 
65-         F :  FnOnce ( u32 )  -> Ty < ' tcx > , 
66-     { 
67-         match  input { 
68-             Ok ( ty)  => ty. fold_with ( self ) , 
69-             Err ( key)  => match  self . ty_freshen_map . entry ( key)  { 
70-                 Entry :: Occupied ( entry)  => * entry. get ( ) , 
71-                 Entry :: Vacant ( entry)  => { 
72-                     let  index = self . ty_freshen_count ; 
73-                     self . ty_freshen_count  += 1 ; 
74-                     let  t = mk_fresh ( index) ; 
75-                     entry. insert ( t) ; 
76-                     t
77-                 } 
78-             } , 
79-         } 
80-     } 
81- 
82-     fn  freshen_const < F > ( 
83-         & mut  self , 
84-         input :  Result < ty:: Const < ' tcx > ,  ty:: InferConst > , 
85-         freshener :  F , 
86-     )  -> ty:: Const < ' tcx > 
87-     where 
88-         F :  FnOnce ( u32 )  -> ty:: InferConst , 
89-     { 
90-         match  input { 
91-             Ok ( ct)  => ct. fold_with ( self ) , 
92-             Err ( key)  => match  self . const_freshen_map . entry ( key)  { 
93-                 Entry :: Occupied ( entry)  => * entry. get ( ) , 
94-                 Entry :: Vacant ( entry)  => { 
95-                     let  index = self . const_freshen_count ; 
96-                     self . const_freshen_count  += 1 ; 
97-                     let  ct = ty:: Const :: new_infer ( self . infcx . tcx ,  freshener ( index) ) ; 
98-                     entry. insert ( ct) ; 
99-                     ct
100-                 } 
101-             } , 
102-         } 
47+         TypeFreshener  {  infcx } 
10348    } 
10449} 
10550
@@ -145,25 +90,14 @@ impl<'a, 'tcx> TypeFolder<TyCtxt<'tcx>> for TypeFreshener<'a, 'tcx> {
14590    fn  fold_const ( & mut  self ,  ct :  ty:: Const < ' tcx > )  -> ty:: Const < ' tcx >  { 
14691        match  ct. kind ( )  { 
14792            ty:: ConstKind :: Infer ( ty:: InferConst :: Var ( v) )  => { 
148-                 let  mut  inner = self . infcx . inner . borrow_mut ( ) ; 
14993                let  input =
150-                     inner. const_unification_table ( ) . probe_value ( v) . known ( ) . ok_or_else ( || { 
151-                         ty:: InferConst :: Var ( inner. const_unification_table ( ) . find ( v) . vid ) 
152-                     } ) ; 
153-                 drop ( inner) ; 
154-                 self . freshen_const ( input,  ty:: InferConst :: Fresh ) 
155-             } 
156-             ty:: ConstKind :: Infer ( ty:: InferConst :: Fresh ( i) )  => { 
157-                 if  i >= self . const_freshen_count  { 
158-                     bug ! ( 
159-                         "Encountered a freshend const with id {} \  
160- , 
161-                         i, 
162-                         self . const_freshen_count, 
163-                     ) ; 
94+                     self . infcx . inner . borrow_mut ( ) . const_unification_table ( ) . probe_value ( v) . known ( ) ; 
95+                 match  input { 
96+                     Some ( ct)  => ct. fold_with ( self ) , 
97+                     None  => self . infcx . tcx . consts . fresh_const , 
16498                } 
165-                 ct
16699            } 
100+             ty:: ConstKind :: Infer ( ty:: InferConst :: Fresh )  => ct, 
167101
168102            ty:: ConstKind :: Bound ( ..)  | ty:: ConstKind :: Placeholder ( _)  => { 
169103                bug ! ( "unexpected const {:?}" ,  ct) 
@@ -184,54 +118,35 @@ impl<'a, 'tcx> TypeFreshener<'a, 'tcx> {
184118    fn  fold_infer_ty ( & mut  self ,  v :  ty:: InferTy )  -> Option < Ty < ' tcx > >  { 
185119        match  v { 
186120            ty:: TyVar ( v)  => { 
187-                 let  mut  inner = self . infcx . inner . borrow_mut ( ) ; 
188-                 let  input = inner
189-                     . type_variables ( ) 
190-                     . probe ( v) 
191-                     . known ( ) 
192-                     . ok_or_else ( || ty:: TyVar ( inner. type_variables ( ) . root_var ( v) ) ) ; 
193-                 drop ( inner) ; 
194-                 Some ( self . freshen_ty ( input,  |n| Ty :: new_fresh ( self . infcx . tcx ,  n) ) ) 
121+                 let  value = self . infcx . inner . borrow_mut ( ) . type_variables ( ) . probe ( v) . known ( ) ; 
122+                 Some ( match  value { 
123+                     Some ( ty)  => ty. fold_with ( self ) , 
124+                     None  => self . infcx . tcx . types . fresh_ty , 
125+                 } ) 
195126            } 
196127
197128            ty:: IntVar ( v)  => { 
198-                 let  mut  inner = self . infcx . inner . borrow_mut ( ) ; 
199-                 let  value = inner. int_unification_table ( ) . probe_value ( v) ; 
200-                 let  input = match  value { 
201-                     ty:: IntVarValue :: IntType ( ty)  => Ok ( Ty :: new_int ( self . infcx . tcx ,  ty) ) , 
202-                     ty:: IntVarValue :: UintType ( ty)  => Ok ( Ty :: new_uint ( self . infcx . tcx ,  ty) ) , 
203-                     ty:: IntVarValue :: Unknown  => { 
204-                         Err ( ty:: IntVar ( inner. int_unification_table ( ) . find ( v) ) ) 
129+                 let  value = self . infcx . inner . borrow_mut ( ) . int_unification_table ( ) . probe_value ( v) ; 
130+                 Some ( match  value { 
131+                     ty:: IntVarValue :: IntType ( ty)  => Ty :: new_int ( self . infcx . tcx ,  ty) . fold_with ( self ) , 
132+                     ty:: IntVarValue :: UintType ( ty)  => { 
133+                         Ty :: new_uint ( self . infcx . tcx ,  ty) . fold_with ( self ) 
205134                    } 
206-                 } ; 
207-                 drop ( inner) ; 
208-                 Some ( self . freshen_ty ( input,  |n| Ty :: new_fresh_int ( self . infcx . tcx ,  n) ) ) 
135+                     ty:: IntVarValue :: Unknown  => self . infcx . tcx . types . fresh_int_ty , 
136+                 } ) 
209137            } 
210138
211139            ty:: FloatVar ( v)  => { 
212-                 let  mut  inner = self . infcx . inner . borrow_mut ( ) ; 
213-                 let  value = inner. float_unification_table ( ) . probe_value ( v) ; 
214-                 let  input = match  value { 
215-                     ty:: FloatVarValue :: Known ( ty)  => Ok ( Ty :: new_float ( self . infcx . tcx ,  ty) ) , 
216-                     ty:: FloatVarValue :: Unknown  => { 
217-                         Err ( ty:: FloatVar ( inner. float_unification_table ( ) . find ( v) ) ) 
140+                 let  value = self . infcx . inner . borrow_mut ( ) . float_unification_table ( ) . probe_value ( v) ; 
141+                 Some ( match  value { 
142+                     ty:: FloatVarValue :: Known ( ty)  => { 
143+                         Ty :: new_float ( self . infcx . tcx ,  ty) . fold_with ( self ) 
218144                    } 
219-                 } ; 
220-                 drop ( inner) ; 
221-                 Some ( self . freshen_ty ( input,  |n| Ty :: new_fresh_float ( self . infcx . tcx ,  n) ) ) 
145+                     ty:: FloatVarValue :: Unknown  => self . infcx . tcx . types . fresh_float_ty , 
146+                 } ) 
222147            } 
223148
224-             ty:: FreshTy ( ct)  | ty:: FreshIntTy ( ct)  | ty:: FreshFloatTy ( ct)  => { 
225-                 if  ct >= self . ty_freshen_count  { 
226-                     bug ! ( 
227-                         "Encountered a freshend type with id {} \  
228- , 
229-                         ct, 
230-                         self . ty_freshen_count
231-                     ) ; 
232-                 } 
233-                 None 
234-             } 
149+             ty:: FreshTy  | ty:: FreshIntTy  | ty:: FreshFloatTy  => None , 
235150        } 
236151    } 
237152} 
0 commit comments