1use std::array::IntoIter;
2use std::borrow::Cow;
3use std::fmt::Debug;
4
5use rustc_ast as ast;
6use rustc_ast::NodeId;
7use rustc_error_messages::{DiagArgValue, IntoDiagArg};
8use rustc_hir_id::HirId;
9use rustc_macros::{Decodable, Encodable, StableHash};
10use rustc_span::Symbol;
11use rustc_span::def_id::DefId;
12use rustc_span::hygiene::MacroKind;
13
14use crate as hir;
15use crate::definitions::DefPathData;
16
17#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CtorOf { }
#[automatically_derived]
impl ::core::clone::Clone for CtorOf {
#[inline]
fn clone(&self) -> CtorOf { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CtorOf { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CtorOf { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CtorOf {
#[inline]
fn eq(&self, other: &CtorOf) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CtorOf { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CtorOf {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CtorOf::Struct => { 0usize }
CtorOf::Variant => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CtorOf {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CtorOf::Struct }
1usize => { CtorOf::Variant }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CtorOf`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for CtorOf {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for CtorOf {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
CtorOf::Struct => "Struct",
CtorOf::Variant => "Variant",
})
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for CtorOf {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { CtorOf::Struct => {} CtorOf::Variant => {} }
}
}
};StableHash)]
19pub enum CtorOf {
20 Struct,
22 Variant,
24}
25
26#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for CtorKind { }
#[automatically_derived]
impl ::core::clone::Clone for CtorKind {
#[inline]
fn clone(&self) -> CtorKind { *self }
}Clone, #[automatically_derived]
impl ::core::marker::Copy for CtorKind { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for CtorKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for CtorKind {
#[inline]
fn eq(&self, other: &CtorKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for CtorKind { }Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for CtorKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
CtorKind::Fn => { 0usize }
CtorKind::Const => { 1usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for CtorKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { CtorKind::Fn }
1usize => { CtorKind::Const }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `CtorKind`, expected 0..2, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for CtorKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for CtorKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self { CtorKind::Fn => "Fn", CtorKind::Const => "Const", })
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for CtorKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self { CtorKind::Fn => {} CtorKind::Const => {} }
}
}
};StableHash)]
28pub enum CtorKind {
29 Fn,
31 Const,
33}
34
35#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for MacroKinds { }
#[automatically_derived]
impl ::core::clone::Clone for MacroKinds {
#[inline]
fn clone(&self) -> MacroKinds {
let _: ::core::clone::AssertParamIsClone<u8>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for MacroKinds { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for MacroKinds { }
#[automatically_derived]
impl ::core::cmp::PartialEq for MacroKinds {
#[inline]
fn eq(&self, other: &MacroKinds) -> bool { self.0 == other.0 }
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for MacroKinds {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<u8>;
}
}Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for MacroKinds {
#[inline]
fn partial_cmp(&self, other: &MacroKinds)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for MacroKinds {
#[inline]
fn cmp(&self, other: &MacroKinds) -> ::core::cmp::Ordering {
::core::cmp::Ord::cmp(&self.0, &other.0)
}
}Ord, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for MacroKinds {
fn encode(&self, __encoder: &mut __E) {
let MacroKinds(ref __binding_0) = *self;
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for MacroKinds {
fn decode(__decoder: &mut __D) -> Self {
MacroKinds(::rustc_serialize::Decodable::decode(__decoder))
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for MacroKinds {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for MacroKinds {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_tuple_field1_finish(f, "MacroKinds",
&&self.0)
}
}Debug)]
37#[derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for MacroKinds {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
MacroKinds(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
38pub struct MacroKinds(u8);
39impl MacroKinds {
#[allow(deprecated, non_upper_case_globals,)]
pub const BANG: Self = Self::from_bits_retain(1 << 0);
#[allow(deprecated, non_upper_case_globals,)]
pub const ATTR: Self = Self::from_bits_retain(1 << 1);
#[allow(deprecated, non_upper_case_globals,)]
pub const DERIVE: Self = Self::from_bits_retain(1 << 2);
}
impl ::bitflags::Flags for MacroKinds {
const FLAGS: &'static [::bitflags::Flag<MacroKinds>] =
&[{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("BANG", MacroKinds::BANG)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("ATTR", MacroKinds::ATTR)
},
{
#[allow(deprecated, non_upper_case_globals,)]
::bitflags::Flag::new("DERIVE", MacroKinds::DERIVE)
}];
type Bits = u8;
fn bits(&self) -> u8 { MacroKinds::bits(self) }
fn from_bits_retain(bits: u8) -> MacroKinds {
MacroKinds::from_bits_retain(bits)
}
}
#[allow(dead_code, deprecated, unused_doc_comments, unused_attributes,
unused_mut, unused_imports, non_upper_case_globals, clippy ::
assign_op_pattern, clippy :: iter_without_into_iter,)]
const _: () =
{
#[allow(dead_code, deprecated, unused_attributes)]
impl MacroKinds {
#[inline]
pub const fn empty() -> Self {
Self(<u8 as ::bitflags::Bits>::EMPTY)
}
#[inline]
pub const fn all() -> Self {
let mut truncated = <u8 as ::bitflags::Bits>::EMPTY;
let mut i = 0;
{
{
let flag =
<MacroKinds as ::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<MacroKinds as ::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
{
{
let flag =
<MacroKinds as ::bitflags::Flags>::FLAGS[i].value().bits();
truncated = truncated | flag;
i += 1;
}
};
let _ = i;
Self(truncated)
}
#[inline]
pub const fn bits(&self) -> u8 { self.0 }
#[inline]
pub const fn from_bits(bits: u8)
-> ::bitflags::__private::core::option::Option<Self> {
let truncated = Self::from_bits_truncate(bits).0;
if truncated == bits {
::bitflags::__private::core::option::Option::Some(Self(bits))
} else { ::bitflags::__private::core::option::Option::None }
}
#[inline]
pub const fn from_bits_truncate(bits: u8) -> Self {
Self(bits & Self::all().0)
}
#[inline]
pub const fn from_bits_retain(bits: u8) -> Self { Self(bits) }
#[inline]
pub fn from_name(name: &str)
-> ::bitflags::__private::core::option::Option<Self> {
{
if name == "BANG" {
return ::bitflags::__private::core::option::Option::Some(Self(MacroKinds::BANG.bits()));
}
};
;
{
if name == "ATTR" {
return ::bitflags::__private::core::option::Option::Some(Self(MacroKinds::ATTR.bits()));
}
};
;
{
if name == "DERIVE" {
return ::bitflags::__private::core::option::Option::Some(Self(MacroKinds::DERIVE.bits()));
}
};
;
let _ = name;
::bitflags::__private::core::option::Option::None
}
#[inline]
pub const fn is_empty(&self) -> bool {
self.0 == <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn is_all(&self) -> bool {
Self::all().0 | self.0 == self.0
}
#[inline]
pub const fn intersects(&self, other: Self) -> bool {
self.0 & other.0 != <u8 as ::bitflags::Bits>::EMPTY
}
#[inline]
pub const fn contains(&self, other: Self) -> bool {
self.0 & other.0 == other.0
}
#[inline]
pub fn insert(&mut self, other: Self) {
*self = Self(self.0).union(other);
}
#[inline]
pub fn remove(&mut self, other: Self) {
*self = Self(self.0).difference(other);
}
#[inline]
pub fn toggle(&mut self, other: Self) {
*self = Self(self.0).symmetric_difference(other);
}
#[inline]
pub fn set(&mut self, other: Self, value: bool) {
if value { self.insert(other); } else { self.remove(other); }
}
#[inline]
#[must_use]
pub const fn intersection(self, other: Self) -> Self {
Self(self.0 & other.0)
}
#[inline]
#[must_use]
pub const fn union(self, other: Self) -> Self {
Self(self.0 | other.0)
}
#[inline]
#[must_use]
pub const fn difference(self, other: Self) -> Self {
Self(self.0 & !other.0)
}
#[inline]
#[must_use]
pub const fn symmetric_difference(self, other: Self) -> Self {
Self(self.0 ^ other.0)
}
#[inline]
#[must_use]
pub const fn complement(self) -> Self {
Self::from_bits_truncate(!self.0)
}
}
impl ::bitflags::__private::core::fmt::Binary for MacroKinds {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Binary::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::Octal for MacroKinds {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::Octal::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::LowerHex for MacroKinds {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::LowerHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::fmt::UpperHex for MacroKinds {
fn fmt(&self, f: &mut ::bitflags::__private::core::fmt::Formatter)
-> ::bitflags::__private::core::fmt::Result {
let inner = self.0;
::bitflags::__private::core::fmt::UpperHex::fmt(&inner, f)
}
}
impl ::bitflags::__private::core::ops::BitOr for MacroKinds {
type Output = Self;
#[inline]
fn bitor(self, other: MacroKinds) -> Self { self.union(other) }
}
impl ::bitflags::__private::core::ops::BitOrAssign for MacroKinds {
#[inline]
fn bitor_assign(&mut self, other: Self) { self.insert(other); }
}
impl ::bitflags::__private::core::ops::BitXor for MacroKinds {
type Output = Self;
#[inline]
fn bitxor(self, other: Self) -> Self {
self.symmetric_difference(other)
}
}
impl ::bitflags::__private::core::ops::BitXorAssign for MacroKinds {
#[inline]
fn bitxor_assign(&mut self, other: Self) { self.toggle(other); }
}
impl ::bitflags::__private::core::ops::BitAnd for MacroKinds {
type Output = Self;
#[inline]
fn bitand(self, other: Self) -> Self { self.intersection(other) }
}
impl ::bitflags::__private::core::ops::BitAndAssign for MacroKinds {
#[inline]
fn bitand_assign(&mut self, other: Self) {
*self =
Self::from_bits_retain(self.bits()).intersection(other);
}
}
impl ::bitflags::__private::core::ops::Sub for MacroKinds {
type Output = Self;
#[inline]
fn sub(self, other: Self) -> Self { self.difference(other) }
}
impl ::bitflags::__private::core::ops::SubAssign for MacroKinds {
#[inline]
fn sub_assign(&mut self, other: Self) { self.remove(other); }
}
impl ::bitflags::__private::core::ops::Not for MacroKinds {
type Output = Self;
#[inline]
fn not(self) -> Self { self.complement() }
}
impl ::bitflags::__private::core::iter::Extend<MacroKinds> for
MacroKinds {
fn extend<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(&mut self, iterator: T) {
for item in iterator { self.insert(item) }
}
}
impl ::bitflags::__private::core::iter::FromIterator<MacroKinds> for
MacroKinds {
fn from_iter<T: ::bitflags::__private::core::iter::IntoIterator<Item
= Self>>(iterator: T) -> Self {
use ::bitflags::__private::core::iter::Extend;
let mut result = Self::empty();
result.extend(iterator);
result
}
}
impl MacroKinds {
#[inline]
pub const fn iter(&self) -> ::bitflags::iter::Iter<MacroKinds> {
::bitflags::iter::Iter::__private_const_new(<MacroKinds as
::bitflags::Flags>::FLAGS,
MacroKinds::from_bits_retain(self.bits()),
MacroKinds::from_bits_retain(self.bits()))
}
#[inline]
pub const fn iter_names(&self)
-> ::bitflags::iter::IterNames<MacroKinds> {
::bitflags::iter::IterNames::__private_const_new(<MacroKinds
as ::bitflags::Flags>::FLAGS,
MacroKinds::from_bits_retain(self.bits()),
MacroKinds::from_bits_retain(self.bits()))
}
}
impl ::bitflags::__private::core::iter::IntoIterator for MacroKinds {
type Item = MacroKinds;
type IntoIter = ::bitflags::iter::Iter<MacroKinds>;
fn into_iter(self) -> Self::IntoIter { self.iter() }
}
};bitflags::bitflags! {
40 impl MacroKinds: u8 {
41 const BANG = 1 << 0;
42 const ATTR = 1 << 1;
43 const DERIVE = 1 << 2;
44 }
45}
46
47impl From<MacroKind> for MacroKinds {
48 fn from(kind: MacroKind) -> Self {
49 match kind {
50 MacroKind::Bang => Self::BANG,
51 MacroKind::Attr => Self::ATTR,
52 MacroKind::Derive => Self::DERIVE,
53 }
54 }
55}
56
57impl MacroKinds {
58 pub fn descr(self) -> &'static str {
62 match self {
63 Self::BANG => "macro",
65 Self::ATTR => "attribute macro",
66 Self::DERIVE => "derive macro",
67 _ if self == (Self::ATTR | Self::BANG) => "attribute/function macro",
68 _ if self == (Self::DERIVE | Self::BANG) => "derive/function macro",
69 _ if self == (Self::ATTR | Self::DERIVE) => "attribute/derive macro",
70 _ if self.is_all() => "attribute/derive/function macro",
71 _ if self.is_empty() => "useless macro",
72 _ => ::core::panicking::panic("internal error: entered unreachable code")unreachable!(),
73 }
74 }
75
76 pub fn article(self) -> &'static str {
78 if self.contains(Self::ATTR) { "an" } else { "a" }
79 }
80}
81
82#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for NonMacroAttrKind { }
#[automatically_derived]
impl ::core::clone::Clone for NonMacroAttrKind {
#[inline]
fn clone(&self) -> NonMacroAttrKind {
let _: ::core::clone::AssertParamIsClone<Symbol>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for NonMacroAttrKind { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for NonMacroAttrKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for NonMacroAttrKind {
#[inline]
fn eq(&self, other: &NonMacroAttrKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(NonMacroAttrKind::Builtin(__self_0),
NonMacroAttrKind::Builtin(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for NonMacroAttrKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<Symbol>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for NonMacroAttrKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
NonMacroAttrKind::Builtin(ref __binding_0) => { 0usize }
NonMacroAttrKind::Tool => { 1usize }
NonMacroAttrKind::DeriveHelper => { 2usize }
NonMacroAttrKind::DeriveHelperCompat => { 3usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
NonMacroAttrKind::Builtin(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
NonMacroAttrKind::Tool => {}
NonMacroAttrKind::DeriveHelper => {}
NonMacroAttrKind::DeriveHelperCompat => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for NonMacroAttrKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
NonMacroAttrKind::Builtin(::rustc_serialize::Decodable::decode(__decoder))
}
1usize => { NonMacroAttrKind::Tool }
2usize => { NonMacroAttrKind::DeriveHelper }
3usize => { NonMacroAttrKind::DeriveHelperCompat }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `NonMacroAttrKind`, expected 0..4, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for NonMacroAttrKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
NonMacroAttrKind::Builtin(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for NonMacroAttrKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
NonMacroAttrKind::Builtin(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"Builtin", &__self_0),
NonMacroAttrKind::Tool =>
::core::fmt::Formatter::write_str(f, "Tool"),
NonMacroAttrKind::DeriveHelper =>
::core::fmt::Formatter::write_str(f, "DeriveHelper"),
NonMacroAttrKind::DeriveHelperCompat =>
::core::fmt::Formatter::write_str(f, "DeriveHelperCompat"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for
NonMacroAttrKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
NonMacroAttrKind::Builtin(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
NonMacroAttrKind::Tool => {}
NonMacroAttrKind::DeriveHelper => {}
NonMacroAttrKind::DeriveHelperCompat => {}
}
}
}
};StableHash)]
84pub enum NonMacroAttrKind {
85 Builtin(Symbol),
87 Tool,
89 DeriveHelper,
91 DeriveHelperCompat,
94}
95
96#[derive(#[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for DefKind { }
#[automatically_derived]
impl ::core::clone::Clone for DefKind {
#[inline]
fn clone(&self) -> DefKind {
let _: ::core::clone::AssertParamIsClone<hir::Safety>;
let _: ::core::clone::AssertParamIsClone<ast::Mutability>;
let _: ::core::clone::AssertParamIsClone<bool>;
let _: ::core::clone::AssertParamIsClone<CtorOf>;
let _: ::core::clone::AssertParamIsClone<CtorKind>;
let _: ::core::clone::AssertParamIsClone<MacroKinds>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DefKind { }Copy, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for DefKind { }
#[automatically_derived]
impl ::core::cmp::PartialEq for DefKind {
#[inline]
fn eq(&self, other: &DefKind) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(DefKind::Static {
safety: __self_0, mutability: __self_1, nested: __self_2 },
DefKind::Static {
safety: __arg1_0, mutability: __arg1_1, nested: __arg1_2 })
=>
__self_2 == __arg1_2 && __self_0 == __arg1_0 &&
__self_1 == __arg1_1,
(DefKind::Ctor(__self_0, __self_1),
DefKind::Ctor(__arg1_0, __arg1_1)) =>
__self_0 == __arg1_0 && __self_1 == __arg1_1,
(DefKind::Macro(__self_0), DefKind::Macro(__arg1_0)) =>
__self_0 == __arg1_0,
(DefKind::Impl { of_trait: __self_0 }, DefKind::Impl {
of_trait: __arg1_0 }) => __self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DefKind {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<hir::Safety>;
let _: ::core::cmp::AssertParamIsEq<ast::Mutability>;
let _: ::core::cmp::AssertParamIsEq<bool>;
let _: ::core::cmp::AssertParamIsEq<CtorOf>;
let _: ::core::cmp::AssertParamIsEq<CtorKind>;
let _: ::core::cmp::AssertParamIsEq<MacroKinds>;
}
}Eq, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for DefKind {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
DefKind::Mod => { 0usize }
DefKind::Struct => { 1usize }
DefKind::Union => { 2usize }
DefKind::Enum => { 3usize }
DefKind::Variant => { 4usize }
DefKind::Trait => { 5usize }
DefKind::TyAlias => { 6usize }
DefKind::ForeignTy => { 7usize }
DefKind::TraitAlias => { 8usize }
DefKind::AssocTy => { 9usize }
DefKind::TyParam => { 10usize }
DefKind::Fn => { 11usize }
DefKind::Const => { 12usize }
DefKind::ConstParam => { 13usize }
DefKind::Static {
safety: ref __binding_0,
mutability: ref __binding_1,
nested: ref __binding_2 } => {
14usize
}
DefKind::Ctor(ref __binding_0, ref __binding_1) => {
15usize
}
DefKind::AssocFn => { 16usize }
DefKind::AssocConst => { 17usize }
DefKind::Macro(ref __binding_0) => { 18usize }
DefKind::ExternCrate => { 19usize }
DefKind::Use => { 20usize }
DefKind::ForeignMod => { 21usize }
DefKind::AnonConst => { 22usize }
DefKind::OpaqueTy => { 23usize }
DefKind::Field => { 24usize }
DefKind::LifetimeParam => { 25usize }
DefKind::GlobalAsm => { 26usize }
DefKind::Impl { of_trait: ref __binding_0 } => { 27usize }
DefKind::Closure => { 28usize }
DefKind::SyntheticCoroutineBody => { 29usize }
DefKind::TestBinderConstraints => { 30usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
DefKind::Mod => {}
DefKind::Struct => {}
DefKind::Union => {}
DefKind::Enum => {}
DefKind::Variant => {}
DefKind::Trait => {}
DefKind::TyAlias => {}
DefKind::ForeignTy => {}
DefKind::TraitAlias => {}
DefKind::AssocTy => {}
DefKind::TyParam => {}
DefKind::Fn => {}
DefKind::Const => {}
DefKind::ConstParam => {}
DefKind::Static {
safety: ref __binding_0,
mutability: ref __binding_1,
nested: ref __binding_2 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_2,
__encoder);
}
DefKind::Ctor(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
DefKind::AssocFn => {}
DefKind::AssocConst => {}
DefKind::Macro(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
DefKind::ExternCrate => {}
DefKind::Use => {}
DefKind::ForeignMod => {}
DefKind::AnonConst => {}
DefKind::OpaqueTy => {}
DefKind::Field => {}
DefKind::LifetimeParam => {}
DefKind::GlobalAsm => {}
DefKind::Impl { of_trait: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
DefKind::Closure => {}
DefKind::SyntheticCoroutineBody => {}
DefKind::TestBinderConstraints => {}
}
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for DefKind {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { DefKind::Mod }
1usize => { DefKind::Struct }
2usize => { DefKind::Union }
3usize => { DefKind::Enum }
4usize => { DefKind::Variant }
5usize => { DefKind::Trait }
6usize => { DefKind::TyAlias }
7usize => { DefKind::ForeignTy }
8usize => { DefKind::TraitAlias }
9usize => { DefKind::AssocTy }
10usize => { DefKind::TyParam }
11usize => { DefKind::Fn }
12usize => { DefKind::Const }
13usize => { DefKind::ConstParam }
14usize => {
DefKind::Static {
safety: ::rustc_serialize::Decodable::decode(__decoder),
mutability: ::rustc_serialize::Decodable::decode(__decoder),
nested: ::rustc_serialize::Decodable::decode(__decoder),
}
}
15usize => {
DefKind::Ctor(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
16usize => { DefKind::AssocFn }
17usize => { DefKind::AssocConst }
18usize => {
DefKind::Macro(::rustc_serialize::Decodable::decode(__decoder))
}
19usize => { DefKind::ExternCrate }
20usize => { DefKind::Use }
21usize => { DefKind::ForeignMod }
22usize => { DefKind::AnonConst }
23usize => { DefKind::OpaqueTy }
24usize => { DefKind::Field }
25usize => { DefKind::LifetimeParam }
26usize => { DefKind::GlobalAsm }
27usize => {
DefKind::Impl {
of_trait: ::rustc_serialize::Decodable::decode(__decoder),
}
}
28usize => { DefKind::Closure }
29usize => { DefKind::SyntheticCoroutineBody }
30usize => { DefKind::TestBinderConstraints }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `DefKind`, expected 0..31, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl ::core::hash::Hash for DefKind {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
DefKind::Static {
safety: __self_0, mutability: __self_1, nested: __self_2 } =>
{
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state);
::core::hash::Hash::hash(__self_2, state)
}
DefKind::Ctor(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
DefKind::Macro(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
DefKind::Impl { of_trait: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for DefKind {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
DefKind::Mod => ::core::fmt::Formatter::write_str(f, "Mod"),
DefKind::Struct => ::core::fmt::Formatter::write_str(f, "Struct"),
DefKind::Union => ::core::fmt::Formatter::write_str(f, "Union"),
DefKind::Enum => ::core::fmt::Formatter::write_str(f, "Enum"),
DefKind::Variant =>
::core::fmt::Formatter::write_str(f, "Variant"),
DefKind::Trait => ::core::fmt::Formatter::write_str(f, "Trait"),
DefKind::TyAlias =>
::core::fmt::Formatter::write_str(f, "TyAlias"),
DefKind::ForeignTy =>
::core::fmt::Formatter::write_str(f, "ForeignTy"),
DefKind::TraitAlias =>
::core::fmt::Formatter::write_str(f, "TraitAlias"),
DefKind::AssocTy =>
::core::fmt::Formatter::write_str(f, "AssocTy"),
DefKind::TyParam =>
::core::fmt::Formatter::write_str(f, "TyParam"),
DefKind::Fn => ::core::fmt::Formatter::write_str(f, "Fn"),
DefKind::Const => ::core::fmt::Formatter::write_str(f, "Const"),
DefKind::ConstParam =>
::core::fmt::Formatter::write_str(f, "ConstParam"),
DefKind::Static {
safety: __self_0, mutability: __self_1, nested: __self_2 } =>
::core::fmt::Formatter::debug_struct_field3_finish(f,
"Static", "safety", __self_0, "mutability", __self_1,
"nested", &__self_2),
DefKind::Ctor(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Ctor",
__self_0, &__self_1),
DefKind::AssocFn =>
::core::fmt::Formatter::write_str(f, "AssocFn"),
DefKind::AssocConst =>
::core::fmt::Formatter::write_str(f, "AssocConst"),
DefKind::Macro(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Macro",
&__self_0),
DefKind::ExternCrate =>
::core::fmt::Formatter::write_str(f, "ExternCrate"),
DefKind::Use => ::core::fmt::Formatter::write_str(f, "Use"),
DefKind::ForeignMod =>
::core::fmt::Formatter::write_str(f, "ForeignMod"),
DefKind::AnonConst =>
::core::fmt::Formatter::write_str(f, "AnonConst"),
DefKind::OpaqueTy =>
::core::fmt::Formatter::write_str(f, "OpaqueTy"),
DefKind::Field => ::core::fmt::Formatter::write_str(f, "Field"),
DefKind::LifetimeParam =>
::core::fmt::Formatter::write_str(f, "LifetimeParam"),
DefKind::GlobalAsm =>
::core::fmt::Formatter::write_str(f, "GlobalAsm"),
DefKind::Impl { of_trait: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
"of_trait", &__self_0),
DefKind::Closure =>
::core::fmt::Formatter::write_str(f, "Closure"),
DefKind::SyntheticCoroutineBody =>
::core::fmt::Formatter::write_str(f,
"SyntheticCoroutineBody"),
DefKind::TestBinderConstraints =>
::core::fmt::Formatter::write_str(f, "TestBinderConstraints"),
}
}
}Debug, const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for DefKind {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
DefKind::Mod => {}
DefKind::Struct => {}
DefKind::Union => {}
DefKind::Enum => {}
DefKind::Variant => {}
DefKind::Trait => {}
DefKind::TyAlias => {}
DefKind::ForeignTy => {}
DefKind::TraitAlias => {}
DefKind::AssocTy => {}
DefKind::TyParam => {}
DefKind::Fn => {}
DefKind::Const => {}
DefKind::ConstParam => {}
DefKind::Static {
safety: ref __binding_0,
mutability: ref __binding_1,
nested: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
DefKind::Ctor(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
DefKind::AssocFn => {}
DefKind::AssocConst => {}
DefKind::Macro(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
DefKind::ExternCrate => {}
DefKind::Use => {}
DefKind::ForeignMod => {}
DefKind::AnonConst => {}
DefKind::OpaqueTy => {}
DefKind::Field => {}
DefKind::LifetimeParam => {}
DefKind::GlobalAsm => {}
DefKind::Impl { of_trait: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
DefKind::Closure => {}
DefKind::SyntheticCoroutineBody => {}
DefKind::TestBinderConstraints => {}
}
}
}
};StableHash)]
99pub enum DefKind {
100 Mod,
102 Struct,
104 Union,
105 Enum,
106 Variant,
108 Trait,
109 TyAlias,
111 ForeignTy,
113 TraitAlias,
115 AssocTy,
117 TyParam,
119
120 Fn,
122 Const,
123 ConstParam,
125 Static {
126 safety: hir::Safety,
128 mutability: ast::Mutability,
130 nested: bool,
132 },
133 Ctor(CtorOf, CtorKind),
150 AssocFn,
153 AssocConst,
155
156 Macro(MacroKinds),
158
159 ExternCrate,
161 Use,
162 ForeignMod,
164 AnonConst,
176 OpaqueTy,
178 Field,
182 LifetimeParam,
184 GlobalAsm,
186 Impl {
187 of_trait: bool,
188 },
189 Closure,
196 SyntheticCoroutineBody,
199 TestBinderConstraints,
201}
202
203impl DefKind {
204 pub fn descr(self, def_id: DefId) -> &'static str {
210 match self {
211 DefKind::Fn => "function",
212 DefKind::Mod if def_id.is_crate_root() && !def_id.is_local() => "crate",
213 DefKind::Mod => "module",
214 DefKind::Static { .. } => "static",
215 DefKind::Enum => "enum",
216 DefKind::Variant => "variant",
217 DefKind::Ctor(CtorOf::Variant, CtorKind::Fn) => "tuple variant",
218 DefKind::Ctor(CtorOf::Variant, CtorKind::Const) => "unit variant",
219 DefKind::Struct => "struct",
220 DefKind::Ctor(CtorOf::Struct, CtorKind::Fn) => "tuple struct",
221 DefKind::Ctor(CtorOf::Struct, CtorKind::Const) => "unit struct",
222 DefKind::OpaqueTy => "opaque type",
223 DefKind::TyAlias => "type alias",
224 DefKind::TraitAlias => "trait alias",
225 DefKind::AssocTy => "associated type",
226 DefKind::Union => "union",
227 DefKind::Trait => "trait",
228 DefKind::ForeignTy => "foreign type",
229 DefKind::AssocFn => "associated function",
230 DefKind::Const => "constant",
231 DefKind::AssocConst => "associated constant",
232 DefKind::TyParam => "type parameter",
233 DefKind::ConstParam => "const parameter",
234 DefKind::Macro(kinds) => kinds.descr(),
235 DefKind::LifetimeParam => "lifetime parameter",
236 DefKind::Use => "import",
237 DefKind::ForeignMod => "foreign module",
238 DefKind::AnonConst => "constant expression",
239 DefKind::Field => "field",
240 DefKind::Impl { .. } => "implementation",
241 DefKind::Closure => "closure",
242 DefKind::ExternCrate => "extern crate",
243 DefKind::GlobalAsm => "global assembly block",
244 DefKind::SyntheticCoroutineBody => "synthetic mir body",
245 DefKind::TestBinderConstraints => "test_binder_constraints!",
246 }
247 }
248
249 pub fn article(&self) -> &'static str {
255 match *self {
256 DefKind::AssocTy
257 | DefKind::AssocConst
258 | DefKind::AssocFn
259 | DefKind::Enum
260 | DefKind::OpaqueTy
261 | DefKind::Impl { .. }
262 | DefKind::Use
263 | DefKind::ExternCrate => "an",
264 DefKind::Macro(kinds) => kinds.article(),
265 _ => "a",
266 }
267 }
268
269 pub fn ns(&self) -> Option<Namespace> {
270 match self {
271 DefKind::Mod
272 | DefKind::Struct
273 | DefKind::Union
274 | DefKind::Enum
275 | DefKind::Variant
276 | DefKind::Trait
277 | DefKind::TyAlias
278 | DefKind::ForeignTy
279 | DefKind::TraitAlias
280 | DefKind::AssocTy
281 | DefKind::TyParam => Some(Namespace::TypeNS),
282
283 DefKind::Fn
284 | DefKind::Const
285 | DefKind::ConstParam
286 | DefKind::Static { .. }
287 | DefKind::Ctor(..)
288 | DefKind::AssocFn
289 | DefKind::AssocConst => Some(Namespace::ValueNS),
290
291 DefKind::Macro(..) => Some(Namespace::MacroNS),
292
293 DefKind::AnonConst
295 | DefKind::Field
296 | DefKind::LifetimeParam
297 | DefKind::ExternCrate
298 | DefKind::Closure
299 | DefKind::Use
300 | DefKind::ForeignMod
301 | DefKind::GlobalAsm
302 | DefKind::Impl { .. }
303 | DefKind::OpaqueTy
304 | DefKind::SyntheticCoroutineBody
305 | DefKind::TestBinderConstraints => None,
306 }
307 }
308
309 pub fn def_path_data(self, name: Option<Symbol>) -> DefPathData {
312 match self {
313 DefKind::Mod
314 | DefKind::Struct
315 | DefKind::Union
316 | DefKind::Enum
317 | DefKind::Variant
318 | DefKind::Trait
319 | DefKind::TyAlias
320 | DefKind::ForeignTy
321 | DefKind::TraitAlias
322 | DefKind::TyParam
323 | DefKind::ExternCrate => DefPathData::TypeNs(name.unwrap()),
324
325 DefKind::AssocTy => DefPathData::TypeNs(name.unwrap()),
328
329 DefKind::Fn
330 | DefKind::Const
331 | DefKind::ConstParam
332 | DefKind::Static { .. }
333 | DefKind::AssocFn
334 | DefKind::AssocConst
335 | DefKind::Field => DefPathData::ValueNs(name.unwrap()),
336 DefKind::Macro(..) => DefPathData::MacroNs(name.unwrap()),
337 DefKind::LifetimeParam => DefPathData::LifetimeNs(name.unwrap()),
338 DefKind::Ctor(..) => DefPathData::Ctor,
339 DefKind::Use => DefPathData::Use,
340 DefKind::ForeignMod => DefPathData::ForeignMod,
341 DefKind::AnonConst => DefPathData::AnonConst,
342 DefKind::OpaqueTy => DefPathData::OpaqueTy,
343 DefKind::GlobalAsm => DefPathData::GlobalAsm,
344 DefKind::Impl { .. } => DefPathData::Impl,
345 DefKind::Closure => DefPathData::Closure,
346 DefKind::SyntheticCoroutineBody => DefPathData::SyntheticCoroutineBody,
347 DefKind::TestBinderConstraints => DefPathData::TestBinderConstraints,
348 }
349 }
350
351 pub fn is_assoc(self) -> bool {
352 #[allow(non_exhaustive_omitted_patterns)] match self {
DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy => true,
_ => false,
}matches!(self, DefKind::AssocConst | DefKind::AssocFn | DefKind::AssocTy)
353 }
354
355 #[inline]
357 pub fn is_module_like(self) -> bool {
358 #[allow(non_exhaustive_omitted_patterns)] match self {
DefKind::Mod | DefKind::Enum | DefKind::Trait => true,
_ => false,
}matches!(self, DefKind::Mod | DefKind::Enum | DefKind::Trait)
359 }
360
361 #[inline]
362 pub fn is_adt(self) -> bool {
363 #[allow(non_exhaustive_omitted_patterns)] match self {
DefKind::Struct | DefKind::Union | DefKind::Enum => true,
_ => false,
}matches!(self, DefKind::Struct | DefKind::Union | DefKind::Enum)
364 }
365
366 #[inline]
367 pub fn is_fn_like(self) -> bool {
368 #[allow(non_exhaustive_omitted_patterns)] match self {
DefKind::Fn | DefKind::AssocFn | DefKind::Closure |
DefKind::SyntheticCoroutineBody => true,
_ => false,
}matches!(
369 self,
370 DefKind::Fn | DefKind::AssocFn | DefKind::Closure | DefKind::SyntheticCoroutineBody
371 )
372 }
373
374 pub fn has_generics(self) -> bool {
376 match self {
377 DefKind::AnonConst
378 | DefKind::AssocConst
379 | DefKind::AssocFn
380 | DefKind::AssocTy
381 | DefKind::Closure
382 | DefKind::Const
383 | DefKind::Ctor(..)
384 | DefKind::Enum
385 | DefKind::Field
386 | DefKind::Fn
387 | DefKind::ForeignTy
388 | DefKind::Impl { .. }
389 | DefKind::OpaqueTy
390 | DefKind::Static { .. }
391 | DefKind::Struct
392 | DefKind::SyntheticCoroutineBody
393 | DefKind::Trait
394 | DefKind::TraitAlias
395 | DefKind::TyAlias
396 | DefKind::Union
397 | DefKind::Variant
398 | DefKind::TestBinderConstraints => true,
399 DefKind::ConstParam
400 | DefKind::ExternCrate
401 | DefKind::ForeignMod
402 | DefKind::GlobalAsm
403 | DefKind::LifetimeParam
404 | DefKind::Macro(_)
405 | DefKind::Mod
406 | DefKind::TyParam
407 | DefKind::Use => false,
408 }
409 }
410
411 pub fn has_codegen_attrs(self) -> bool {
413 match self {
414 DefKind::Fn
415 | DefKind::AssocFn
416 | DefKind::Ctor(..)
417 | DefKind::Closure
418 | DefKind::Static { .. }
419 | DefKind::SyntheticCoroutineBody => true,
420 DefKind::Mod
421 | DefKind::Struct
422 | DefKind::Union
423 | DefKind::Enum
424 | DefKind::Variant
425 | DefKind::Trait
426 | DefKind::TyAlias
427 | DefKind::ForeignTy
428 | DefKind::TraitAlias
429 | DefKind::AssocTy
430 | DefKind::Const
431 | DefKind::AssocConst
432 | DefKind::Macro(..)
433 | DefKind::Use
434 | DefKind::ForeignMod
435 | DefKind::OpaqueTy
436 | DefKind::Impl { .. }
437 | DefKind::Field
438 | DefKind::TyParam
439 | DefKind::ConstParam
440 | DefKind::LifetimeParam
441 | DefKind::AnonConst
442 | DefKind::GlobalAsm
443 | DefKind::ExternCrate
444 | DefKind::TestBinderConstraints => false,
445 }
446 }
447}
448
449#[derive(#[automatically_derived]
impl<Id: ::core::clone::Clone> ::core::clone::Clone for Res<Id> {
#[inline]
fn clone(&self) -> Res<Id> {
match self {
Res::Def(__self_0, __self_1) =>
Res::Def(::core::clone::Clone::clone(__self_0),
::core::clone::Clone::clone(__self_1)),
Res::PrimTy(__self_0) =>
Res::PrimTy(::core::clone::Clone::clone(__self_0)),
Res::SelfTyParam { trait_: __self_0 } =>
Res::SelfTyParam {
trait_: ::core::clone::Clone::clone(__self_0),
},
Res::SelfTyAlias { alias_to: __self_0, is_trait_impl: __self_1 }
=>
Res::SelfTyAlias {
alias_to: ::core::clone::Clone::clone(__self_0),
is_trait_impl: ::core::clone::Clone::clone(__self_1),
},
Res::SelfCtor(__self_0) =>
Res::SelfCtor(::core::clone::Clone::clone(__self_0)),
Res::Local(__self_0) =>
Res::Local(::core::clone::Clone::clone(__self_0)),
Res::ToolMod => Res::ToolMod,
Res::OpenMod(__self_0) =>
Res::OpenMod(::core::clone::Clone::clone(__self_0)),
Res::NonMacroAttr(__self_0) =>
Res::NonMacroAttr(::core::clone::Clone::clone(__self_0)),
Res::Err => Res::Err,
}
}
}Clone, #[automatically_derived]
impl<Id: ::core::marker::Copy> ::core::marker::Copy for Res<Id> { }Copy, #[automatically_derived]
impl<Id: ::core::cmp::PartialEq> ::core::marker::StructuralPartialEq for
Res<Id> {
}
#[automatically_derived]
impl<Id: ::core::cmp::PartialEq> ::core::cmp::PartialEq for Res<Id> {
#[inline]
fn eq(&self, other: &Res<Id>) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr &&
match (self, other) {
(Res::Def(__self_0, __self_1), Res::Def(__arg1_0, __arg1_1))
=> __self_0 == __arg1_0 && __self_1 == __arg1_1,
(Res::PrimTy(__self_0), Res::PrimTy(__arg1_0)) =>
__self_0 == __arg1_0,
(Res::SelfTyParam { trait_: __self_0 }, Res::SelfTyParam {
trait_: __arg1_0 }) => __self_0 == __arg1_0,
(Res::SelfTyAlias {
alias_to: __self_0, is_trait_impl: __self_1 },
Res::SelfTyAlias {
alias_to: __arg1_0, is_trait_impl: __arg1_1 }) =>
__self_1 == __arg1_1 && __self_0 == __arg1_0,
(Res::SelfCtor(__self_0), Res::SelfCtor(__arg1_0)) =>
__self_0 == __arg1_0,
(Res::Local(__self_0), Res::Local(__arg1_0)) =>
__self_0 == __arg1_0,
(Res::OpenMod(__self_0), Res::OpenMod(__arg1_0)) =>
__self_0 == __arg1_0,
(Res::NonMacroAttr(__self_0), Res::NonMacroAttr(__arg1_0)) =>
__self_0 == __arg1_0,
_ => true,
}
}
}PartialEq, #[automatically_derived]
impl<Id: ::core::cmp::Eq> ::core::cmp::Eq for Res<Id> {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_fields_are_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<DefKind>;
let _: ::core::cmp::AssertParamIsEq<DefId>;
let _: ::core::cmp::AssertParamIsEq<hir::PrimTy>;
let _: ::core::cmp::AssertParamIsEq<bool>;
let _: ::core::cmp::AssertParamIsEq<Id>;
let _: ::core::cmp::AssertParamIsEq<Symbol>;
let _: ::core::cmp::AssertParamIsEq<NonMacroAttrKind>;
}
}Eq, const _: () =
{
impl<Id, __E: ::rustc_span::SpanEncoder>
::rustc_serialize::Encodable<__E> for Res<Id> where
Id: ::rustc_serialize::Encodable<__E> {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Res::Def(ref __binding_0, ref __binding_1) => { 0usize }
Res::PrimTy(ref __binding_0) => { 1usize }
Res::SelfTyParam { trait_: ref __binding_0 } => { 2usize }
Res::SelfTyAlias {
alias_to: ref __binding_0, is_trait_impl: ref __binding_1 }
=> {
3usize
}
Res::SelfCtor(ref __binding_0) => { 4usize }
Res::Local(ref __binding_0) => { 5usize }
Res::ToolMod => { 6usize }
Res::OpenMod(ref __binding_0) => { 7usize }
Res::NonMacroAttr(ref __binding_0) => { 8usize }
Res::Err => { 9usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
match *self {
Res::Def(ref __binding_0, ref __binding_1) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
Res::PrimTy(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Res::SelfTyParam { trait_: ref __binding_0 } => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Res::SelfTyAlias {
alias_to: ref __binding_0, is_trait_impl: ref __binding_1 }
=> {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
::rustc_serialize::Encodable::<__E>::encode(__binding_1,
__encoder);
}
Res::SelfCtor(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Res::Local(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Res::ToolMod => {}
Res::OpenMod(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Res::NonMacroAttr(ref __binding_0) => {
::rustc_serialize::Encodable::<__E>::encode(__binding_0,
__encoder);
}
Res::Err => {}
}
}
}
};Encodable, const _: () =
{
impl<Id, __D: ::rustc_span::SpanDecoder>
::rustc_serialize::Decodable<__D> for Res<Id> where
Id: ::rustc_serialize::Decodable<__D> {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => {
Res::Def(::rustc_serialize::Decodable::decode(__decoder),
::rustc_serialize::Decodable::decode(__decoder))
}
1usize => {
Res::PrimTy(::rustc_serialize::Decodable::decode(__decoder))
}
2usize => {
Res::SelfTyParam {
trait_: ::rustc_serialize::Decodable::decode(__decoder),
}
}
3usize => {
Res::SelfTyAlias {
alias_to: ::rustc_serialize::Decodable::decode(__decoder),
is_trait_impl: ::rustc_serialize::Decodable::decode(__decoder),
}
}
4usize => {
Res::SelfCtor(::rustc_serialize::Decodable::decode(__decoder))
}
5usize => {
Res::Local(::rustc_serialize::Decodable::decode(__decoder))
}
6usize => { Res::ToolMod }
7usize => {
Res::OpenMod(::rustc_serialize::Decodable::decode(__decoder))
}
8usize => {
Res::NonMacroAttr(::rustc_serialize::Decodable::decode(__decoder))
}
9usize => { Res::Err }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Res`, expected 0..10, actual {0}",
n));
}
}
}
}
};Decodable, #[automatically_derived]
impl<Id: ::core::hash::Hash> ::core::hash::Hash for Res<Id> {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state);
match self {
Res::Def(__self_0, __self_1) => {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Res::PrimTy(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Res::SelfTyParam { trait_: __self_0 } =>
::core::hash::Hash::hash(__self_0, state),
Res::SelfTyAlias { alias_to: __self_0, is_trait_impl: __self_1 }
=> {
::core::hash::Hash::hash(__self_0, state);
::core::hash::Hash::hash(__self_1, state)
}
Res::SelfCtor(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Res::Local(__self_0) => ::core::hash::Hash::hash(__self_0, state),
Res::OpenMod(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
Res::NonMacroAttr(__self_0) =>
::core::hash::Hash::hash(__self_0, state),
_ => {}
}
}
}Hash, #[automatically_derived]
impl<Id: ::core::fmt::Debug> ::core::fmt::Debug for Res<Id> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
match self {
Res::Def(__self_0, __self_1) =>
::core::fmt::Formatter::debug_tuple_field2_finish(f, "Def",
__self_0, &__self_1),
Res::PrimTy(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "PrimTy",
&__self_0),
Res::SelfTyParam { trait_: __self_0 } =>
::core::fmt::Formatter::debug_struct_field1_finish(f,
"SelfTyParam", "trait_", &__self_0),
Res::SelfTyAlias { alias_to: __self_0, is_trait_impl: __self_1 }
=>
::core::fmt::Formatter::debug_struct_field2_finish(f,
"SelfTyAlias", "alias_to", __self_0, "is_trait_impl",
&__self_1),
Res::SelfCtor(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"SelfCtor", &__self_0),
Res::Local(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f, "Local",
&__self_0),
Res::ToolMod => ::core::fmt::Formatter::write_str(f, "ToolMod"),
Res::OpenMod(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"OpenMod", &__self_0),
Res::NonMacroAttr(__self_0) =>
::core::fmt::Formatter::debug_tuple_field1_finish(f,
"NonMacroAttr", &__self_0),
Res::Err => ::core::fmt::Formatter::write_str(f, "Err"),
}
}
}Debug, const _: () =
{
impl<Id> ::rustc_data_structures::stable_hash::StableHash for Res<Id>
where Id: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Res::Def(ref __binding_0, ref __binding_1) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
Res::PrimTy(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Res::SelfTyParam { trait_: ref __binding_0 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Res::SelfTyAlias {
alias_to: ref __binding_0, is_trait_impl: ref __binding_1 }
=> {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
}
Res::SelfCtor(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Res::Local(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Res::ToolMod => {}
Res::OpenMod(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Res::NonMacroAttr(ref __binding_0) => {
{ __binding_0.stable_hash(__hcx, __hasher); }
}
Res::Err => {}
}
}
}
};StableHash)]
478pub enum Res<Id = HirId> {
479 Def(DefKind, DefId),
483
484 PrimTy(hir::PrimTy),
489
490 SelfTyParam {
496 trait_: DefId,
498 },
499
500 SelfTyAlias {
529 alias_to: DefId,
532
533 is_trait_impl: bool,
535 },
536
537 SelfCtor(DefId),
545
546 Local(Id),
550
551 ToolMod,
555
556 OpenMod(Symbol),
562
563 NonMacroAttr(NonMacroAttrKind), Err,
577}
578
579impl<Id> IntoDiagArg for Res<Id> {
580 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
581 DiagArgValue::Str(Cow::Borrowed(self.descr()))
582 }
583}
584
585#[derive(#[automatically_derived]
impl ::core::marker::Copy for Namespace { }Copy, #[automatically_derived]
#[doc(hidden)]
unsafe impl ::core::clone::TrivialClone for Namespace { }
#[automatically_derived]
impl ::core::clone::Clone for Namespace {
#[inline]
fn clone(&self) -> Namespace { *self }
}Clone, #[automatically_derived]
impl ::core::marker::StructuralPartialEq for Namespace { }
#[automatically_derived]
impl ::core::cmp::PartialEq for Namespace {
#[inline]
fn eq(&self, other: &Namespace) -> bool {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
__self_discr == __arg1_discr
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Namespace { }Eq, #[automatically_derived]
impl ::core::cmp::PartialOrd for Namespace {
#[inline]
fn partial_cmp(&self, other: &Namespace)
-> ::core::option::Option<::core::cmp::Ordering> {
::core::option::Option::Some(::core::cmp::Ord::cmp(self, other))
}
}PartialOrd, #[automatically_derived]
impl ::core::cmp::Ord for Namespace {
#[inline]
fn cmp(&self, other: &Namespace) -> ::core::cmp::Ordering {
let __self_discr = ::core::intrinsics::discriminant_value(self);
let __arg1_discr = ::core::intrinsics::discriminant_value(other);
::core::cmp::Ord::cmp(&__self_discr, &__arg1_discr)
}
}Ord, #[automatically_derived]
impl ::core::hash::Hash for Namespace {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
let __self_discr = ::core::intrinsics::discriminant_value(self);
::core::hash::Hash::hash(&__self_discr, state)
}
}Hash, #[automatically_derived]
impl ::core::fmt::Debug for Namespace {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::write_str(f,
match self {
Namespace::TypeNS => "TypeNS",
Namespace::ValueNS => "ValueNS",
Namespace::MacroNS => "MacroNS",
})
}
}Debug, const _: () =
{
impl<__E: ::rustc_span::SpanEncoder> ::rustc_serialize::Encodable<__E>
for Namespace {
fn encode(&self, __encoder: &mut __E) {
let disc =
match *self {
Namespace::TypeNS => { 0usize }
Namespace::ValueNS => { 1usize }
Namespace::MacroNS => { 2usize }
};
::rustc_serialize::Encoder::emit_u8(__encoder, disc as u8);
}
}
};Encodable, const _: () =
{
impl<__D: ::rustc_span::SpanDecoder> ::rustc_serialize::Decodable<__D>
for Namespace {
fn decode(__decoder: &mut __D) -> Self {
match ::rustc_serialize::Decoder::read_u8(__decoder) as usize
{
0usize => { Namespace::TypeNS }
1usize => { Namespace::ValueNS }
2usize => { Namespace::MacroNS }
n => {
::core::panicking::panic_fmt(format_args!("invalid enum variant tag while decoding `Namespace`, expected 0..3, actual {0}",
n));
}
}
}
}
};Decodable)]
588#[derive(const _: () =
{
impl ::rustc_data_structures::stable_hash::StableHash for Namespace {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
::std::mem::discriminant(self).stable_hash(__hcx, __hasher);
match *self {
Namespace::TypeNS => {}
Namespace::ValueNS => {}
Namespace::MacroNS => {}
}
}
}
};StableHash)]
589pub enum Namespace {
590 TypeNS,
596 ValueNS,
598 MacroNS,
602}
603
604impl Namespace {
605 pub fn descr(self) -> &'static str {
607 match self {
608 Self::TypeNS => "type",
609 Self::ValueNS => "value",
610 Self::MacroNS => "macro",
611 }
612 }
613}
614
615impl IntoDiagArg for Namespace {
616 fn into_diag_arg(self, _: &mut Option<std::path::PathBuf>) -> DiagArgValue {
617 DiagArgValue::Str(Cow::Borrowed(self.descr()))
618 }
619}
620
621#[derive(#[automatically_derived]
impl<T: ::core::marker::Copy> ::core::marker::Copy for PerNS<T> { }Copy, #[automatically_derived]
impl<T: ::core::clone::Clone> ::core::clone::Clone for PerNS<T> {
#[inline]
fn clone(&self) -> PerNS<T> {
PerNS {
value_ns: ::core::clone::Clone::clone(&self.value_ns),
type_ns: ::core::clone::Clone::clone(&self.type_ns),
macro_ns: ::core::clone::Clone::clone(&self.macro_ns),
}
}
}Clone, #[automatically_derived]
impl<T: ::core::fmt::Debug> ::core::fmt::Debug for PerNS<T> {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field3_finish(f, "PerNS",
"value_ns", &self.value_ns, "type_ns", &self.type_ns, "macro_ns",
&&self.macro_ns)
}
}Debug, const _: () =
{
impl<T> ::rustc_data_structures::stable_hash::StableHash for PerNS<T>
where T: ::rustc_data_structures::stable_hash::StableHash {
#[inline]
fn stable_hash<__Hcx: ::rustc_data_structures::stable_hash::StableHashCtxt>(&self,
__hcx: &mut __Hcx,
__hasher:
&mut ::rustc_data_structures::stable_hash::StableHasher) {
match *self {
PerNS {
value_ns: ref __binding_0,
type_ns: ref __binding_1,
macro_ns: ref __binding_2 } => {
{ __binding_0.stable_hash(__hcx, __hasher); }
{ __binding_1.stable_hash(__hcx, __hasher); }
{ __binding_2.stable_hash(__hcx, __hasher); }
}
}
}
}
};StableHash)]
623#[derive_const(#[automatically_derived]
const impl<T: [const] ::core::default::Default> ::core::default::Default for
PerNS<T> {
#[inline]
fn default() -> PerNS<T> {
PerNS {
value_ns: ::core::default::Default::default(),
type_ns: ::core::default::Default::default(),
macro_ns: ::core::default::Default::default(),
}
}
}Default)]
624pub struct PerNS<T> {
625 pub value_ns: T,
626 pub type_ns: T,
627 pub macro_ns: T,
628}
629
630impl<T> PerNS<T> {
631 pub fn map<U, F: FnMut(T) -> U>(self, mut f: F) -> PerNS<U> {
632 PerNS { value_ns: f(self.value_ns), type_ns: f(self.type_ns), macro_ns: f(self.macro_ns) }
633 }
634
635 pub fn into_iter(self) -> IntoIter<T, 3> {
639 [self.value_ns, self.type_ns, self.macro_ns].into_iter()
640 }
641
642 pub fn iter(&self) -> IntoIter<&T, 3> {
646 [&self.value_ns, &self.type_ns, &self.macro_ns].into_iter()
647 }
648}
649
650impl<T> ::std::ops::Index<Namespace> for PerNS<T> {
651 type Output = T;
652
653 fn index(&self, ns: Namespace) -> &T {
654 match ns {
655 Namespace::ValueNS => &self.value_ns,
656 Namespace::TypeNS => &self.type_ns,
657 Namespace::MacroNS => &self.macro_ns,
658 }
659 }
660}
661
662impl<T> ::std::ops::IndexMut<Namespace> for PerNS<T> {
663 fn index_mut(&mut self, ns: Namespace) -> &mut T {
664 match ns {
665 Namespace::ValueNS => &mut self.value_ns,
666 Namespace::TypeNS => &mut self.type_ns,
667 Namespace::MacroNS => &mut self.macro_ns,
668 }
669 }
670}
671
672impl<T> PerNS<Option<T>> {
673 pub fn is_empty(&self) -> bool {
675 self.type_ns.is_none() && self.value_ns.is_none() && self.macro_ns.is_none()
676 }
677
678 pub fn present_items(self) -> impl Iterator<Item = T> {
684 [self.type_ns, self.value_ns, self.macro_ns].into_iter().flatten()
685 }
686}
687
688impl CtorKind {
689 pub fn from_ast(vdata: &ast::VariantData) -> Option<(CtorKind, NodeId)> {
690 match *vdata {
691 ast::VariantData::Tuple(_, node_id) => Some((CtorKind::Fn, node_id)),
692 ast::VariantData::Unit(node_id) => Some((CtorKind::Const, node_id)),
693 ast::VariantData::Struct { .. } => None,
694 }
695 }
696}
697
698impl NonMacroAttrKind {
699 pub fn descr(self) -> &'static str {
700 match self {
701 NonMacroAttrKind::Builtin(..) => "built-in attribute",
702 NonMacroAttrKind::Tool => "tool attribute",
703 NonMacroAttrKind::DeriveHelper | NonMacroAttrKind::DeriveHelperCompat => {
704 "derive helper attribute"
705 }
706 }
707 }
708
709 pub fn article(self) -> &'static str {
712 "a"
713 }
714
715 pub fn is_used(self) -> bool {
717 match self {
718 NonMacroAttrKind::Tool
719 | NonMacroAttrKind::DeriveHelper
720 | NonMacroAttrKind::DeriveHelperCompat => true,
721 NonMacroAttrKind::Builtin(..) => false,
722 }
723 }
724}
725
726impl<Id> Res<Id> {
727 pub fn def_id(&self) -> DefId
729 where
730 Id: Debug,
731 {
732 self.opt_def_id().unwrap_or_else(|| {
::core::panicking::panic_fmt(format_args!("attempted .def_id() on invalid res: {0:?}",
self));
}panic!("attempted .def_id() on invalid res: {self:?}"))
733 }
734
735 pub fn opt_def_id(&self) -> Option<DefId> {
737 match *self {
738 Res::Def(_, id) => Some(id),
739
740 Res::Local(..)
741 | Res::PrimTy(..)
742 | Res::SelfTyParam { .. }
743 | Res::SelfTyAlias { .. }
744 | Res::SelfCtor(..)
745 | Res::ToolMod
746 | Res::OpenMod(..)
747 | Res::NonMacroAttr(..)
748 | Res::Err => None,
749 }
750 }
751
752 pub fn mod_def_id(&self) -> Option<DefId> {
754 match *self {
755 Res::Def(DefKind::Mod, id) => Some(id),
756 _ => None,
757 }
758 }
759
760 #[inline]
762 pub fn module_like_def_id(&self) -> Option<DefId> {
763 match self {
764 Res::Def(def_kind, def_id) if def_kind.is_module_like() => Some(*def_id),
765 _ => None,
766 }
767 }
768
769 pub fn descr(&self) -> &'static str {
771 match *self {
772 Res::Def(kind, def_id) => kind.descr(def_id),
773 Res::SelfCtor(..) => "self constructor",
774 Res::PrimTy(..) => "builtin type",
775 Res::Local(..) => "local variable",
776 Res::SelfTyParam { .. } | Res::SelfTyAlias { .. } => "self type",
777 Res::ToolMod => "tool module",
778 Res::OpenMod(..) => "namespaced crate",
779 Res::NonMacroAttr(attr_kind) => attr_kind.descr(),
780 Res::Err => "unresolved item",
781 }
782 }
783
784 pub fn article(&self) -> &'static str {
786 match *self {
787 Res::Def(kind, _) => kind.article(),
788 Res::NonMacroAttr(kind) => kind.article(),
789 Res::Err => "an",
790 _ => "a",
791 }
792 }
793
794 pub fn map_id<R>(self, mut map: impl FnMut(Id) -> R) -> Res<R> {
795 match self {
796 Res::Def(kind, id) => Res::Def(kind, id),
797 Res::SelfCtor(id) => Res::SelfCtor(id),
798 Res::PrimTy(id) => Res::PrimTy(id),
799 Res::Local(id) => Res::Local(map(id)),
800 Res::SelfTyParam { trait_ } => Res::SelfTyParam { trait_ },
801 Res::SelfTyAlias { alias_to, is_trait_impl } => {
802 Res::SelfTyAlias { alias_to, is_trait_impl }
803 }
804 Res::ToolMod => Res::ToolMod,
805 Res::OpenMod(sym) => Res::OpenMod(sym),
806 Res::NonMacroAttr(attr_kind) => Res::NonMacroAttr(attr_kind),
807 Res::Err => Res::Err,
808 }
809 }
810
811 pub fn apply_id<R, E>(self, mut map: impl FnMut(Id) -> Result<R, E>) -> Result<Res<R>, E> {
812 Ok(match self {
813 Res::Def(kind, id) => Res::Def(kind, id),
814 Res::SelfCtor(id) => Res::SelfCtor(id),
815 Res::PrimTy(id) => Res::PrimTy(id),
816 Res::Local(id) => Res::Local(map(id)?),
817 Res::SelfTyParam { trait_ } => Res::SelfTyParam { trait_ },
818 Res::SelfTyAlias { alias_to, is_trait_impl } => {
819 Res::SelfTyAlias { alias_to, is_trait_impl }
820 }
821 Res::ToolMod => Res::ToolMod,
822 Res::OpenMod(sym) => Res::OpenMod(sym),
823 Res::NonMacroAttr(attr_kind) => Res::NonMacroAttr(attr_kind),
824 Res::Err => Res::Err,
825 })
826 }
827
828 #[track_caller]
829 pub fn expect_non_local<OtherId>(self) -> Res<OtherId> {
830 self.map_id(
831 #[track_caller]
832 |_| { ::core::panicking::panic_fmt(format_args!("unexpected `Res::Local`")); }panic!("unexpected `Res::Local`"),
833 )
834 }
835
836 pub fn macro_kinds(self) -> Option<MacroKinds> {
837 match self {
838 Res::Def(DefKind::Macro(kinds), _) => Some(kinds),
839 Res::NonMacroAttr(..) => Some(MacroKinds::ATTR),
840 _ => None,
841 }
842 }
843
844 pub fn ns(&self) -> Option<Namespace> {
846 match self {
847 Res::Def(kind, ..) => kind.ns(),
848 Res::PrimTy(..)
849 | Res::SelfTyParam { .. }
850 | Res::SelfTyAlias { .. }
851 | Res::ToolMod
852 | Res::OpenMod(..) => Some(Namespace::TypeNS),
853 Res::SelfCtor(..) | Res::Local(..) => Some(Namespace::ValueNS),
854 Res::NonMacroAttr(..) => Some(Namespace::MacroNS),
855 Res::Err => None,
856 }
857 }
858
859 pub fn matches_ns(&self, ns: Namespace) -> bool {
861 self.ns().is_none_or(|actual_ns| actual_ns == ns)
862 }
863
864 pub fn expected_in_tuple_struct_pat(&self) -> bool {
866 #[allow(non_exhaustive_omitted_patterns)] match self {
Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) | Res::SelfCtor(..) => true,
_ => false,
}matches!(self, Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) | Res::SelfCtor(..))
867 }
868
869 pub fn expected_in_unit_struct_pat(&self) -> bool {
871 #[allow(non_exhaustive_omitted_patterns)] match self {
Res::Def(DefKind::Ctor(_, CtorKind::Const), _) | Res::SelfCtor(..) =>
true,
_ => false,
}matches!(self, Res::Def(DefKind::Ctor(_, CtorKind::Const), _) | Res::SelfCtor(..))
872 }
873}