Skip to content

Commit

Permalink
refactor shared visitors
Browse files Browse the repository at this point in the history
  • Loading branch information
basil-cow committed Apr 6, 2020
1 parent a6f7fb8 commit 7aab941
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 6 deletions.
5 changes: 2 additions & 3 deletions chalk-ir/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
use crate::cast::{Cast, CastTo};
use crate::fold::shift::Shift;
use crate::fold::{Fold, Folder, Subst, SuperFold};
use crate::visit::{visitors::FindBound, SuperVisit, Visit, VisitResult, Visitor};
use crate::visit::{SuperVisit, Visit, VisitExt, VisitResult, Visitor};
use chalk_derive::{Fold, HasInterner, Visit};
use chalk_engine::fallible::*;
use std::iter;
Expand Down Expand Up @@ -234,8 +234,7 @@ impl<I: Interner> Ty<I> {
/// needs to be shifted across binders. This is a very inefficient
/// check, intended only for debug assertions, because I am lazy.
pub fn needs_shift(&self, interner: &I) -> bool {
self.visit_with(&mut FindBound { interner }, DebruijnIndex::INNERMOST)
.found
self.has_escaping_bound_vars(interner)
}
}

Expand Down
2 changes: 2 additions & 0 deletions chalk-ir/src/visit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ mod binder_impls;
mod boring_impls;
pub mod visitors;

pub use visitors::VisitExt;

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

Expand Down
24 changes: 21 additions & 3 deletions chalk-ir/src/visit/visitors.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
use crate::{BoundVar, DebruijnIndex, Interner, VisitResult, Visitor};
use crate::{BoundVar, DebruijnIndex, Interner, Visit, VisitResult, Visitor};

pub trait VisitExt<I: Interner>: Visit<I> {
fn has_escaping_bound_vars(&self, interner: &I) -> bool {
self.visit_with(
&mut FindFreeVarsVisitor { interner },
DebruijnIndex::INNERMOST,
)
.to_bool()
}
}

impl<T, I: Interner> VisitExt<I> for T where T: Visit<I> {}

#[derive(Clone, Copy, Debug)]
pub struct FindAny {
pub found: bool,
}

impl FindAny {
pub fn to_bool(&self) -> bool {
self.found
}
}

impl VisitResult for FindAny {
fn new() -> Self {
FindAny { found: false }
Expand All @@ -18,11 +36,11 @@ impl VisitResult for FindAny {
}
}

pub struct FindBound<'i, I: Interner> {
pub struct FindFreeVarsVisitor<'i, I: Interner> {
pub interner: &'i I,
}

impl<'i, I: Interner> Visitor<'i, I> for FindBound<'i, I> {
impl<'i, I: Interner> Visitor<'i, I> for FindFreeVarsVisitor<'i, I> {
type Result = FindAny;

fn as_dyn(&mut self) -> &mut dyn Visitor<'i, I, Result = Self::Result> {
Expand Down

0 comments on commit 7aab941

Please sign in to comment.