pub enum DeBruijnVar<Id> {
Bound(DeBruijnId, Id),
Free(Id),
}Expand description
Type-level variable.
Variables are bound in binders, which each bind a set of variables. The DeBruijnId identifies
the binder (counting outward), and the Id identifies the variable among all those bound at
that level.
There are two kinds of binders: RegionBinders bind only regions, and occur whenever there can
be a for<...> in Rust, e.g. function pointers types; Binders can bind any type-level
variable (types, const, and trait clauses), and are used for dyn Trait types as well as trait
methods. Each item also works as a binder, using its generic_params as parameters.
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 | | |
item 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, --unbind-item-vars
changes the variables bound at the top-level (i.e. in the GenericParams of items) to be
Free. 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)Variants§
Bound(DeBruijnId, Id)
A variable attached to the nth binder, counting from the innermost.
Free(Id)
A variable not attached to a particular binder. Can be used for various purposes which
manipulating types, e.g. as inference variables or placeholders. If --unbind-item-vars is
set, we use Free variables to refer to the item binders; Free variables should not
otherwise be found in the output of running charon.
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 drive_two<V: ZipAst>(&self, other: &Self, v: &mut V) -> ControlFlow<V::Break>
fn drive_two<V: ZipAst>(&self, other: &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))where
Self: Sized,
fn dyn_visit<T: AstVisitable>(&self, f: impl FnMut(&T))where
Self: Sized,
self, in pre-order traversal.Source§fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
fn dyn_visit_mut<T: AstVisitable>(&mut self, f: impl FnMut(&mut T))where
Self: Sized,
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 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl<Id: Copy> Copy for DeBruijnVar<Id>
Source§impl<Id: Debug> Debug for DeBruijnVar<Id>
impl<Id: Debug> Debug for DeBruijnVar<Id>
Source§impl<'de, Id, __State: ?Sized> DeserializeState<'de, __State> for DeBruijnVar<Id>where
DeBruijnId: Deserialize<'de>,
Id: DeserializeState<'de, __State>,
impl<'de, Id, __State: ?Sized> DeserializeState<'de, __State> for DeBruijnVar<Id>where
DeBruijnId: Deserialize<'de>,
Id: DeserializeState<'de, __State>,
fn deserialize_state<__D>(
__state: &__State,
__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<'s, Id, V> DriveTwo<'s, V> for DeBruijnVar<Id>
impl<'s, Id, V> DriveTwo<'s, V> for DeBruijnVar<Id>
Source§fn drive_two_inner(
&'s self,
other: &'s Self,
visitor: &mut V,
) -> ControlFlow<V::Break>
fn drive_two_inner( &'s self, other: &'s Self, visitor: &mut V, ) -> ControlFlow<V::Break>
v.visit() on the immediate contents of self and other, if they correspond. If
the values don’t match up, this returns Break(Default::default()).impl<Id: Eq> Eq for DeBruijnVar<Id>
Source§impl From<DeBruijnVar<ConstGenericVarId>> for ConstantExprKind
impl From<DeBruijnVar<ConstGenericVarId>> for ConstantExprKind
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 ClauseReplacement
impl From<DeBruijnVar<TraitClauseId>> for ClauseReplacement
Source§fn from(var: ClauseDbVar) -> Self
fn from(var: 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 (const: unstable) · Source§fn max(self, other: Self) -> Selfwhere
Self: Sized,
fn max(self, other: Self) -> Selfwhere
Self: Sized,
1.21.0 (const: unstable) · Source§fn min(self, other: Self) -> Selfwhere
Self: Sized,
fn min(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, __State: ?Sized> SerializeState<__State> for DeBruijnVar<Id>where
DeBruijnId: Serialize,
Id: SerializeState<__State>,
impl<Id, __State: ?Sized> SerializeState<__State> for DeBruijnVar<Id>where
DeBruijnId: Serialize,
Id: SerializeState<__State>,
fn serialize_state<__S>(
&self,
__state: &__State,
__serializer: __S,
) -> Result<__S::Ok, __S::Error>where
__S: Serializer,
impl<Id: PartialEq> 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> UnsafeUnpin for DeBruijnVar<Id>where
Id: UnsafeUnpin,
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<T> Dedup for T
§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<T> HashConsable for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> 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 moreimpl<T> Mappable for T
impl<N> NodeTrait for N
Source§impl<T> TyVisitable for Twhere
T: AstVisitable,
impl<T> TyVisitable for Twhere
T: AstVisitable,
Source§fn type_info(&self) -> TypeInfo
fn type_info(&self) -> TypeInfo
TypeInfo.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 must use
substitute_with_self or substitute_inner_binder, otherwise you’ll get panics.Source§fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
fn substitute_inner_binder(self, generics: &GenericArgs) -> Self
self by replacing them with the provided values.
This is appropriate when substituting an inner binder.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::SelfId trait ref.Source§fn substitute_with_tref(self, tref: &TraitRef) -> Self
fn substitute_with_tref(self, tref: &TraitRef) -> Self
TraitRefKind::SelfId trait ref.Source§fn try_substitute_with_tref(
self,
tref: &TraitRef,
) -> Result<Self, GenericsMismatch>
fn try_substitute_with_tref( self, tref: &TraitRef, ) -> Result<Self, GenericsMismatch>
TraitRefKind::SelfId trait ref.fn try_substitute( self, generics: &GenericArgs, ) -> Result<Self, GenericsMismatch>
fn try_substitute_with_self( self, generics: &GenericArgs, self_ref: &TraitRefKind, ) -> Result<Self, GenericsMismatch>
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.Source§fn has_escaping_region_var(&self) -> bool
fn has_escaping_region_var(&self) -> bool
Source§fn collect_regions(&self) -> SeqHashSet<Region>
fn collect_regions(&self) -> SeqHashSet<Region>
self.