Skip to content

Commit 9846bdd

Browse files
authored
Merge pull request #514 from declanvk/issue-511
Refactor ProgramClauseData to remove Implies variant
2 parents 52cddb5 + 50e7362 commit 9846bdd

File tree

11 files changed

+40
-89
lines changed

11 files changed

+40
-89
lines changed

chalk-integration/src/lowering.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1671,7 +1671,7 @@ impl LowerClause for Clause {
16711671
.into_iter()
16721672
.map(
16731673
|implication: chalk_ir::Binders<chalk_ir::ProgramClauseImplication<ChalkIr>>| {
1674-
chalk_ir::ProgramClauseData::ForAll(implication).intern(interner)
1674+
chalk_ir::ProgramClauseData(implication).intern(interner)
16751675
},
16761676
)
16771677
.collect();

chalk-ir/src/cast.rs

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,14 @@ where
199199
I: Interner,
200200
{
201201
fn cast_to(self, interner: &I) -> ProgramClause<I> {
202-
ProgramClauseData::Implies(ProgramClauseImplication {
202+
let implication = ProgramClauseImplication {
203203
consequence: self.cast(interner),
204204
conditions: Goals::new(interner),
205205
priority: ClausePriority::High,
206-
})
207-
.intern(interner)
206+
};
207+
208+
ProgramClauseData(Binders::empty(interner, implication.shifted_in(interner)))
209+
.intern(interner)
208210
}
209211
}
210212

@@ -214,7 +216,7 @@ where
214216
T: HasInterner<Interner = I> + CastTo<DomainGoal<I>>,
215217
{
216218
fn cast_to(self, interner: &I) -> ProgramClause<I> {
217-
ProgramClauseData::ForAll(self.map(|bound| ProgramClauseImplication {
219+
ProgramClauseData(self.map(|bound| ProgramClauseImplication {
218220
consequence: bound.cast(interner),
219221
conditions: Goals::new(interner),
220222
priority: ClausePriority::High,
@@ -223,18 +225,6 @@ where
223225
}
224226
}
225227

226-
impl<I: Interner> CastTo<ProgramClause<I>> for ProgramClauseImplication<I> {
227-
fn cast_to(self, interner: &I) -> ProgramClause<I> {
228-
ProgramClauseData::Implies(self).intern(interner)
229-
}
230-
}
231-
232-
impl<I: Interner> CastTo<ProgramClause<I>> for Binders<ProgramClauseImplication<I>> {
233-
fn cast_to(self, interner: &I) -> ProgramClause<I> {
234-
ProgramClauseData::ForAll(self).intern(interner)
235-
}
236-
}
237-
238228
impl<T, U> CastTo<Option<U>> for Option<T>
239229
where
240230
T: CastTo<U>,

chalk-ir/src/could_match.rs

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,7 @@ where
6868

6969
impl<I: Interner> CouldMatch<DomainGoal<I>> for ProgramClauseData<I> {
7070
fn could_match(&self, interner: &I, other: &DomainGoal<I>) -> bool {
71-
match self {
72-
ProgramClauseData::Implies(implication) => {
73-
implication.consequence.could_match(interner, other)
74-
}
75-
76-
ProgramClauseData::ForAll(clause) => {
77-
clause.value.consequence.could_match(interner, other)
78-
}
79-
}
71+
self.0.value.consequence.could_match(interner, other)
8072
}
8173
}
8274

chalk-ir/src/debug.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -699,10 +699,7 @@ impl<T: HasInterner + Debug> Debug for Binders<T> {
699699

700700
impl<I: Interner> Debug for ProgramClauseData<I> {
701701
fn fmt(&self, fmt: &mut Formatter<'_>) -> Result<(), Error> {
702-
match self {
703-
ProgramClauseData::Implies(pc) => write!(fmt, "{:?}", pc),
704-
ProgramClauseData::ForAll(pc) => write!(fmt, "{:?}", pc),
705-
}
702+
write!(fmt, "{:?}", self.0)
706703
}
707704
}
708705

chalk-ir/src/fold.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ mod boring_impls;
99
pub mod shift;
1010
mod subst;
1111

12+
pub use self::shift::Shift;
1213
pub use self::subst::Subst;
1314

1415
/// A "folder" is a transformer that can be used to make a copy of

chalk-ir/src/fold/boring_impls.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -290,14 +290,7 @@ impl<I: Interner, TI: TargetInterner<I>> SuperFold<I, TI> for ProgramClauseData<
290290
I: 'i,
291291
TI: 'i,
292292
{
293-
match self {
294-
ProgramClauseData::Implies(pci) => Ok(ProgramClauseData::Implies(
295-
pci.fold_with(folder, outer_binder)?,
296-
)),
297-
ProgramClauseData::ForAll(pci) => Ok(ProgramClauseData::ForAll(
298-
pci.fold_with(folder, outer_binder)?,
299-
)),
300-
}
293+
Ok(ProgramClauseData(self.0.fold_with(folder, outer_binder)?))
301294
}
302295
}
303296

chalk-ir/src/lib.rs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1732,10 +1732,7 @@ impl std::ops::BitAnd for ClausePriority {
17321732
}
17331733

17341734
#[derive(Clone, PartialEq, Eq, Hash, Fold, HasInterner, Zip)]
1735-
pub enum ProgramClauseData<I: Interner> {
1736-
Implies(ProgramClauseImplication<I>),
1737-
ForAll(Binders<ProgramClauseImplication<I>>),
1738-
}
1735+
pub struct ProgramClauseData<I: Interner>(pub Binders<ProgramClauseImplication<I>>);
17391736

17401737
impl<I: Interner> ProgramClauseImplication<I> {
17411738
pub fn into_from_env_clause(self, interner: &I) -> ProgramClauseImplication<I> {
@@ -1753,14 +1750,7 @@ impl<I: Interner> ProgramClauseImplication<I> {
17531750

17541751
impl<I: Interner> ProgramClauseData<I> {
17551752
pub fn into_from_env_clause(self, interner: &I) -> ProgramClauseData<I> {
1756-
match self {
1757-
ProgramClauseData::Implies(implication) => {
1758-
ProgramClauseData::Implies(implication.into_from_env_clause(interner))
1759-
}
1760-
ProgramClauseData::ForAll(binders_implication) => ProgramClauseData::ForAll(
1761-
binders_implication.map(|i| i.into_from_env_clause(interner)),
1762-
),
1763-
}
1753+
ProgramClauseData(self.0.map(|i| i.into_from_env_clause(interner)))
17641754
}
17651755

17661756
pub fn intern(self, interner: &I) -> ProgramClause<I> {

chalk-ir/src/visit/boring_impls.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
77
use crate::{
88
AdtId, AssocTypeId, ClausePriority, DebruijnIndex, FloatTy, FnDefId, GenericArg, Goals, ImplId,
9-
IntTy, Interner, Mutability, OpaqueTyId, PlaceholderIndex, ProgramClause, ProgramClauseData,
10-
ProgramClauses, QuantifiedWhereClauses, QuantifierKind, Scalar, Substitution, SuperVisit,
11-
TraitId, UintTy, UniverseIndex, Visit, VisitResult, Visitor,
9+
IntTy, Interner, Mutability, OpaqueTyId, PlaceholderIndex, ProgramClause, ProgramClauses,
10+
QuantifiedWhereClauses, QuantifierKind, Scalar, Substitution, SuperVisit, TraitId, UintTy,
11+
UniverseIndex, Visit, VisitResult, Visitor,
1212
};
1313
use std::{marker::PhantomData, sync::Arc};
1414

@@ -247,10 +247,7 @@ impl<I: Interner> SuperVisit<I> for ProgramClause<I> {
247247
{
248248
let interner = visitor.interner();
249249

250-
match self.data(interner) {
251-
ProgramClauseData::Implies(pci) => pci.visit_with(visitor, outer_binder),
252-
ProgramClauseData::ForAll(pci) => pci.visit_with(visitor, outer_binder),
253-
}
250+
self.data(interner).0.visit_with(visitor, outer_binder)
254251
}
255252
}
256253

chalk-solve/src/clauses/builder.rs

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::marker::PhantomData;
33

44
use crate::cast::{Cast, CastTo};
55
use crate::RustIrDatabase;
6-
use chalk_ir::fold::Fold;
6+
use chalk_ir::fold::{Fold, Shift};
77
use chalk_ir::interner::{HasInterner, Interner};
88
use chalk_ir::*;
99

@@ -77,18 +77,20 @@ impl<'me, I: Interner> ClauseBuilder<'me, I> {
7777
priority,
7878
};
7979

80-
if self.binders.len() == 0 {
81-
self.clauses
82-
.push(ProgramClauseData::Implies(clause).intern(interner));
80+
let clause = if self.binders.is_empty() {
81+
// Compensate for the added empty binder
82+
clause.shifted_in(interner)
8383
} else {
84-
self.clauses.push(
85-
ProgramClauseData::ForAll(Binders::new(
86-
VariableKinds::from(interner, self.binders.clone()),
87-
clause,
88-
))
89-
.intern(interner),
90-
);
91-
}
84+
clause
85+
};
86+
87+
self.clauses.push(
88+
ProgramClauseData(Binders::new(
89+
VariableKinds::from(interner, self.binders.clone()),
90+
clause,
91+
))
92+
.intern(interner),
93+
);
9294

9395
debug!("pushed clause {:?}", self.clauses.last());
9496
}

chalk-solve/src/recursive/solve.rs

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
use super::combine;
22
use super::fulfill::{Fulfill, RecursiveInferenceTable};
33
use super::lib::{Guidance, Minimums, Solution, UCanonicalGoal};
4-
use super::Solver;
54
use crate::clauses::program_clauses_for_goal;
65
use crate::infer::{InferenceTable, ParameterEnaVariableExt};
76
use crate::{solve::truncate, RustIrDatabase};
@@ -13,7 +12,7 @@ use chalk_ir::{debug, debug_heading, info_heading};
1312
use chalk_ir::{
1413
Binders, Canonical, ClausePriority, Constraint, DomainGoal, Environment, Fallible, Floundered,
1514
GenericArg, Goal, GoalData, InEnvironment, NoSolution, ProgramClause, ProgramClauseData,
16-
ProgramClauseImplication, Substitution, UCanonical, UniverseMap, VariableKinds,
15+
ProgramClauseImplication, Substitution, UCanonical, UniverseMap,
1716
};
1817
use std::fmt::Debug;
1918

@@ -144,19 +143,9 @@ trait SolveIterationHelpers<I: Interner>: SolveDatabase<I> {
144143
return (Ok(Solution::Ambig(Guidance::Unknown)), ClausePriority::High);
145144
}
146145

147-
let res = match program_clause.data(self.interner()) {
148-
ProgramClauseData::Implies(implication) => self.solve_via_implication(
149-
canonical_goal,
150-
&Binders::new(
151-
VariableKinds::from(self.interner(), vec![]),
152-
implication.clone(),
153-
),
154-
minimums,
155-
),
156-
ProgramClauseData::ForAll(implication) => {
157-
self.solve_via_implication(canonical_goal, implication, minimums)
158-
}
159-
};
146+
let ProgramClauseData(implication) = program_clause.data(self.interner());
147+
let res = self.solve_via_implication(canonical_goal, implication, minimums);
148+
160149
if let (Ok(solution), priority) = res {
161150
debug!("ok: solution={:?} prio={:?}", solution, priority);
162151
cur_solution = Some(match cur_solution {

0 commit comments

Comments
 (0)