8
8
// option. This file may not be copied, modified, or distributed
9
9
// except according to those terms.
10
10
11
- //! Skolemization is the process of replacing unknown variables with fresh types. The idea is that
12
- //! the type, after skolemization , contains no inference variables but instead contains either a
11
+ //! Freshening is the process of replacing unknown variables with fresh types. The idea is that
12
+ //! the type, after freshening , contains no inference variables but instead contains either a
13
13
//! value for each variable or fresh "arbitrary" types wherever a variable would have been.
14
14
//!
15
- //! Skolemization is used primarily to get a good type for inserting into a cache. The result
15
+ //! Freshening is used primarily to get a good type for inserting into a cache. The result
16
16
//! summarizes what the type inferencer knows "so far". The primary place it is used right now is
17
17
//! in the trait matching algorithm, which needs to be able to cache whether an `impl` self type
18
18
//! matches some other type X -- *without* affecting `X`. That means if that if the type `X` is in
19
19
//! fact an unbound type variable, we want the match to be regarded as ambiguous, because depending
20
20
//! on what type that type variable is ultimately assigned, the match may or may not succeed.
21
21
//!
22
- //! Note that you should be careful not to allow the output of skolemization to leak to the user in
23
- //! error messages or in any other form. Skolemization is only really useful as an internal detail.
22
+ //! Note that you should be careful not to allow the output of freshening to leak to the user in
23
+ //! error messages or in any other form. Freshening is only really useful as an internal detail.
24
24
//!
25
- //! __An important detail concerning regions.__ The skolemizer also replaces *all* regions with
25
+ //! __An important detail concerning regions.__ The freshener also replaces *all* regions with
26
26
//! 'static. The reason behind this is that, in general, we do not take region relationships into
27
27
//! account when making type-overloaded decisions. This is important because of the design of the
28
28
//! region inferencer, which is not based on unification but rather on accumulating and then
@@ -39,47 +39,47 @@ use std::collections::hash_map;
39
39
use super :: InferCtxt ;
40
40
use super :: unify:: InferCtxtMethodsForSimplyUnifiableTypes ;
41
41
42
- pub struct TypeSkolemizer < ' a , ' tcx : ' a > {
42
+ pub struct TypeFreshener < ' a , ' tcx : ' a > {
43
43
infcx : & ' a InferCtxt < ' a , ' tcx > ,
44
- skolemization_count : uint ,
45
- skolemization_map : hash_map:: HashMap < ty:: InferTy , Ty < ' tcx > > ,
44
+ freshen_count : uint ,
45
+ freshen_map : hash_map:: HashMap < ty:: InferTy , Ty < ' tcx > > ,
46
46
}
47
47
48
- impl < ' a , ' tcx > TypeSkolemizer < ' a , ' tcx > {
49
- pub fn new ( infcx : & ' a InferCtxt < ' a , ' tcx > ) -> TypeSkolemizer < ' a , ' tcx > {
50
- TypeSkolemizer {
48
+ impl < ' a , ' tcx > TypeFreshener < ' a , ' tcx > {
49
+ pub fn new ( infcx : & ' a InferCtxt < ' a , ' tcx > ) -> TypeFreshener < ' a , ' tcx > {
50
+ TypeFreshener {
51
51
infcx : infcx,
52
- skolemization_count : 0 ,
53
- skolemization_map : hash_map:: HashMap :: new ( ) ,
52
+ freshen_count : 0 ,
53
+ freshen_map : hash_map:: HashMap :: new ( ) ,
54
54
}
55
55
}
56
56
57
- fn skolemize < F > ( & mut self ,
58
- opt_ty : Option < Ty < ' tcx > > ,
59
- key : ty:: InferTy ,
60
- skolemizer : F )
61
- -> Ty < ' tcx > where
57
+ fn freshen < F > ( & mut self ,
58
+ opt_ty : Option < Ty < ' tcx > > ,
59
+ key : ty:: InferTy ,
60
+ freshener : F )
61
+ -> Ty < ' tcx > where
62
62
F : FnOnce ( uint ) -> ty:: InferTy ,
63
63
{
64
64
match opt_ty {
65
65
Some ( ty) => { return ty. fold_with ( self ) ; }
66
66
None => { }
67
67
}
68
68
69
- match self . skolemization_map . entry ( key) {
69
+ match self . freshen_map . entry ( key) {
70
70
hash_map:: Occupied ( entry) => * entry. get ( ) ,
71
71
hash_map:: Vacant ( entry) => {
72
- let index = self . skolemization_count ;
73
- self . skolemization_count += 1 ;
74
- let t = ty:: mk_infer ( self . infcx . tcx , skolemizer ( index) ) ;
72
+ let index = self . freshen_count ;
73
+ self . freshen_count += 1 ;
74
+ let t = ty:: mk_infer ( self . infcx . tcx , freshener ( index) ) ;
75
75
entry. set ( t) ;
76
76
t
77
77
}
78
78
}
79
79
}
80
80
}
81
81
82
- impl < ' a , ' tcx > TypeFolder < ' tcx > for TypeSkolemizer < ' a , ' tcx > {
82
+ impl < ' a , ' tcx > TypeFolder < ' tcx > for TypeFreshener < ' a , ' tcx > {
83
83
fn tcx < ' b > ( & ' b self ) -> & ' b ty:: ctxt < ' tcx > {
84
84
self . infcx . tcx
85
85
}
@@ -106,37 +106,37 @@ impl<'a, 'tcx> TypeFolder<'tcx> for TypeSkolemizer<'a, 'tcx> {
106
106
fn fold_ty ( & mut self , t : Ty < ' tcx > ) -> Ty < ' tcx > {
107
107
match t. sty {
108
108
ty:: ty_infer( ty:: TyVar ( v) ) => {
109
- self . skolemize ( self . infcx . type_variables . borrow ( ) . probe ( v) ,
109
+ self . freshen ( self . infcx . type_variables . borrow ( ) . probe ( v) ,
110
110
ty:: TyVar ( v) ,
111
- ty:: SkolemizedTy )
111
+ ty:: FreshTy )
112
112
}
113
113
114
114
ty:: ty_infer( ty:: IntVar ( v) ) => {
115
- self . skolemize ( self . infcx . probe_var ( v) ,
116
- ty:: IntVar ( v) ,
117
- ty:: SkolemizedIntTy )
115
+ self . freshen ( self . infcx . probe_var ( v) ,
116
+ ty:: IntVar ( v) ,
117
+ ty:: FreshIntTy )
118
118
}
119
119
120
120
ty:: ty_infer( ty:: FloatVar ( v) ) => {
121
- self . skolemize ( self . infcx . probe_var ( v) ,
122
- ty:: FloatVar ( v) ,
123
- ty:: SkolemizedIntTy )
121
+ self . freshen ( self . infcx . probe_var ( v) ,
122
+ ty:: FloatVar ( v) ,
123
+ ty:: FreshIntTy )
124
124
}
125
125
126
- ty:: ty_infer( ty:: SkolemizedTy ( c) ) |
127
- ty:: ty_infer( ty:: SkolemizedIntTy ( c) ) => {
128
- if c >= self . skolemization_count {
126
+ ty:: ty_infer( ty:: FreshTy ( c) ) |
127
+ ty:: ty_infer( ty:: FreshIntTy ( c) ) => {
128
+ if c >= self . freshen_count {
129
129
self . tcx ( ) . sess . bug (
130
- format ! ( "Encountered a skolemized type with id {} \
130
+ format ! ( "Encountered a freshend type with id {} \
131
131
but our counter is only at {}",
132
132
c,
133
- self . skolemization_count ) . as_slice ( ) ) ;
133
+ self . freshen_count ) . as_slice ( ) ) ;
134
134
}
135
135
t
136
136
}
137
137
138
138
ty:: ty_open( ..) => {
139
- self . tcx ( ) . sess . bug ( "Cannot skolemize an open existential type" ) ;
139
+ self . tcx ( ) . sess . bug ( "Cannot freshen an open existential type" ) ;
140
140
}
141
141
142
142
ty:: ty_bool |
0 commit comments