pub struct Binder<T> {
pub params: GenericParams,
pub skip_binder: T,
pub kind: BinderKind,
}Expand description
A value of type T bound by generic parameters. Used in any context where we’re adding generic
parameters that aren’t on the top-level item, e.g. for<'a> clauses (uses RegionBinder for
now), trait methods, GATs (TODO).
Fields§
§params: GenericParams§skip_binder: TNamed this way to highlight accesses to the inner value that might be handling parameters incorrectly. Prefer using helper methods.
kind: BinderKindThe kind of binder this is.
Implementations§
Source§impl Binder<TraitAssocTy>
impl Binder<TraitAssocTy>
pub fn name(&self) -> &TraitItemName
Source§impl Binder<TraitMethod>
impl Binder<TraitMethod>
pub fn name(&self) -> TraitItemName
Source§impl<T> Binder<T>
impl<T> Binder<T>
Sourcepub fn empty(kind: BinderKind, x: T) -> Selfwhere
T: TyVisitable,
pub fn empty(kind: BinderKind, x: T) -> Selfwhere
T: TyVisitable,
Wrap the value in an empty binder, shifting variables appropriately.
pub fn new(kind: BinderKind, params: GenericParams, skip_binder: T) -> Self
Sourcepub fn binds_anything(&self) -> bool
pub fn binds_anything(&self) -> bool
Whether this binder binds any variables.
Sourcepub fn get_if_binds_nothing(&self) -> Option<T>where
T: TyVisitable + Clone,
pub fn get_if_binds_nothing(&self) -> Option<T>where
T: TyVisitable + Clone,
Retreive the contents of this binder if the binder binds no variables. This is the invers
of Binder::empty.
pub fn map<U>(self, f: impl FnOnce(T) -> U) -> Binder<U>
pub fn map_ref<U>(&self, f: impl FnOnce(&T) -> U) -> Binder<U>
Sourcepub fn apply(self, args: &GenericArgs) -> Twhere
T: TyVisitable,
pub fn apply(self, args: &GenericArgs) -> Twhere
T: TyVisitable,
Substitute the provided arguments for the variables bound in this binder and return the substituted inner value.
Source§impl<T: AstVisitable> Binder<Binder<T>>
impl<T: AstVisitable> Binder<Binder<T>>
Source§impl<T> Binder<T>
impl<T> Binder<T>
Sourcefn fmt_split<'a, C>(&'a self, ctx: &'a C) -> (String, String)
fn fmt_split<'a, C>(&'a self, ctx: &'a C) -> (String, String)
Format the parameters and contents of this binder and returns the resulting strings.
Sourcefn fmt_split_with<'a, C>(
&'a self,
ctx: &'a C,
fmt_inner: impl FnOnce(&C::Reborrow<'a>, &T) -> String,
) -> (String, String)where
C: AstFormatter,
fn fmt_split_with<'a, C>(
&'a self,
ctx: &'a C,
fmt_inner: impl FnOnce(&C::Reborrow<'a>, &T) -> String,
) -> (String, String)where
C: AstFormatter,
Format the parameters and contents of this binder and returns the resulting strings.
Trait Implementations§
Source§impl<T: AstVisitable> AstVisitable for Binder<T>
impl<T: AstVisitable> AstVisitable for Binder<T>
Source§fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
fn drive<V: VisitAst>(&self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
fn drive_mut<V: VisitAstMut>(&mut self, v: &mut V) -> ControlFlow<V::Break>
visit_$any
method if it exists, otherwise visit_inner.Source§fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))
self, in pre-order traversal.Source§impl<'de, T> Deserialize<'de> for Binder<T>where
T: Deserialize<'de>,
impl<'de, T> Deserialize<'de> for Binder<T>where
T: Deserialize<'de>,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl<'s, T, V> Drive<'s, V> for Binder<T>where
V: Visitor + Visit<'s, GenericParams> + Visit<'s, T>,
impl<'s, T, V> Drive<'s, V> for Binder<T>where
V: Visitor + Visit<'s, GenericParams> + Visit<'s, T>,
Source§fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner(&'s self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.Source§impl<'s, T, V> DriveMut<'s, V> for Binder<T>where
V: Visitor + VisitMut<'s, GenericParams> + VisitMut<'s, T>,
impl<'s, T, V> DriveMut<'s, V> for Binder<T>where
V: Visitor + VisitMut<'s, GenericParams> + VisitMut<'s, T>,
Source§fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
fn drive_inner_mut(&'s mut self, visitor: &mut V) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self.impl<T: Eq> Eq for Binder<T>
impl<T> StructuralPartialEq for Binder<T>
Auto Trait Implementations§
impl<T> Freeze for Binder<T>where
T: Freeze,
impl<T> RefUnwindSafe for Binder<T>where
T: RefUnwindSafe,
impl<T> Send for Binder<T>where
T: Send,
impl<T> Sync for Binder<T>where
T: Sync,
impl<T> Unpin for Binder<T>where
T: Unpin,
impl<T> UnwindSafe for Binder<T>where
T: UnwindSafe,
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> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.§impl<I, T> ExtractContext<I, ()> for T
impl<I, T> ExtractContext<I, ()> for T
§fn extract_context(self, _original_input: I)
fn extract_context(self, _original_input: I)
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more§impl<I> RecreateContext<I> for I
impl<I> RecreateContext<I> for I
§fn recreate_context(_original_input: I, tail: I) -> I
fn recreate_context(_original_input: I, tail: I) -> I
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn visit_vars(&mut self, v: &mut impl VarsVisitor)
fn visit_vars(&mut self, v: &mut impl VarsVisitor)
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen De Bruijn indices
will count from the outside of self.Source§fn substitute(self, generics: &GenericArgs) -> Self
fn substitute(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
Note: if self is an item that comes from a TraitDecl, you most likely want to use
substitute_with_self.Source§fn substitute_explicits(self, generics: &GenericArgs) -> Self
fn substitute_explicits(self, generics: &GenericArgs) -> Self
Source§fn substitute_with_self(
self,
generics: &GenericArgs,
self_ref: &TraitRefKind,
) -> Self
fn substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Self
TraitRefKind::Self trait ref.Source§fn move_under_binder(self) -> Self
fn move_under_binder(self) -> Self
Source§fn move_under_binders(self, depth: DeBruijnId) -> Self
fn move_under_binders(self, depth: DeBruijnId) -> Self
depth binders.Source§fn move_from_under_binder(self) -> Option<Self>
fn move_from_under_binder(self) -> Option<Self>
Source§fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
fn move_from_under_binders(self, depth: DeBruijnId) -> Option<Self>
depth binders. Returns None if it contains a variable bound in
one of these depth binders.Source§fn visit_db_id<B>(
&mut self,
f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>,
) -> ControlFlow<B>
fn visit_db_id<B>( &mut self, f: impl FnMut(&mut DeBruijnId) -> ControlFlow<B>, ) -> ControlFlow<B>
self, as seen from the outside of self. This means
that any variable bound inside self will be skipped, and all the seen indices will count
from the outside of self.