pub enum Res<Id = HirId> {
Def(DefKind, DefId),
PrimTy(PrimTy),
SelfTyParam {
trait_: DefId,
},
SelfTyAlias {
alias_to: DefId,
forbid_generic: bool,
is_trait_impl: bool,
},
SelfCtor(DefId),
Local(Id),
ToolMod,
NonMacroAttr(NonMacroAttrKind),
Err,
}Expand description
The resolution of a path or export.
For every path or identifier in Rust, the compiler must determine
what the path refers to. This process is called name resolution,
and Res is the primary result of name resolution.
For example, everything prefixed with /* Res */ in this example has
an associated Res:
fn str_to_string(s: & /* Res */ str) -> /* Res */ String {
/* Res */ String::from(/* Res */ s)
}
/* Res */ str_to_string("hello");The associated Ress will be:
strwill resolve toRes::PrimTy;Stringwill resolve toRes::Def, and theReswill include theDefIdforStringas defined in the standard library;String::fromwill also resolve toRes::Def, with theDefIdpointing toString::from;swill resolve toRes::Local;- the call to
str_to_stringwill resolve toRes::Def, with theDefIdpointing to the definition ofstr_to_stringin the current crate.
Variants§
Def(DefKind, DefId)
Definition having a unique ID (DefId), corresponds to something defined in user code.
Not bound to a specific namespace.
PrimTy(PrimTy)
A primitive type such as i32 or str.
Belongs to the type namespace.
SelfTyParam
The Self type, as used within a trait.
Belongs to the type namespace.
See the examples on Res::SelfTyAlias for details.
SelfTyAlias
Fields
alias_to: DefIdThe item introducing the Self type alias. Can be used in the type_of query
to get the underlying type.
forbid_generic: boolWhether the Self type is disallowed from mentioning generics (i.e. when used in an
anonymous constant).
HACK(min_const_generics): self types also have an optional requirement to not
mention any generic parameters to allow the following with min_const_generics:
impl Foo { fn test() -> [u8; std::mem::size_of::<Self>()] { todo!() } }
struct Bar([u8; baz::<Self>()]);
const fn baz<T>() -> usize { 10 }We do however allow Self in repeat expression even if it is generic to not break code
which already works on stable while causing the const_evaluatable_unchecked future
compat lint:
fn foo<T>() {
let _bar = [1_u8; std::mem::size_of::<*mut T>()];
}The Self type, as used somewhere other than within a trait.
Belongs to the type namespace.
Examples:
struct Bar(Box<Self>); // SelfTyAlias
trait Foo {
fn foo() -> Box<Self>; // SelfTyParam
}
impl Bar {
fn blah() {
let _: Self; // SelfTyAlias
}
}
impl Foo for Bar {
fn foo() -> Box<Self> { // SelfTyAlias
let _: Self; // SelfTyAlias
todo!()
}
}See also Res::SelfCtor.
SelfCtor(DefId)
The Self constructor, along with the DefId
of the impl it is associated with.
Belongs to the value namespace.
See also Res::SelfTyParam and Res::SelfTyAlias.
Local(Id)
A local variable or function parameter.
Belongs to the value namespace.
ToolMod
A tool attribute module; e.g., the rustfmt in #[rustfmt::skip].
Belongs to the type namespace.
NonMacroAttr(NonMacroAttrKind)
An attribute that is not implemented via macro.
E.g., #[inline] and #[rustfmt::skip], which are essentially directives,
as opposed to #[test], which is a builtin macro.
Belongs to the macro namespace.
Err
Name resolution failed. We use a dummy Res variant so later phases
of the compiler won’t crash and can instead report more errors.
Not bound to a specific namespace.
Implementations§
source§impl<Id> Res<Id>
impl<Id> Res<Id>
sourcepub fn def_id(&self) -> DefIdwhere
Id: Debug,
pub fn def_id(&self) -> DefIdwhere
Id: Debug,
Return the DefId of this Def if it has an ID, else panic.
sourcepub fn opt_def_id(&self) -> Option<DefId>
pub fn opt_def_id(&self) -> Option<DefId>
Return Some(..) with the DefId of this Res if it has a ID, else None.
sourcepub fn mod_def_id(&self) -> Option<DefId>
pub fn mod_def_id(&self) -> Option<DefId>
Return the DefId of this Res if it represents a module.
sourcepub fn descr(&self) -> &'static str
pub fn descr(&self) -> &'static str
A human readable name for the res kind (“function”, “module”, etc.).
pub fn map_id<R>(self, map: impl FnMut(Id) -> R) -> Res<R>
pub fn apply_id<R, E>( self, map: impl FnMut(Id) -> Result<R, E> ) -> Result<Res<R>, E>
pub fn expect_non_local<OtherId>(self) -> Res<OtherId>
pub fn macro_kind(self) -> Option<MacroKind>
sourcepub fn matches_ns(&self, ns: Namespace) -> bool
pub fn matches_ns(&self, ns: Namespace) -> bool
Always returns true if self is Res::Err
sourcepub fn expected_in_tuple_struct_pat(&self) -> bool
pub fn expected_in_tuple_struct_pat(&self) -> bool
Returns whether such a resolved path can occur in a tuple struct/variant pattern
sourcepub fn expected_in_unit_struct_pat(&self) -> bool
pub fn expected_in_unit_struct_pat(&self) -> bool
Returns whether such a resolved path can occur in a unit struct/variant pattern
Trait Implementations§
source§impl<Id, __CTX> HashStable<__CTX> for Res<Id>where
__CTX: HashStableContext,
Id: HashStable<__CTX>,
impl<Id, __CTX> HashStable<__CTX> for Res<Id>where
__CTX: HashStableContext,
Id: HashStable<__CTX>,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
source§impl<Id: PartialEq> PartialEq for Res<Id>
impl<Id: PartialEq> PartialEq for Res<Id>
impl<Id: Copy> Copy for Res<Id>
impl<Id: Eq> Eq for Res<Id>
impl<Id> StructuralPartialEq for Res<Id>
Auto Trait Implementations§
impl<Id> DynSend for Res<Id>where
Id: DynSend,
impl<Id> DynSync for Res<Id>where
Id: DynSync,
impl<Id> Freeze for Res<Id>where
Id: Freeze,
impl<Id> RefUnwindSafe for Res<Id>where
Id: RefUnwindSafe,
impl<Id> Send for Res<Id>where
Id: Send,
impl<Id> Sync for Res<Id>where
Id: Sync,
impl<Id> Unpin for Res<Id>where
Id: Unpin,
impl<Id> UnwindSafe for Res<Id>where
Id: UnwindSafe,
Blanket Implementations§
source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut T
fn allocate_from_iter<'a>( arena: &'a Arena<'tcx>, iter: impl IntoIterator<Item = T> ) -> &'a mut [T]
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<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.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>
§impl<T> Pointable for T
impl<T> Pointable for 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: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.