Skip to content

Commit b65c184

Browse files
committed
change needs_shift to use visitor
1 parent 8cf6537 commit b65c184

File tree

8 files changed

+185
-54
lines changed

8 files changed

+185
-54
lines changed

chalk-derive/src/lib.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ pub fn derive_visit(item: TokenStream) -> TokenStream {
356356
// Hardcoded interner:
357357
//
358358
// impl Visit<ChalkIr> for Type {
359-
//
359+
//
360360
// }
361361
let arg = attr
362362
.parse_args::<proc_macro2::TokenStream>()
@@ -369,8 +369,8 @@ pub fn derive_visit(item: TokenStream) -> TokenStream {
369369
visitor: &mut dyn Visitor < 'i, #arg, Result = R >,
370370
outer_binder: DebruijnIndex,
371371
) -> R
372-
where
373-
I: 'i
372+
where
373+
I: 'i
374374
{
375375
#body
376376
}
@@ -404,9 +404,9 @@ pub fn derive_visit(item: TokenStream) -> TokenStream {
404404
// }
405405

406406
let mut impl_generics = input.generics.clone();
407-
impl_generics.params.extend(vec![
408-
GenericParam::Type(syn::parse(quote! { _I: Interner }.into()).unwrap()),
409-
]);
407+
impl_generics.params.extend(vec![GenericParam::Type(
408+
syn::parse(quote! { _I: Interner }.into()).unwrap(),
409+
)]);
410410

411411
let mut where_clause = where_clause_ref
412412
.cloned()
@@ -524,4 +524,4 @@ fn derive_visit_body(type_name: &Ident, data: Data) -> proc_macro2::TokenStream
524524
}
525525
Data::Union(..) => panic!("Visit can not be derived for unions"),
526526
}
527-
}
527+
}

chalk-ir/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::cast::{Cast, CastTo};
44
use crate::fold::shift::Shift;
55
use crate::fold::{Fold, Folder, Subst, SuperFold};
6-
use crate::visit::{VisitResult, Visit, SuperVisit, Visitor};
6+
use crate::visit::{visitors::FindBound, SuperVisit, Visit, VisitResult, Visitor};
77
use chalk_derive::{Fold, HasInterner, Visit};
88
use chalk_engine::fallible::*;
99
use std::iter;
@@ -237,8 +237,8 @@ impl<I: Interner> Ty<I> {
237237
/// needs to be shifted across binders. This is a very inefficient
238238
/// check, intended only for debug assertions, because I am lazy.
239239
pub fn needs_shift(&self, interner: &I) -> bool {
240-
let ty = self.clone();
241-
ty != ty.shifted_in(interner)
240+
self.visit_with(&mut FindBound { interner }, DebruijnIndex::INNERMOST)
241+
.found
242242
}
243243
}
244244

chalk-ir/src/visit.rs

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,24 @@ use crate::{
88

99
mod binder_impls;
1010
mod boring_impls;
11+
pub mod visitors;
1112

1213
pub trait VisitResult: Sized {
1314
fn new() -> Self;
1415

1516
fn and_then(self, op: impl FnOnce() -> Self) -> Self;
1617
}
1718

18-
1919
impl VisitResult for () {
2020
fn new() -> () {}
21-
fn and_then(self, op: impl FnOnce() -> () ) -> () {
21+
fn and_then(self, op: impl FnOnce() -> ()) -> () {
2222
op()
2323
}
2424
}
2525

2626
/// A "visitor" recursively folds some term -- that is, some bit of IR,
27-
/// such as a `Goal`, and computes a value as a result.
28-
///
27+
/// such as a `Goal`, and computes a value as a result.
28+
///
2929
///
3030
/// To **apply** a visitor, use the `Visit::visit_with` method, like so
3131
///
@@ -34,7 +34,7 @@ impl VisitResult for () {
3434
/// ```
3535
pub trait Visitor<'i, I: Interner>
3636
where
37-
I: 'i
37+
I: 'i,
3838
{
3939
type Result: VisitResult;
4040

@@ -219,7 +219,9 @@ pub trait Visit<I: Interner>: Debug {
219219
&self,
220220
visitor: &mut dyn Visitor<'i, I, Result = R>,
221221
outer_binder: DebruijnIndex,
222-
) -> R where I: 'i;
222+
) -> R
223+
where
224+
I: 'i;
223225
}
224226

225227
/// For types where "visit" invokes a callback on the `visitor`, the
@@ -230,7 +232,9 @@ pub trait SuperVisit<I: Interner>: Visit<I> {
230232
&self,
231233
visitor: &mut dyn Visitor<'i, I, Result = R>,
232234
outer_binder: DebruijnIndex,
233-
) -> R where I: 'i;
235+
) -> R
236+
where
237+
I: 'i;
234238
}
235239

236240
/// "visiting" a type invokes the `visit_ty` method on the visitor; this
@@ -241,7 +245,10 @@ impl<I: Interner> Visit<I> for Ty<I> {
241245
&self,
242246
visitor: &mut dyn Visitor<'i, I, Result = R>,
243247
outer_binder: DebruijnIndex,
244-
) -> R where I: 'i {
248+
) -> R
249+
where
250+
I: 'i,
251+
{
245252
visitor.visit_ty(self, outer_binder)
246253
}
247254
}
@@ -255,7 +262,10 @@ where
255262
&self,
256263
visitor: &mut dyn Visitor<'i, I, Result = R>,
257264
outer_binder: DebruijnIndex,
258-
) -> R where I: 'i {
265+
) -> R
266+
where
267+
I: 'i,
268+
{
259269
let interner = visitor.interner();
260270
match self.data(interner) {
261271
TyData::BoundVar(bound_var) => {
@@ -280,7 +290,10 @@ impl<I: Interner> Visit<I> for Lifetime<I> {
280290
&self,
281291
visitor: &mut dyn Visitor<'i, I, Result = R>,
282292
outer_binder: DebruijnIndex,
283-
) -> R where I: 'i {
293+
) -> R
294+
where
295+
I: 'i,
296+
{
284297
visitor.visit_lifetime(self, outer_binder)
285298
}
286299
}
@@ -290,7 +303,10 @@ impl<I: Interner> SuperVisit<I> for Lifetime<I> {
290303
&self,
291304
visitor: &mut dyn Visitor<'i, I, Result = R>,
292305
outer_binder: DebruijnIndex,
293-
) -> R where I: 'i {
306+
) -> R
307+
where
308+
I: 'i,
309+
{
294310
let interner = visitor.interner();
295311
match self.data(interner) {
296312
LifetimeData::BoundVar(bound_var) => {
@@ -314,7 +330,10 @@ impl<I: Interner> Visit<I> for Goal<I> {
314330
&self,
315331
visitor: &mut dyn Visitor<'i, I, Result = R>,
316332
outer_binder: DebruijnIndex,
317-
) -> R where I: 'i {
333+
) -> R
334+
where
335+
I: 'i,
336+
{
318337
visitor.visit_goal(self, outer_binder)
319338
}
320339
}
@@ -324,7 +343,10 @@ impl<I: Interner> SuperVisit<I> for Goal<I> {
324343
&self,
325344
visitor: &mut dyn Visitor<'i, I, Result = R>,
326345
outer_binder: DebruijnIndex,
327-
) -> R where I: 'i {
346+
) -> R
347+
where
348+
I: 'i,
349+
{
328350
let interner = visitor.interner();
329351
self.data(interner).visit_with(visitor, outer_binder)
330352
}
@@ -335,7 +357,10 @@ impl<I: Interner> Visit<I> for ProgramClause<I> {
335357
&self,
336358
visitor: &mut dyn Visitor<'i, I, Result = R>,
337359
outer_binder: DebruijnIndex,
338-
) -> R where I: 'i {
360+
) -> R
361+
where
362+
I: 'i,
363+
{
339364
visitor.visit_program_clause(self, outer_binder)
340365
}
341366
}

chalk-ir/src/visit/binder_impls.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ impl<I: Interner> Visit<I> for Fn<I> {
1010
&self,
1111
visitor: &mut dyn Visitor<'i, I, Result = R>,
1212
outer_binder: DebruijnIndex,
13-
) -> R where I: 'i {
13+
) -> R
14+
where
15+
I: 'i,
16+
{
1417
self.parameters
1518
.visit_with(visitor, outer_binder.shifted_in())
1619
}
@@ -24,7 +27,10 @@ where
2427
&self,
2528
visitor: &mut dyn Visitor<'i, I, Result = R>,
2629
outer_binder: DebruijnIndex,
27-
) -> R where I: 'i {
30+
) -> R
31+
where
32+
I: 'i,
33+
{
2834
self.value.visit_with(visitor, outer_binder.shifted_in())
2935
}
3036
}
@@ -38,7 +44,10 @@ where
3844
&self,
3945
visitor: &mut dyn Visitor<'i, I, Result = R>,
4046
outer_binder: DebruijnIndex,
41-
) -> R where I: 'i {
47+
) -> R
48+
where
49+
I: 'i,
50+
{
4251
self.value.visit_with(visitor, outer_binder.shifted_in())
4352
}
4453
}

0 commit comments

Comments
 (0)