Skip to content

Commit d0c37db

Browse files
committed
add missing fold methods
1 parent d586ed3 commit d0c37db

File tree

7 files changed

+111
-20
lines changed

7 files changed

+111
-20
lines changed

chalk-ir/src/debug.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@ impl<I: Interner> Debug for Const<I> {
3939
}
4040
}
4141

42+
impl<I: Interner> Debug for ConstEvaluated<I> {
43+
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error> {
44+
write!(fmt, "{:?}", self.interned)
45+
}
46+
}
47+
48+
4249
impl<I: Interner> Debug for Parameter<I> {
4350
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error> {
4451
I::debug_parameter(self, fmt).unwrap_or_else(|| write!(fmt, "{:?}", self.interned))

chalk-ir/src/fold/shift.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,17 @@ impl<'i, I: Interner> Folder<'i, I> for Shifter<'i, I> {
9393
)
9494
}
9595

96+
fn fold_free_var_const(
97+
&mut self,
98+
bound_var: BoundVar,
99+
outer_binder: DebruijnIndex,
100+
) -> Fallible<Const<I>> {
101+
Ok(
102+
ConstData::<I>::BoundVar(self.adjust(bound_var, outer_binder))
103+
.intern(self.interner()),
104+
)
105+
}
106+
96107
fn interner(&self) -> &'i I {
97108
self.interner
98109
}
@@ -153,6 +164,17 @@ impl<'i, I: Interner> Folder<'i, I> for DownShifter<'i, I> {
153164
)
154165
}
155166

167+
fn fold_free_var_const(
168+
&mut self,
169+
bound_var: BoundVar,
170+
outer_binder: DebruijnIndex,
171+
) -> Fallible<Const<I>> {
172+
Ok(
173+
ConstData::<I>::BoundVar(self.adjust(bound_var, outer_binder)?)
174+
.intern(self.interner()),
175+
)
176+
}
177+
156178
fn interner(&self) -> &'i I {
157179
self.interner
158180
}

chalk-ir/src/fold/subst.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,27 @@ impl<'i, I: Interner> Folder<'i, I> for Subst<'_, 'i, I> {
8787
}
8888
}
8989

90+
fn fold_free_var_const(
91+
&mut self,
92+
bound_var: BoundVar,
93+
outer_binder: DebruijnIndex,
94+
) -> Fallible<Const<I>> {
95+
// see comment in `fold_free_var_ty`
96+
97+
if let Some(index) = bound_var.index_if_innermost() {
98+
match self.parameters[index].data(self.interner()) {
99+
ParameterKind::Const(c) => Ok(c.shifted_in_from(self.interner(), outer_binder)),
100+
_ => panic!("mismatched kinds in substitution"),
101+
}
102+
} else {
103+
Ok(bound_var
104+
.shifted_out()
105+
.unwrap()
106+
.shifted_in_from(outer_binder)
107+
.to_const(self.interner()))
108+
}
109+
}
110+
90111
fn interner(&self) -> &'i I {
91112
self.interner
92113
}

chalk-ir/src/lib.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,10 @@ impl BoundVar {
336336
LifetimeData::<I>::BoundVar(self).intern(interner)
337337
}
338338

339+
pub fn to_const<I: Interner>(self, interner: &I) -> Const<I> {
340+
ConstData::<I>::BoundVar(self).intern(interner)
341+
}
342+
339343
/// True if this variable is bound within the `amount` innermost binders.
340344
pub fn bound_within(self, outer_binder: DebruijnIndex) -> bool {
341345
self.debruijn.within(outer_binder)
@@ -653,7 +657,7 @@ impl<I: Interner> ConstData<I> {
653657
}
654658
}
655659

656-
#[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, HasInterner)]
660+
#[derive(Clone, PartialEq, Eq, Hash, PartialOrd, Ord, HasInterner)]
657661
pub struct ConstEvaluated<I: Interner> {
658662
pub interned: I::InternedConstEvaluated,
659663
}
@@ -888,6 +892,10 @@ impl<I: Interner> Parameter<I> {
888892
self.as_ref(interner).lifetime().unwrap()
889893
}
890894

895+
pub fn assert_const_ref(&self, interner: &I) -> &Const<I> {
896+
self.as_ref(interner).constant().unwrap()
897+
}
898+
891899
pub fn as_ref(&self, interner: &I) -> ParameterKind<&Ty<I>, &Lifetime<I>, &Const<I>> {
892900
match self.data(interner) {
893901
ParameterKind::Ty(t) => ParameterKind::Ty(t),
@@ -1972,6 +1980,17 @@ impl<'i, I: Interner> Folder<'i, I> for &SubstFolder<'i, I> {
19721980
Ok(l.shifted_in_from(self.interner(), outer_binder))
19731981
}
19741982

1983+
fn fold_free_var_const(
1984+
&mut self,
1985+
bound_var: BoundVar,
1986+
outer_binder: DebruijnIndex,
1987+
) -> Fallible<Const<I>> {
1988+
assert_eq!(bound_var.debruijn, DebruijnIndex::INNERMOST);
1989+
let c = self.at(bound_var.index);
1990+
let c = c.assert_const_ref(self.interner());
1991+
Ok(c.shifted_in_from(self.interner(), outer_binder))
1992+
}
1993+
19751994
fn interner(&self) -> &'i I {
19761995
self.interner
19771996
}

chalk-parse/src/parser.lalrpop

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ LifetimeId: Identifier = {
390390
};
391391

392392
ConstId: Identifier = {
393-
<l:@L> "#" <s:r"([A-Za-z]|_)([A-Za-z0-9]|_)*"> <r:@R> => Identifier {
393+
<l:@L> "$" <s:r"([A-Za-z]|_)([A-Za-z0-9]|_)*"> <r:@R> => Identifier {
394394
str: intern(s),
395395
span: Span::new(l, r),
396396
}

chalk-solve/src/infer/canonicalize.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,16 @@ where
124124
Ok(universe.to_lifetime(interner))
125125
}
126126

127+
fn fold_free_placeholder_const(
128+
&mut self,
129+
universe: PlaceholderIndex,
130+
_outer_binder: DebruijnIndex,
131+
) -> Fallible<Const<I>> {
132+
let interner = self.interner;
133+
self.max_universe = max(self.max_universe, universe.ui);
134+
Ok(universe.to_const(interner))
135+
}
136+
127137
fn forbid_free_vars(&self) -> bool {
128138
true
129139
}
@@ -190,6 +200,36 @@ where
190200
}
191201
}
192202

203+
fn fold_inference_const(
204+
&mut self,
205+
var: InferenceVar,
206+
outer_binder: DebruijnIndex,
207+
) -> Fallible<Const<I>> {
208+
debug_heading!(
209+
"fold_inference_const(depth={:?}, outer_binder={:?})",
210+
var,
211+
outer_binder
212+
);
213+
let interner = self.interner;
214+
let var = EnaVariable::from(var);
215+
match self.table.probe_const_var(interner, var) {
216+
Some(c) => {
217+
debug!("bound to {:?}", c);
218+
Ok(c.fold_with(self, DebruijnIndex::INNERMOST)?
219+
.shifted_in_from(interner, outer_binder))
220+
}
221+
None => {
222+
let free_var = ParameterKind::Const(self.table.unify.find(var));
223+
let bound_var = BoundVar::new(DebruijnIndex::INNERMOST, self.add(free_var));
224+
debug!("not yet unified: position={:?}", bound_var);
225+
Ok(
226+
ConstData::BoundVar(bound_var.shifted_in_from(outer_binder))
227+
.intern(interner),
228+
)
229+
}
230+
}
231+
}
232+
193233
fn interner(&self) -> &'i I {
194234
self.interner
195235
}

tests/test/misc.rs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -507,21 +507,3 @@ fn non_enumerable_traits_reorder() {
507507
}
508508
}
509509
}
510-
511-
#[test]
512-
fn my_test() {
513-
test! {
514-
program {
515-
struct Foo<#N> {}
516-
struct TyFoo<T> {}
517-
}
518-
519-
goal {
520-
exists<#N> {
521-
Foo<#N> = Foo<45>
522-
}
523-
} yields {
524-
""
525-
}
526-
}
527-
}

0 commit comments

Comments
 (0)