1
1
use cast:: Cast ;
2
- use ena:: unify:: UnifyValue ;
3
- use errors:: * ;
4
2
use ir:: * ;
5
3
use solve:: environment:: { Environment , InEnvironment } ;
6
4
use std:: fmt:: Debug ;
7
5
use std:: sync:: Arc ;
8
6
use zip:: { Zip , Zipper } ;
9
7
10
- use super :: { InferenceSnapshot , InferenceTable } ;
11
- use super :: ty_var:: { TyInferenceVariable , TyInferenceValue , ValueIndex } ;
12
- use super :: krate_var:: { KrateInferenceVariable , KrateInferenceValue } ;
8
+ use super :: * ;
9
+ use super :: var:: * ;
13
10
14
11
impl InferenceTable {
15
12
pub fn unify < T > ( & mut self ,
@@ -204,22 +201,29 @@ impl<'t> Unifier<'t> {
204
201
// this variable was created -- though it may change over time
205
202
// as the variable is unified.
206
203
let universe_index = match self . table . ty_unify . probe_value ( var) {
207
- TyInferenceValue :: Unbound ( ui) => ui,
208
- TyInferenceValue :: Bound ( _) => panic ! ( "`unify_var_apply` invoked on bound var" ) ,
204
+ InferenceValue :: Unbound ( ui) => ui,
205
+ InferenceValue :: Bound ( _) => panic ! ( "`unify_var_apply` invoked on bound var" ) ,
209
206
} ;
210
207
211
208
OccursCheck :: new ( self , var, universe_index) . check_ty ( ty) ?;
212
209
213
210
let value_index = ValueIndex :: new ( self . table . ty_values . len ( ) ) ;
214
211
self . table . ty_values . push ( Arc :: new ( ty. clone ( ) ) ) ;
215
- self . table . ty_unify . unify_var_value ( var, TyInferenceValue :: Bound ( value_index) ) . unwrap ( ) ;
212
+ self . table . ty_unify . unify_var_value ( var, InferenceValue :: Bound ( value_index) ) . unwrap ( ) ;
216
213
debug ! ( "unify_var_ty: var {:?} set to {:?}" , var, ty) ;
217
214
218
215
Ok ( ( ) )
219
216
}
220
217
221
218
fn unify_krate_krate ( & mut self , a : & Krate , b : & Krate ) -> Result < ( ) > {
219
+ if let Some ( n_a) = self . table . normalize_krate ( a) {
220
+ return self . unify_krate_krate ( & n_a, b) ;
221
+ } else if let Some ( n_b) = self . table . normalize_krate ( b) {
222
+ return self . unify_krate_krate ( a, & n_b) ;
223
+ }
224
+
222
225
debug_heading ! ( "unify_krate_krate({:?}, {:?})" , a, b) ;
226
+
223
227
let result = match ( a, b) {
224
228
( & Krate :: Var ( depth_a) , & Krate :: Var ( depth_b) ) => {
225
229
let var_a = KrateInferenceVariable :: from_depth ( depth_a) ;
@@ -230,14 +234,17 @@ impl<'t> Unifier<'t> {
230
234
( & Krate :: Var ( depth) , & Krate :: Id ( id) ) |
231
235
( & Krate :: Id ( id) , & Krate :: Var ( depth) ) => {
232
236
let var = KrateInferenceVariable :: from_depth ( depth) ;
233
- let value = KrateInferenceValue :: Bound ( id) ;
234
- self . table . krate_unify . unify_var_value ( var, value)
237
+ let value_index = ValueIndex :: new ( self . table . krate_values . len ( ) ) ;
238
+ self . table . krate_values . push ( Krate :: Id ( id) ) ;
239
+ self . table . krate_unify . unify_var_value ( var, InferenceValue :: Bound ( value_index) )
235
240
}
236
241
237
242
( & Krate :: Id ( a_id) , & Krate :: Id ( b_id) ) => {
238
- let a_value = KrateInferenceValue :: Bound ( a_id) ;
239
- let b_value = KrateInferenceValue :: Bound ( b_id) ;
240
- KrateInferenceValue :: unify_values ( & a_value, & b_value) . map ( |_| ( ) )
243
+ if a_id == b_id {
244
+ Ok ( ( ) )
245
+ } else {
246
+ bail ! ( "krate `{:?}` not equal to `{:?}`" , a_id, b_id)
247
+ }
241
248
}
242
249
} ;
243
250
@@ -341,8 +348,8 @@ impl<'u, 't> OccursCheck<'u, 't> {
341
348
Ty :: Var ( depth) => {
342
349
let v = TyInferenceVariable :: from_depth ( depth - self . binders ) ;
343
350
let ui = match self . unifier . table . ty_unify . probe_value ( v) {
344
- TyInferenceValue :: Unbound ( ui) => ui,
345
- TyInferenceValue :: Bound ( _) => {
351
+ InferenceValue :: Unbound ( ui) => ui,
352
+ InferenceValue :: Bound ( _) => {
346
353
unreachable ! ( "expected `parameter` to be normalized" )
347
354
}
348
355
} ;
@@ -361,7 +368,7 @@ impl<'u, 't> OccursCheck<'u, 't> {
361
368
self . unifier
362
369
. table
363
370
. ty_unify
364
- . unify_var_value ( v, TyInferenceValue :: Unbound ( self . universe_index ) )
371
+ . unify_var_value ( v, InferenceValue :: Unbound ( self . universe_index ) )
365
372
. unwrap ( ) ;
366
373
}
367
374
}
0 commit comments