Skip to content

Commit fcf23d2

Browse files
committed
make TyInferenceValue and KrateInferenceValue work same way
1 parent c891d80 commit fcf23d2

File tree

6 files changed

+178
-208
lines changed

6 files changed

+178
-208
lines changed

chalk-rust/src/solve/infer/krate_var.rs

-79
This file was deleted.

chalk-rust/src/solve/infer/mod.rs

+12-28
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@ use errors::*;
33
use ir::*;
44
use std::sync::Arc;
55

6-
mod krate_var;
76
mod instantiate;
87
mod lifetime_var;
98
mod query;
109
mod unify;
11-
mod ty_var;
10+
mod var;
1211
#[cfg(test)] mod test;
1312

1413
pub use self::unify::UnificationResult;
15-
use self::ty_var::{TyInferenceVariable, TyInferenceValue};
16-
use self::krate_var::{KrateInferenceVariable, KrateInferenceValue};
14+
use self::var::{TyInferenceVariable, KrateInferenceVariable, InferenceValue};
1715
use self::lifetime_var::LifetimeInferenceVariable;
1816

1917
#[derive(Clone)]
@@ -22,6 +20,7 @@ pub struct InferenceTable {
2220
ty_values: Vec<Arc<Ty>>,
2321

2422
krate_unify: ena::UnificationTable<KrateInferenceVariable>,
23+
krate_values: Vec<Krate>,
2524

2625
/// Unlike normal variables, we don't unify lifetime variables.
2726
/// Instead, we just keep track of the universe in which they were
@@ -40,28 +39,13 @@ pub type ParameterInferenceVariable = ParameterKind<TyInferenceVariable,
4039
LifetimeInferenceVariable,
4140
KrateInferenceVariable>;
4241

43-
/// An index into the `InferenceTable.values` vector.
44-
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
45-
pub struct ValueIndex {
46-
index: u32
47-
}
48-
49-
impl ValueIndex {
50-
pub fn new(value: usize) -> ValueIndex {
51-
ValueIndex { index: value as u32 }
52-
}
53-
54-
pub fn as_usize(&self) -> usize {
55-
self.index as usize
56-
}
57-
}
58-
5942
impl InferenceTable {
6043
pub fn new() -> Self {
6144
InferenceTable {
6245
ty_unify: ena::UnificationTable::new(),
6346
krate_unify: ena::UnificationTable::new(),
6447
ty_values: vec![],
48+
krate_values: vec![],
6549
lifetime_vars: vec![],
6650
}
6751
}
@@ -75,7 +59,7 @@ impl InferenceTable {
7559
}
7660

7761
pub fn new_variable(&mut self, ui: UniverseIndex) -> TyInferenceVariable {
78-
self.ty_unify.new_key(TyInferenceValue::Unbound(ui))
62+
self.ty_unify.new_key(InferenceValue::Unbound(ui))
7963
}
8064

8165
pub fn new_lifetime_variable(&mut self, ui: UniverseIndex) -> LifetimeInferenceVariable {
@@ -85,7 +69,7 @@ impl InferenceTable {
8569
}
8670

8771
pub fn new_krate_variable(&mut self, ui: UniverseIndex) -> KrateInferenceVariable {
88-
self.krate_unify.new_key(KrateInferenceValue::Unbound(ui))
72+
self.krate_unify.new_key(InferenceValue::Unbound(ui))
8973
}
9074

9175
pub fn new_parameter_variable(&mut self, ui: ParameterKind<UniverseIndex>)
@@ -141,8 +125,8 @@ impl InferenceTable {
141125
leaf.inference_var()
142126
.and_then(|var| {
143127
match self.ty_unify.probe_value(var) {
144-
TyInferenceValue::Unbound(_) => None,
145-
TyInferenceValue::Bound(val) => Some(self.ty_values[val.as_usize()].clone()),
128+
InferenceValue::Unbound(_) => None,
129+
InferenceValue::Bound(val) => Some(self.ty_values[val.as_usize()].clone()),
146130
}
147131
})
148132
}
@@ -156,15 +140,15 @@ impl InferenceTable {
156140

157141
fn probe_var(&mut self, var: TyInferenceVariable) -> Option<Arc<Ty>> {
158142
match self.ty_unify.probe_value(var) {
159-
TyInferenceValue::Unbound(_) => None,
160-
TyInferenceValue::Bound(val) => Some(self.ty_values[val.as_usize()].clone()),
143+
InferenceValue::Unbound(_) => None,
144+
InferenceValue::Bound(val) => Some(self.ty_values[val.as_usize()].clone()),
161145
}
162146
}
163147

164148
fn probe_krate_var(&mut self, var: KrateInferenceVariable) -> Option<Krate> {
165149
match self.krate_unify.probe_value(var) {
166-
KrateInferenceValue::Unbound(_) => None,
167-
KrateInferenceValue::Bound(id) => Some(Krate::Id(id)),
150+
InferenceValue::Unbound(_) => None,
151+
InferenceValue::Bound(val) => Some(self.krate_values[val.as_usize()]),
168152
}
169153
}
170154
}

chalk-rust/src/solve/infer/query.rs

+5-6
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ use ir::*;
44

55
use super::{InferenceTable, TyInferenceVariable,
66
KrateInferenceVariable, LifetimeInferenceVariable, ParameterInferenceVariable};
7-
use super::ty_var::TyInferenceValue;
8-
use super::krate_var::KrateInferenceValue;
7+
use super::var::InferenceValue;
98

109
impl InferenceTable {
1110
/// Given a value `value` with variables in it, replaces those
@@ -49,8 +48,8 @@ impl<'q> Querifier<'q> {
4948
ParameterKind::Ty(v) => {
5049
debug_assert!(table.ty_unify.find(v) == v);
5150
match table.ty_unify.probe_value(v) {
52-
TyInferenceValue::Unbound(ui) => ParameterKind::Ty(ui),
53-
TyInferenceValue::Bound(_) => panic!("free var now bound"),
51+
InferenceValue::Unbound(ui) => ParameterKind::Ty(ui),
52+
InferenceValue::Bound(_) => panic!("free var now bound"),
5453
}
5554
},
5655

@@ -60,8 +59,8 @@ impl<'q> Querifier<'q> {
6059

6160
ParameterKind::Krate(c) => {
6261
match table.krate_unify.probe_value(c) {
63-
KrateInferenceValue::Unbound(ui) => ParameterKind::Krate(ui),
64-
KrateInferenceValue::Bound(_) => panic!("free var now bound")
62+
InferenceValue::Unbound(ui) => ParameterKind::Krate(ui),
63+
InferenceValue::Bound(_) => panic!("free var now bound")
6564
}
6665
},
6766
})

chalk-rust/src/solve/infer/ty_var.rs

-79
This file was deleted.

chalk-rust/src/solve/infer/unify.rs

+23-16
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
use cast::Cast;
2-
use ena::unify::UnifyValue;
3-
use errors::*;
42
use ir::*;
53
use solve::environment::{Environment, InEnvironment};
64
use std::fmt::Debug;
75
use std::sync::Arc;
86
use zip::{Zip, Zipper};
97

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::*;
1310

1411
impl InferenceTable {
1512
pub fn unify<T>(&mut self,
@@ -204,22 +201,29 @@ impl<'t> Unifier<'t> {
204201
// this variable was created -- though it may change over time
205202
// as the variable is unified.
206203
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"),
209206
};
210207

211208
OccursCheck::new(self, var, universe_index).check_ty(ty)?;
212209

213210
let value_index = ValueIndex::new(self.table.ty_values.len());
214211
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();
216213
debug!("unify_var_ty: var {:?} set to {:?}", var, ty);
217214

218215
Ok(())
219216
}
220217

221218
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+
222225
debug_heading!("unify_krate_krate({:?}, {:?})", a, b);
226+
223227
let result = match (a, b) {
224228
(&Krate::Var(depth_a), &Krate::Var(depth_b)) => {
225229
let var_a = KrateInferenceVariable::from_depth(depth_a);
@@ -230,14 +234,17 @@ impl<'t> Unifier<'t> {
230234
(&Krate::Var(depth), &Krate::Id(id)) |
231235
(&Krate::Id(id), &Krate::Var(depth)) => {
232236
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))
235240
}
236241

237242
(&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+
}
241248
}
242249
};
243250

@@ -341,8 +348,8 @@ impl<'u, 't> OccursCheck<'u, 't> {
341348
Ty::Var(depth) => {
342349
let v = TyInferenceVariable::from_depth(depth - self.binders);
343350
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(_) => {
346353
unreachable!("expected `parameter` to be normalized")
347354
}
348355
};
@@ -361,7 +368,7 @@ impl<'u, 't> OccursCheck<'u, 't> {
361368
self.unifier
362369
.table
363370
.ty_unify
364-
.unify_var_value(v, TyInferenceValue::Unbound(self.universe_index))
371+
.unify_var_value(v, InferenceValue::Unbound(self.universe_index))
365372
.unwrap();
366373
}
367374
}

0 commit comments

Comments
 (0)