1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use crate::{BoundVar, ControlFlow, DebruijnIndex, Interner, Visit, Visitor};
pub trait VisitExt<I: Interner>: Visit<I> {
fn has_free_vars(&self, interner: &I) -> bool {
self.visit_with(
&mut FindFreeVarsVisitor { interner },
DebruijnIndex::INNERMOST,
)
.is_break()
}
}
impl<T, I: Interner> VisitExt<I> for T where T: Visit<I> {}
struct FindFreeVarsVisitor<'i, I: Interner> {
interner: &'i I,
}
impl<'i, I: Interner> Visitor<'i, I> for FindFreeVarsVisitor<'i, I> {
type BreakTy = ();
fn as_dyn(&mut self) -> &mut dyn Visitor<'i, I, BreakTy = Self::BreakTy> {
self
}
fn interner(&self) -> &'i I {
self.interner
}
fn visit_free_var(
&mut self,
_bound_var: BoundVar,
_outer_binder: DebruijnIndex,
) -> ControlFlow<()> {
ControlFlow::BREAK
}
}