struct HasEscapingVarsVisitor {
outer_index: DebruijnIndex,
}
Expand description
An “escaping var” is a bound var whose binder is not part of t
. A bound var can be a
bound region or a bound type.
So, for example, consider a type like the following, which has two binders:
for<’a> fn(x: for<’b> fn(&’a isize, &’b isize)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ outer scope ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ inner scope
This type has bound regions ('a
, 'b
), but it does not have escaping regions, because the
binders of both 'a
and 'b
are part of the type itself. However, if we consider the inner
fn type, that type has an escaping region: 'a
.
Note that what I’m calling an “escaping var” is often just called a “free var”. However, we already use the term “free var”. It refers to the regions or types that we use to represent bound regions or type params on a fn definition while we are type checking its body.
To clarify, conceptually there is no particular difference between an “escaping” var and a “free” var. However, there is a big difference in practice. Basically, when “entering” a binding level, one is generally required to do some sort of processing to a bound var, such as replacing it with a fresh/placeholder var, or making an entry in the environment to represent the scope to which it is attached, etc. An escaping var represents a bound var for which this processing has not yet been done.
Fields§
§outer_index: DebruijnIndex
Anything bound by outer_index
or “above” is escaping.
Trait Implementations§
source§impl<I: Interner> TypeVisitor<I> for HasEscapingVarsVisitor
impl<I: Interner> TypeVisitor<I> for HasEscapingVarsVisitor
type Result = ControlFlow<FoundEscapingVars>
fn visit_binder<T: TypeVisitable<I>>( &mut self, t: &Binder<I, T>, ) -> Self::Result
fn visit_ty(&mut self, t: I::Ty) -> Self::Result
fn visit_region(&mut self, r: I::Region) -> Self::Result
fn visit_const(&mut self, ct: I::Const) -> Self::Result
fn visit_predicate(&mut self, predicate: I::Predicate) -> Self::Result
fn visit_clauses(&mut self, clauses: I::Clauses) -> Self::Result
fn visit_error(&mut self, _guar: I::ErrorGuaranteed) -> Self::Result
Auto Trait Implementations§
impl DynSend for HasEscapingVarsVisitor
impl DynSync for HasEscapingVarsVisitor
impl Freeze for HasEscapingVarsVisitor
impl RefUnwindSafe for HasEscapingVarsVisitor
impl Send for HasEscapingVarsVisitor
impl Sync for HasEscapingVarsVisitor
impl Unpin for HasEscapingVarsVisitor
impl UnwindSafe for HasEscapingVarsVisitor
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 4 bytes