Skip to content

Commit 9780653

Browse files
committed
Auto merge of #735 - eggyal:owned-interner, r=jackh726
Use owned copies of Interner rather than refs The [`chalk_ir::interner::Interner`](https://rust-lang.github.io/chalk/chalk_ir/interner/trait.Interner.html) trait has `Copy` as a supertrait. We can therefore use owned copies of `I: Interner` throughout, rather than `&I` references. This simplifies the API, removing lifetime parameters from numerous items which, in turn, should simplify user code.
2 parents 0c779d8 + 7e8dff9 commit 9780653

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+825
-1141
lines changed

chalk-derive/src/lib.rs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -177,14 +177,11 @@ fn derive_any_visit(
177177
s.bound_impl(
178178
quote!(::chalk_ir::visit:: #trait_name <#interner>),
179179
quote! {
180-
fn #method_name <'i, B>(
180+
fn #method_name <B>(
181181
&self,
182-
visitor: &mut dyn ::chalk_ir::visit::Visitor < 'i, #interner, BreakTy = B >,
182+
visitor: &mut dyn ::chalk_ir::visit::Visitor < #interner, BreakTy = B >,
183183
outer_binder: ::chalk_ir::DebruijnIndex,
184-
) -> std::ops::ControlFlow<B>
185-
where
186-
#interner: 'i
187-
{
184+
) -> std::ops::ControlFlow<B> {
188185
match *self {
189186
#body
190187
}
@@ -241,15 +238,12 @@ fn derive_zip(mut s: synstructure::Structure) -> TokenStream {
241238
quote!(::chalk_ir::zip::Zip<#interner>),
242239
quote! {
243240

244-
fn zip_with<'i, Z: ::chalk_ir::zip::Zipper<'i, #interner>>(
241+
fn zip_with<Z: ::chalk_ir::zip::Zipper<#interner>>(
245242
zipper: &mut Z,
246243
variance: ::chalk_ir::Variance,
247244
a: &Self,
248245
b: &Self,
249-
) -> ::chalk_ir::Fallible<()>
250-
where
251-
#interner: 'i,
252-
{
246+
) -> ::chalk_ir::Fallible<()> {
253247
match (a, b) { #body }
254248
}
255249
},
@@ -299,14 +293,11 @@ fn derive_fold(mut s: synstructure::Structure) -> TokenStream {
299293
quote! {
300294
type Result = #result;
301295

302-
fn fold_with<'i, E>(
296+
fn fold_with<E>(
303297
self,
304-
folder: &mut dyn ::chalk_ir::fold::Folder < 'i, #interner, Error = E >,
298+
folder: &mut dyn ::chalk_ir::fold::Folder < #interner, Error = E >,
305299
outer_binder: ::chalk_ir::DebruijnIndex,
306-
) -> ::std::result::Result<Self::Result, E>
307-
where
308-
#interner: 'i,
309-
{
300+
) -> ::std::result::Result<Self::Result, E> {
310301
Ok(match self { #body })
311302
}
312303
},

chalk-engine/src/normalize_deep.rs

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ use chalk_ir::interner::Interner;
44
use chalk_ir::*;
55
use chalk_solve::infer::InferenceTable;
66

7-
pub(crate) struct DeepNormalizer<'table, 'i, I: Interner> {
7+
pub(crate) struct DeepNormalizer<'table, I: Interner> {
88
table: &'table mut InferenceTable<I>,
9-
interner: &'i I,
9+
interner: I,
1010
}
1111

12-
impl<I: Interner> DeepNormalizer<'_, '_, I> {
12+
impl<I: Interner> DeepNormalizer<'_, I> {
1313
/// Given a value `value` with variables in it, replaces those variables
1414
/// with their instantiated values (if any). Uninstantiated variables are
1515
/// left as-is.
@@ -23,7 +23,7 @@ impl<I: Interner> DeepNormalizer<'_, '_, I> {
2323
/// variables.
2424
pub fn normalize_deep<T: Fold<I>>(
2525
table: &mut InferenceTable<I>,
26-
interner: &I,
26+
interner: I,
2727
value: T,
2828
) -> T::Result {
2929
value
@@ -35,13 +35,10 @@ impl<I: Interner> DeepNormalizer<'_, '_, I> {
3535
}
3636
}
3737

38-
impl<'i, I: Interner> Folder<'i, I> for DeepNormalizer<'_, 'i, I>
39-
where
40-
I: 'i,
41-
{
38+
impl<I: Interner> Folder<I> for DeepNormalizer<'_, I> {
4239
type Error = NoSolution;
4340

44-
fn as_dyn(&mut self) -> &mut dyn Folder<'i, I, Error = Self::Error> {
41+
fn as_dyn(&mut self) -> &mut dyn Folder<I, Error = Self::Error> {
4542
self
4643
}
4744

@@ -103,7 +100,7 @@ where
103100
true
104101
}
105102

106-
fn interner(&self) -> &'i I {
103+
fn interner(&self) -> I {
107104
self.interner
108105
}
109106
}
@@ -122,17 +119,17 @@ mod test {
122119
struct TestDatabase;
123120
impl UnificationDatabase<ChalkIr> for TestDatabase {
124121
fn fn_def_variance(&self, _fn_def_id: FnDefId<ChalkIr>) -> Variances<ChalkIr> {
125-
Variances::from_iter(&ChalkIr, [Variance::Invariant; 20].iter().copied())
122+
Variances::from_iter(ChalkIr, [Variance::Invariant; 20].iter().copied())
126123
}
127124

128125
fn adt_variance(&self, _adt_id: AdtId<ChalkIr>) -> Variances<ChalkIr> {
129-
Variances::from_iter(&ChalkIr, [Variance::Invariant; 20].iter().copied())
126+
Variances::from_iter(ChalkIr, [Variance::Invariant; 20].iter().copied())
130127
}
131128
}
132129

133130
#[test]
134131
fn infer() {
135-
let interner = &ChalkIr;
132+
let interner = ChalkIr;
136133
let mut table: InferenceTable<ChalkIr> = InferenceTable::new();
137134
let environment0 = Environment::new(interner);
138135
let a = table.new_variable(U0).to_ty(interner);

chalk-engine/src/slg.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ pub trait ResolventOps<I: Interner> {
9191
fn resolvent_clause(
9292
&mut self,
9393
ops: &dyn UnificationDatabase<I>,
94-
interner: &I,
94+
interner: I,
9595
environment: &Environment<I>,
9696
goal: &DomainGoal<I>,
9797
subst: &Substitution<I>,
@@ -100,7 +100,7 @@ pub trait ResolventOps<I: Interner> {
100100

101101
fn apply_answer_subst(
102102
&mut self,
103-
interner: &I,
103+
interner: I,
104104
unification_database: &dyn UnificationDatabase<I>,
105105
ex_clause: &mut ExClause<I>,
106106
selected_goal: &InEnvironment<Goal<I>>,
@@ -110,23 +110,23 @@ pub trait ResolventOps<I: Interner> {
110110
}
111111

112112
trait SubstitutionExt<I: Interner> {
113-
fn may_invalidate(&self, interner: &I, subst: &Canonical<Substitution<I>>) -> bool;
113+
fn may_invalidate(&self, interner: I, subst: &Canonical<Substitution<I>>) -> bool;
114114
}
115115

116116
impl<I: Interner> SubstitutionExt<I> for Substitution<I> {
117-
fn may_invalidate(&self, interner: &I, subst: &Canonical<Substitution<I>>) -> bool {
117+
fn may_invalidate(&self, interner: I, subst: &Canonical<Substitution<I>>) -> bool {
118118
self.iter(interner)
119119
.zip(subst.value.iter(interner))
120120
.any(|(new, current)| MayInvalidate { interner }.aggregate_generic_args(new, current))
121121
}
122122
}
123123

124124
// This is a struct in case we need to add state at any point like in AntiUnifier
125-
struct MayInvalidate<'i, I> {
126-
interner: &'i I,
125+
struct MayInvalidate<I> {
126+
interner: I,
127127
}
128128

129-
impl<I: Interner> MayInvalidate<'_, I> {
129+
impl<I: Interner> MayInvalidate<I> {
130130
fn aggregate_generic_args(&mut self, new: &GenericArg<I>, current: &GenericArg<I>) -> bool {
131131
let interner = self.interner;
132132
match (new.data(interner), current.data(interner)) {

chalk-engine/src/slg/aggregate.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ impl<I: Interner> AggregateOps<I> for SlgContextOps<'_, I> {
129129
/// u32` and the new answer is `?0 = i32`, then the guidance would
130130
/// become `?0 = ?X` (where `?X` is some fresh variable).
131131
fn merge_into_guidance<I: Interner>(
132-
interner: &I,
132+
interner: I,
133133
root_goal: &Canonical<InEnvironment<Goal<I>>>,
134134
guidance: Canonical<Substitution<I>>,
135135
answer: &Canonical<ConstrainedSubst<I>>,
@@ -184,7 +184,7 @@ fn merge_into_guidance<I: Interner>(
184184
infer.canonicalize(interner, aggr_subst).quantified
185185
}
186186

187-
fn is_trivial<I: Interner>(interner: &I, subst: &Canonical<Substitution<I>>) -> bool {
187+
fn is_trivial<I: Interner>(interner: I, subst: &Canonical<Substitution<I>>) -> bool {
188188
// A subst is trivial if..
189189
subst
190190
.value
@@ -226,13 +226,13 @@ fn is_trivial<I: Interner>(interner: &I, subst: &Canonical<Substitution<I>>) ->
226226
/// inference variables.
227227
///
228228
/// [Anti-unification]: https://en.wikipedia.org/wiki/Anti-unification_(computer_science)
229-
struct AntiUnifier<'infer, 'intern, I: Interner> {
229+
struct AntiUnifier<'infer, I: Interner> {
230230
infer: &'infer mut InferenceTable<I>,
231231
universe: UniverseIndex,
232-
interner: &'intern I,
232+
interner: I,
233233
}
234234

235-
impl<I: Interner> AntiUnifier<'_, '_, I> {
235+
impl<I: Interner> AntiUnifier<'_, I> {
236236
fn aggregate_tys(&mut self, ty0: &Ty<I>, ty1: &Ty<I>) -> Ty<I> {
237237
let interner = self.interner;
238238
match (ty0.kind(interner), ty1.kind(interner)) {
@@ -587,7 +587,7 @@ mod test {
587587
let mut anti_unifier = AntiUnifier {
588588
infer: &mut infer,
589589
universe: UniverseIndex::root(),
590-
interner: &ChalkIr,
590+
interner: ChalkIr,
591591
};
592592

593593
let ty = anti_unifier.aggregate_tys(
@@ -601,7 +601,7 @@ mod test {
601601
#[test]
602602
fn vec_i32_vs_vec_i32() {
603603
use chalk_integration::interner::ChalkIr;
604-
let interner = &ChalkIr;
604+
let interner = ChalkIr;
605605
let mut infer: InferenceTable<ChalkIr> = InferenceTable::new();
606606
let mut anti_unifier = AntiUnifier {
607607
interner,
@@ -620,7 +620,7 @@ mod test {
620620
#[test]
621621
fn vec_x_vs_vec_y() {
622622
use chalk_integration::interner::ChalkIr;
623-
let interner = &ChalkIr;
623+
let interner = ChalkIr;
624624
let mut infer: InferenceTable<ChalkIr> = InferenceTable::new();
625625
let mut anti_unifier = AntiUnifier {
626626
interner,

chalk-engine/src/slg/resolvent.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ impl<I: Interner> ResolventOps<I> for InferenceTable<I> {
5959
fn resolvent_clause(
6060
&mut self,
6161
db: &dyn UnificationDatabase<I>,
62-
interner: &I,
62+
interner: I,
6363
environment: &Environment<I>,
6464
goal: &DomainGoal<I>,
6565
subst: &Substitution<I>,
@@ -214,7 +214,7 @@ impl<I: Interner> ResolventOps<I> for InferenceTable<I> {
214214
#[instrument(level = "debug", skip(self, interner))]
215215
fn apply_answer_subst(
216216
&mut self,
217-
interner: &I,
217+
interner: I,
218218
unification_database: &dyn UnificationDatabase<I>,
219219
ex_clause: &mut ExClause<I>,
220220
selected_goal: &InEnvironment<Goal<I>>,
@@ -276,13 +276,13 @@ struct AnswerSubstitutor<'t, I: Interner> {
276276
outer_binder: DebruijnIndex,
277277

278278
ex_clause: &'t mut ExClause<I>,
279-
interner: &'t I,
279+
interner: I,
280280
unification_database: &'t dyn UnificationDatabase<I>,
281281
}
282282

283283
impl<I: Interner> AnswerSubstitutor<'_, I> {
284284
fn substitute<T: Zip<I>>(
285-
interner: &I,
285+
interner: I,
286286
unification_database: &dyn UnificationDatabase<I>,
287287
table: &mut InferenceTable<I>,
288288
environment: &Environment<I>,
@@ -306,7 +306,7 @@ impl<I: Interner> AnswerSubstitutor<'_, I> {
306306

307307
fn unify_free_answer_var(
308308
&mut self,
309-
interner: &I,
309+
interner: I,
310310
db: &dyn UnificationDatabase<I>,
311311
variance: Variance,
312312
answer_var: BoundVar,
@@ -379,7 +379,7 @@ impl<I: Interner> AnswerSubstitutor<'_, I> {
379379
}
380380
}
381381

382-
impl<'i, I: Interner> Zipper<'i, I> for AnswerSubstitutor<'i, I> {
382+
impl<'i, I: Interner> Zipper<I> for AnswerSubstitutor<'i, I> {
383383
fn zip_tys(&mut self, variance: Variance, answer: &Ty<I>, pending: &Ty<I>) -> Fallible<()> {
384384
let interner = self.interner;
385385

@@ -721,7 +721,7 @@ impl<'i, I: Interner> Zipper<'i, I> for AnswerSubstitutor<'i, I> {
721721
Ok(())
722722
}
723723

724-
fn interner(&self) -> &'i I {
724+
fn interner(&self) -> I {
725725
self.interner
726726
}
727727

chalk-engine/src/strand.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,11 @@ pub(crate) struct SelectedSubgoal {
3737

3838
impl<I: Interner> Fold<I> for Strand<I> {
3939
type Result = Strand<I>;
40-
fn fold_with<'i, E>(
40+
fn fold_with<E>(
4141
self,
42-
folder: &mut dyn Folder<'i, I, Error = E>,
42+
folder: &mut dyn Folder<I, Error = E>,
4343
outer_binder: DebruijnIndex,
44-
) -> Result<Self::Result, E>
45-
where
46-
I: 'i,
47-
{
44+
) -> Result<Self::Result, E> {
4845
Ok(Strand {
4946
ex_clause: self.ex_clause.fold_with(folder, outer_binder)?,
5047
last_pursued_time: self.last_pursued_time,

chalk-integration/src/db.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -173,8 +173,8 @@ impl RustIrDatabase<ChalkIr> for ChalkDatabase {
173173
chalk_solve::program_clauses_for_env(self, environment)
174174
}
175175

176-
fn interner(&self) -> &ChalkIr {
177-
&ChalkIr
176+
fn interner(&self) -> ChalkIr {
177+
ChalkIr
178178
}
179179

180180
fn is_object_safe(&self, trait_id: TraitId<ChalkIr>) -> bool {

0 commit comments

Comments
 (0)