]> git.proxmox.com Git - rustc.git/blame - vendor/chalk-ir-0.55.0/src/visit/visitors.rs
Merge tag 'debian/1.52.1+dfsg1-1_exp2' into proxmox/buster
[rustc.git] / vendor / chalk-ir-0.55.0 / src / visit / visitors.rs
CommitLineData
f035d41b
XL
1//! Visitor helpers
2
5869c6ff 3use crate::{BoundVar, ControlFlow, DebruijnIndex, Interner, Visit, Visitor};
f9f354fc 4
f035d41b 5/// Visitor extensions.
f9f354fc 6pub trait VisitExt<I: Interner>: Visit<I> {
f035d41b 7 /// Check whether there are free (non-bound) variables.
f9f354fc
XL
8 fn has_free_vars(&self, interner: &I) -> bool {
9 self.visit_with(
10 &mut FindFreeVarsVisitor { interner },
11 DebruijnIndex::INNERMOST,
12 )
5869c6ff 13 .is_break()
f9f354fc
XL
14 }
15}
16
17impl<T, I: Interner> VisitExt<I> for T where T: Visit<I> {}
18
f9f354fc
XL
19struct FindFreeVarsVisitor<'i, I: Interner> {
20 interner: &'i I,
21}
22
23impl<'i, I: Interner> Visitor<'i, I> for FindFreeVarsVisitor<'i, I> {
5869c6ff 24 type BreakTy = ();
f9f354fc 25
5869c6ff 26 fn as_dyn(&mut self) -> &mut dyn Visitor<'i, I, BreakTy = Self::BreakTy> {
f9f354fc
XL
27 self
28 }
29
30 fn interner(&self) -> &'i I {
31 self.interner
32 }
33
f035d41b 34 fn visit_free_var(
f9f354fc
XL
35 &mut self,
36 _bound_var: BoundVar,
37 _outer_binder: DebruijnIndex,
5869c6ff
XL
38 ) -> ControlFlow<()> {
39 ControlFlow::BREAK
f9f354fc
XL
40 }
41}