Skip to content

Commit 3cdc628

Browse files
committed
Make chalk-engine depend on chalk-ir, start removing types from Context
1 parent 80c17b8 commit 3cdc628

File tree

13 files changed

+451
-262
lines changed

13 files changed

+451
-262
lines changed

chalk-engine/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ default = []
1616
rustc-hash = { version = "1.1.0" }
1717

1818
chalk-base = { version = "0.10.1-dev", path = "../chalk-base" }
19+
chalk-ir = { version = "0.10.1-dev", path = "../chalk-ir" }

chalk-engine/src/boring_impls.rs

Lines changed: 199 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,199 @@
1+
use crate::{ExClause, FlounderedSubgoal, Literal};
2+
use chalk_base::results::Fallible;
3+
use chalk_ir::interner::{Interner, HasInterner, TargetInterner};
4+
use chalk_ir::fold::{Fold, Folder};
5+
use chalk_ir::visit::{Visit, VisitResult, Visitor};
6+
use chalk_ir::{Canonical, ConstrainedSubst, Constraint, DebruijnIndex, InEnvironment};
7+
use std::fmt::Debug;
8+
9+
impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for ExClause<I> {
10+
type Result = ExClause<TI>;
11+
12+
fn fold_with<'i>(
13+
&self,
14+
folder: &mut dyn Folder<'i, I, TI>,
15+
outer_binder: DebruijnIndex,
16+
) -> Fallible<Self::Result>
17+
where
18+
I: 'i,
19+
TI: 'i,
20+
{
21+
let ExClause {
22+
subst,
23+
ambiguous,
24+
constraints,
25+
subgoals,
26+
delayed_subgoals,
27+
answer_time,
28+
floundered_subgoals,
29+
} = self;
30+
Ok(ExClause {
31+
subst: subst.fold_with(folder, outer_binder)?,
32+
ambiguous: *ambiguous,
33+
constraints: constraints.fold_with(folder, outer_binder)?,
34+
subgoals: subgoals.fold_with(folder, outer_binder)?,
35+
delayed_subgoals: delayed_subgoals.fold_with(folder, outer_binder)?,
36+
answer_time: answer_time.fold_with(folder, outer_binder)?,
37+
floundered_subgoals: floundered_subgoals.fold_with(folder, outer_binder)?,
38+
})
39+
}
40+
}
41+
42+
impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for FlounderedSubgoal<I> {
43+
type Result = FlounderedSubgoal<TI>;
44+
45+
fn fold_with<'i>(
46+
&self,
47+
folder: &mut dyn Folder<'i, I, TI>,
48+
outer_binder: DebruijnIndex,
49+
) -> Fallible<Self::Result>
50+
where
51+
I: 'i,
52+
TI: 'i,
53+
{
54+
let FlounderedSubgoal {
55+
floundered_literal,
56+
floundered_time,
57+
} = self;
58+
Ok(FlounderedSubgoal {
59+
floundered_literal: floundered_literal.fold_with(folder, outer_binder)?,
60+
floundered_time: floundered_time.fold_with(folder, outer_binder)?,
61+
})
62+
}
63+
}
64+
65+
impl<I: Interner, TI: TargetInterner<I>> Fold<I, TI> for Literal<I> {
66+
type Result = Literal<TI>;
67+
68+
fn fold_with<'i>(
69+
&self,
70+
folder: &mut dyn Folder<'i, I, TI>,
71+
outer_binder: DebruijnIndex,
72+
) -> Fallible<Self::Result>
73+
where
74+
I: 'i,
75+
TI: 'i,
76+
{
77+
match self {
78+
Literal::Positive(goal) => Ok(Literal::Positive(goal.fold_with(folder, outer_binder)?)),
79+
Literal::Negative(goal) => Ok(Literal::Negative(goal.fold_with(folder, outer_binder)?)),
80+
}
81+
}
82+
}
83+
84+
impl<I: Interner + Debug> Visit<I> for ExClause<I> {
85+
fn visit_with<'i, R: VisitResult>(
86+
&self,
87+
visitor: &mut dyn Visitor<'i, I, Result = R>,
88+
outer_binder: DebruijnIndex,
89+
) -> R
90+
where
91+
I: 'i,
92+
{
93+
let ExClause {
94+
subst,
95+
ambiguous: _,
96+
constraints,
97+
subgoals,
98+
delayed_subgoals,
99+
answer_time,
100+
floundered_subgoals,
101+
} = self;
102+
103+
R::new()
104+
.and_then(|| subst.visit_with(visitor, outer_binder))
105+
.and_then(|| constraints.visit_with(visitor, outer_binder))
106+
.and_then(|| constraints.visit_with(visitor, outer_binder))
107+
.and_then(|| subgoals.visit_with(visitor, outer_binder))
108+
.and_then(|| delayed_subgoals.visit_with(visitor, outer_binder))
109+
.and_then(|| answer_time.visit_with(visitor, outer_binder))
110+
.and_then(|| floundered_subgoals.visit_with(visitor, outer_binder))
111+
}
112+
}
113+
114+
impl<I: Interner + Debug> Visit<I> for FlounderedSubgoal<I>
115+
where
116+
InEnvironment<Constraint<I>>: Visit<I>,
117+
Canonical<ConstrainedSubst<I>>: Visit<I>,
118+
{
119+
fn visit_with<'i, R: VisitResult>(
120+
&self,
121+
visitor: &mut dyn Visitor<'i, I, Result = R>,
122+
outer_binder: DebruijnIndex,
123+
) -> R
124+
where
125+
I: 'i,
126+
{
127+
let FlounderedSubgoal {
128+
floundered_literal,
129+
floundered_time,
130+
} = self;
131+
132+
R::new()
133+
.and_then(|| floundered_literal.visit_with(visitor, outer_binder))
134+
.and_then(|| floundered_time.visit_with(visitor, outer_binder))
135+
}
136+
}
137+
138+
impl<I: Interner> Visit<I> for Literal<I> {
139+
fn visit_with<'i, R: VisitResult>(
140+
&self,
141+
visitor: &mut dyn Visitor<'i, I, Result = R>,
142+
outer_binder: DebruijnIndex,
143+
) -> R
144+
where
145+
I: 'i,
146+
{
147+
match self {
148+
Literal::Positive(goal) => goal.visit_with(visitor, outer_binder),
149+
Literal::Negative(goal) => goal.visit_with(visitor, outer_binder),
150+
}
151+
}
152+
}
153+
154+
// FIXME: I can't figure out macro visibility rules
155+
macro_rules! copy_fold {
156+
($t:ty) => {
157+
impl<I: Interner, TI: TargetInterner<I>> chalk_ir::fold::Fold<I, TI> for $t {
158+
type Result = Self;
159+
fn fold_with<'i>(
160+
&self,
161+
_folder: &mut dyn (chalk_ir::fold::Folder<'i, I, TI>),
162+
_outer_binder: DebruijnIndex,
163+
) -> chalk_base::results::Fallible<Self::Result>
164+
where
165+
I: 'i,
166+
TI: 'i,
167+
{
168+
Ok(*self)
169+
}
170+
}
171+
};
172+
}
173+
174+
copy_fold!(crate::TableIndex);
175+
copy_fold!(crate::TimeStamp);
176+
177+
macro_rules! const_visit {
178+
($t:ty) => {
179+
impl<I: Interner> chalk_ir::visit::Visit<I> for $t {
180+
fn visit_with<'i, R: VisitResult>(
181+
&self,
182+
_visitor: &mut dyn (chalk_ir::visit::Visitor<'i, I, Result = R>),
183+
_outer_binder: DebruijnIndex,
184+
) -> R
185+
where
186+
I: 'i,
187+
{
188+
R::new()
189+
}
190+
}
191+
};
192+
}
193+
194+
const_visit!(crate::TableIndex);
195+
const_visit!(crate::TimeStamp);
196+
197+
impl<I: Interner> HasInterner for ExClause<I> {
198+
type Interner = I;
199+
}

0 commit comments

Comments
 (0)