pub enum DeBruijnVar<Id> {
Bound(DeBruijnId, Id),
Free(Id),
}Expand description
Type-level variable.
Variables are bound in groups. Each item has a top-level binding group in its generic_params
field, and then inner binders are possible using the RegionBinder<T> and Binder<T> types.
Each variable is linked to exactly one binder. The Id then identifies the specific variable
among all those bound in that group.
For instance, we have the following:
fn f<'a, 'b>(x: for<'c> fn(&'b u8, &'c u16, for<'d> fn(&'b u32, &'c u64, &'d u128)) -> u64) {}
^^^^^^ ^^ ^ ^ ^^ ^ ^ ^
| inner binder | | inner binder | | |
top-level binder | | | | |
Bound(1, b) | Bound(2, b) | Bound(0, d)
| |
Bound(0, c) Bound(1, c)To make consumption easier for projects that don’t do heavy substitution, a micro-pass at the
end changes the variables bound at the top-level (i.e. in the GenericParams of items) to be
Free. This is an optional pass, we may add a flag to deactivate it. The example above
becomes:
fn f<'a, 'b>(x: for<'c> fn(&'b u8, &'c u16, for<'d> fn(&'b u32, &'c u64, &'d u128)) -> u64) {}
^^^^^^ ^^ ^ ^ ^^ ^ ^ ^
| inner binder | | inner binder | | |
top-level binder | | | | |
Free(b) | Free(b) | Bound(0, d)
| |
Bound(0, c) Bound(1, c)At the moment only region variables can be bound in a non-top-level binder.
Variants§
Bound(DeBruijnId, Id)
A variable attached to the nth binder, counting from the innermost.
Free(Id)
A variable attached to the outermost binder (the one on the item). As explained above, This is not used in charon internals, only as a micro-pass before exporting the crate data.
Implementations§
Source§impl<Id> DeBruijnVar<Id>where
Id: Copy,
impl<Id> DeBruijnVar<Id>where
Id: Copy,
pub fn new_at_zero(id: Id) -> Self
pub fn free(id: Id) -> Self
pub fn bound(index: DeBruijnId, id: Id) -> Self
pub fn incr(&self) -> Self
pub fn decr(&self) -> Self
Sourcepub fn bound_at_depth(&self, depth: DeBruijnId) -> Option<Id>
pub fn bound_at_depth(&self, depth: DeBruijnId) -> Option<Id>
Returns the variable id if it is bound as the given depth.
Sourcepub fn bound_at_depth_mut(&mut self, depth: DeBruijnId) -> Option<&mut Id>
pub fn bound_at_depth_mut(&mut self, depth: DeBruijnId) -> Option<&mut Id>
Returns the variable id if it is bound as the given depth.
Sourcepub fn move_out_from_depth(&self, depth: DeBruijnId) -> Option<Self>
pub fn move_out_from_depth(&self, depth: DeBruijnId) -> Option<Self>
Move the variable out of depth binders. Returns None if the variable is bound in one of
these depth binders.
Sourcepub fn move_under_binders(&self, depth: DeBruijnId) -> Self
pub fn move_under_binders(&self, depth: DeBruijnId) -> Self
Move under depth binders.
Trait Implementations§
Source§impl<T: AstVisitable + Idx> AstVisitable for DeBruijnVar<T>
impl<T: AstVisitable + Idx> AstVisitable for DeBruijnVar<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<Id: Clone> Clone for DeBruijnVar<Id>
impl<Id: Clone> Clone for DeBruijnVar<Id>
Source§fn clone(&self) -> DeBruijnVar<Id>
fn clone(&self) -> DeBruijnVar<Id>
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl<Id: Debug> Debug for DeBruijnVar<Id>
impl<Id: Debug> Debug for DeBruijnVar<Id>
Source§impl<'de, Id> Deserialize<'de> for DeBruijnVar<Id>where
Id: Deserialize<'de>,
impl<'de, Id> Deserialize<'de> for DeBruijnVar<Id>where
Id: 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<Id: Display> Display for DeBruijnVar<Id>
impl<Id: Display> Display for DeBruijnVar<Id>
Source§impl<'s, Id, V> Drive<'s, V> for DeBruijnVar<Id>where
V: Visitor + Visit<'s, DeBruijnId> + Visit<'s, Id>,
impl<'s, Id, V> Drive<'s, V> for DeBruijnVar<Id>where
V: Visitor + Visit<'s, DeBruijnId> + Visit<'s, Id>,
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, Id, V> DriveMut<'s, V> for DeBruijnVar<Id>where
V: Visitor + VisitMut<'s, DeBruijnId> + VisitMut<'s, Id>,
impl<'s, Id, V> DriveMut<'s, V> for DeBruijnVar<Id>where
V: Visitor + VisitMut<'s, DeBruijnId> + VisitMut<'s, Id>,
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.Source§impl From<DeBruijnVar<ConstGenericVarId>> for ConstGeneric
impl From<DeBruijnVar<ConstGenericVarId>> for ConstGeneric
Source§fn from(x: ConstGenericDbVar) -> Self
fn from(x: ConstGenericDbVar) -> Self
Source§impl From<DeBruijnVar<RegionId>> for Region
impl From<DeBruijnVar<RegionId>> for Region
Source§fn from(x: RegionDbVar) -> Self
fn from(x: RegionDbVar) -> Self
Source§impl From<DeBruijnVar<TraitClauseId>> for TraitRefKind
impl From<DeBruijnVar<TraitClauseId>> for TraitRefKind
Source§fn from(x: ClauseDbVar) -> Self
fn from(x: ClauseDbVar) -> Self
Source§impl<Id: Hash> Hash for DeBruijnVar<Id>
impl<Id: Hash> Hash for DeBruijnVar<Id>
Source§impl<Id: Ord> Ord for DeBruijnVar<Id>
impl<Id: Ord> Ord for DeBruijnVar<Id>
Source§fn cmp(&self, other: &DeBruijnVar<Id>) -> Ordering
fn cmp(&self, other: &DeBruijnVar<Id>) -> Ordering
1.21.0 · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
Source§impl<Id: PartialEq> PartialEq for DeBruijnVar<Id>
impl<Id: PartialEq> PartialEq for DeBruijnVar<Id>
Source§impl<Id: PartialOrd> PartialOrd for DeBruijnVar<Id>
impl<Id: PartialOrd> PartialOrd for DeBruijnVar<Id>
Source§impl<Id> Serialize for DeBruijnVar<Id>where
Id: Serialize,
impl<Id> Serialize for DeBruijnVar<Id>where
Id: Serialize,
impl<Id: Copy> Copy for DeBruijnVar<Id>
impl<Id: Eq> Eq for DeBruijnVar<Id>
impl<Id> StructuralPartialEq for DeBruijnVar<Id>
Auto Trait Implementations§
impl<Id> Freeze for DeBruijnVar<Id>where
Id: Freeze,
impl<Id> RefUnwindSafe for DeBruijnVar<Id>where
Id: RefUnwindSafe,
impl<Id> Send for DeBruijnVar<Id>where
Id: Send,
impl<Id> Sync for DeBruijnVar<Id>where
Id: Sync,
impl<Id> Unpin for DeBruijnVar<Id>where
Id: Unpin,
impl<Id> UnwindSafe for DeBruijnVar<Id>where
Id: 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> Comparable<K> for Q
impl<Q, K> Comparable<K> for Q
§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> Indentable for Twhere
T: Display,
impl<T> Indentable for Twhere
T: Display,
§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.