Trait hir_ty::TypeVisitor
pub trait TypeVisitor<I>where
I: Interner,{
type BreakTy;
Show 15 methods
// Required methods
fn as_dyn(&mut self) -> &mut dyn TypeVisitor<I, BreakTy = Self::BreakTy>;
fn interner(&self) -> I;
// Provided methods
fn visit_ty(
&mut self,
ty: &Ty<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn visit_lifetime(
&mut self,
lifetime: &Lifetime<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn visit_const(
&mut self,
constant: &Const<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn visit_program_clause(
&mut self,
clause: &ProgramClause<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn visit_goal(
&mut self,
goal: &Goal<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn visit_domain_goal(
&mut self,
domain_goal: &DomainGoal<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn forbid_free_vars(&self) -> bool { ... }
fn visit_free_var(
&mut self,
bound_var: BoundVar,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn forbid_free_placeholders(&self) -> bool { ... }
fn visit_free_placeholder(
&mut self,
universe: PlaceholderIndex,
_outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn visit_where_clause(
&mut self,
where_clause: &WhereClause<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
fn forbid_inference_vars(&self) -> bool { ... }
fn visit_inference_var(
&mut self,
var: InferenceVar,
_outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy> { ... }
}
Expand description
A “visitor” recursively folds some term – that is, some bit of IR,
such as a Goal
, and computes a value as a result.
To apply a visitor, use the TypeVisitable::visit_with
method, like so
let result = x.visit_with(&mut visitor, 0);
Required Associated Types§
type BreakTy
type BreakTy
The “break type” of the visitor, often ()
. It represents the result
the visitor yields when it stops visiting.
Required Methods§
fn as_dyn(&mut self) -> &mut dyn TypeVisitor<I, BreakTy = Self::BreakTy>
fn as_dyn(&mut self) -> &mut dyn TypeVisitor<I, BreakTy = Self::BreakTy>
Creates a dyn
value from this visitor. Unfortunately, this
must be added manually to each impl of visitor; it permits the
default implements below to create a &mut dyn TypeVisitor
from
Self
without knowing what Self
is (by invoking this
method). Effectively, this limits impls of visitor
to types
for which we are able to create a dyn value (i.e., not [T]
types).
fn interner(&self) -> I
fn interner(&self) -> I
Gets the visitor’s interner.
Provided Methods§
fn visit_ty(
&mut self,
ty: &Ty<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_ty( &mut self, ty: &Ty<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Top-level callback: invoked for each Ty<I>
that is
encountered when visiting. By default, invokes
super_visit_with
, which will in turn invoke the more
specialized visiting methods below, like visit_free_var
.
fn visit_lifetime(
&mut self,
lifetime: &Lifetime<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_lifetime( &mut self, lifetime: &Lifetime<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Top-level callback: invoked for each Lifetime<I>
that is
encountered when visiting. By default, invokes
super_visit_with
, which will in turn invoke the more
specialized visiting methods below, like visit_free_var
.
fn visit_const(
&mut self,
constant: &Const<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_const( &mut self, constant: &Const<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Top-level callback: invoked for each Const<I>
that is
encountered when visiting. By default, invokes
super_visit_with
, which will in turn invoke the more
specialized visiting methods below, like visit_free_var
.
fn visit_program_clause(
&mut self,
clause: &ProgramClause<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_program_clause( &mut self, clause: &ProgramClause<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for every program clause. By default, recursively visits the goals contents.
fn visit_goal(
&mut self,
goal: &Goal<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_goal( &mut self, goal: &Goal<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for every goal. By default, recursively visits the goals contents.
fn visit_domain_goal(
&mut self,
domain_goal: &DomainGoal<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_domain_goal( &mut self, domain_goal: &DomainGoal<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for each domain goal.
fn forbid_free_vars(&self) -> bool
fn forbid_free_vars(&self) -> bool
If overridden to return true, then visiting will panic if a free variable is encountered. This should be done if free type/lifetime/const variables are not expected.
fn visit_free_var(
&mut self,
bound_var: BoundVar,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_free_var( &mut self, bound_var: BoundVar, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for BoundVar
instances that are not bound
within the type being visited over:
fn forbid_free_placeholders(&self) -> bool
fn forbid_free_placeholders(&self) -> bool
If overridden to return true, we will panic when a free placeholder type/lifetime is encountered.
fn visit_free_placeholder(
&mut self,
universe: PlaceholderIndex,
_outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_free_placeholder( &mut self, universe: PlaceholderIndex, _outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for each occurrence of a placeholder type; these are used when we instantiate binders universally.
fn visit_where_clause(
&mut self,
where_clause: &WhereClause<I>,
outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_where_clause( &mut self, where_clause: &WhereClause<I>, outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for each where clause.
fn forbid_inference_vars(&self) -> bool
fn forbid_inference_vars(&self) -> bool
If overridden to return true, inference variables will trigger panics when visited. Used when inference variables are unexpected.
fn visit_inference_var(
&mut self,
var: InferenceVar,
_outer_binder: DebruijnIndex,
) -> ControlFlow<Self::BreakTy>
fn visit_inference_var( &mut self, var: InferenceVar, _outer_binder: DebruijnIndex, ) -> ControlFlow<Self::BreakTy>
Invoked for each occurrence of a inference type; these are used when we instantiate binders universally.