1//! Module that define a common trait for things that represent a crate definition,
2//! such as, a function, a trait, an enum, and any other definitions.
34use crate::ty::{GenericArgs, Span, Ty, index_impl};
5use crate::{AssocItems, Crate, Symbol, ThreadLocalIndex, with};
67/// A unique identification number for each item accessible for the current compilation unit.
8#[derive(#[automatically_derived]
impl ::core::clone::Clone for DefId {
#[inline]
fn clone(&self) -> DefId {
let _: ::core::clone::AssertParamIsClone<usize>;
let _: ::core::clone::AssertParamIsClone<ThreadLocalIndex>;
*self
}
}Clone, #[automatically_derived]
impl ::core::marker::Copy for DefId { }Copy, #[automatically_derived]
impl ::core::cmp::PartialEq for DefId {
#[inline]
fn eq(&self, other: &DefId) -> bool {
self.0 == other.0 && self.1 == other.1
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for DefId {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<usize>;
let _: ::core::cmp::AssertParamIsEq<ThreadLocalIndex>;
}
}Eq, #[automatically_derived]
impl ::core::hash::Hash for DefId {
#[inline]
fn hash<__H: ::core::hash::Hasher>(&self, state: &mut __H) {
::core::hash::Hash::hash(&self.0, state);
::core::hash::Hash::hash(&self.1, state)
}
}Hash)]
9pub struct DefId(pub(crate) usize, ThreadLocalIndex);
10impl crate::IndexedVal for DefId {
fn to_val(index: usize) -> Self { DefId(index, crate::ThreadLocalIndex) }
fn to_index(&self) -> usize { self.0 }
}
impl ::serde::Serialize for DefId {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where
S: ::serde::Serializer {
let n: usize = self.0;
::serde::Serialize::serialize(&n, serializer)
}
}index_impl!(DefId);
1112impl DefId {
13/// Return fully qualified name of this definition
14pub fn name(&self) -> Symbol {
15with(|cx| cx.def_name(*self, false))
16 }
1718/// Return a trimmed name of this definition.
19 ///
20 /// This can be used to print more user friendly diagnostic messages.
21 ///
22 /// If a symbol name can only be imported from one place for a type, and as
23 /// long as it was not glob-imported anywhere in the current crate, we trim its
24 /// path and print only the name.
25 ///
26 /// For example, this function may shorten `std::vec::Vec` to just `Vec`,
27 /// as long as there is no other `Vec` importable anywhere.
28pub fn trimmed_name(&self) -> Symbol {
29with(|cx| cx.def_name(*self, true))
30 }
3132/// Return the parent of this definition, or `None` if this is the root of a
33 /// crate.
34pub fn parent(&self) -> Option<DefId> {
35with(|cx| cx.def_parent(*self))
36 }
37}
3839/// A trait for retrieving information about a particular definition.
40///
41/// Implementors must provide the implementation of `def_id` which will be used to retrieve
42/// information about a crate's definition.
43pub trait CrateDef {
44/// Retrieve the unique identifier for the current definition.
45fn def_id(&self) -> DefId;
4647/// Return the fully qualified name of the current definition.
48 ///
49 /// See [`DefId::name`] for more details
50fn name(&self) -> Symbol {
51self.def_id().name()
52 }
5354/// Return a trimmed name of this definition.
55 ///
56 /// See [`DefId::trimmed_name`] for more details
57fn trimmed_name(&self) -> Symbol {
58self.def_id().trimmed_name()
59 }
6061/// Return information about the crate where this definition is declared.
62 ///
63 /// This will return the crate number and its name.
64fn krate(&self) -> Crate {
65let def_id = self.def_id();
66with(|cx| cx.krate(def_id))
67 }
6869/// Return the span of this definition.
70fn span(&self) -> Span {
71let def_id = self.def_id();
72with(|cx| cx.span_of_an_item(def_id))
73 }
7475/// Return registered tool attributes with the given attribute name.
76 ///
77 /// FIXME(jdonszelmann): may panic on non-tool attributes. After more attribute work, non-tool
78 /// attributes will simply return an empty list.
79 ///
80 /// Single segmented name like `#[clippy]` is specified as `&["clippy".to_string()]`.
81 /// Multi-segmented name like `#[rustfmt::skip]` is specified as `&["rustfmt".to_string(), "skip".to_string()]`.
82fn tool_attrs(&self, attr: &[Symbol]) -> Vec<Attribute> {
83let def_id = self.def_id();
84with(|cx| cx.tool_attrs(def_id, attr))
85 }
8687/// Return all tool attributes of this definition.
88fn all_tool_attrs(&self) -> Vec<Attribute> {
89let def_id = self.def_id();
90with(|cx| cx.all_tool_attrs(def_id))
91 }
92}
9394/// A trait that can be used to retrieve a definition's type.
95///
96/// Note that not every CrateDef has a type `Ty`. They should not implement this trait.
97pub trait CrateDefType: CrateDef {
98/// Returns the type of this crate item.
99fn ty(&self) -> Ty {
100with(|cx| cx.def_ty(self.def_id()))
101 }
102103/// Retrieve the type of this definition by instantiating and normalizing it with `args`.
104 ///
105 /// This will panic if instantiation fails.
106fn ty_with_args(&self, args: &GenericArgs) -> Ty {
107with(|cx| cx.def_ty_with_args(self.def_id(), args))
108 }
109}
110111/// A trait for retrieving all items from a definition within a crate.
112pub trait CrateDefItems: CrateDef {
113/// Retrieve all associated items from a definition.
114fn associated_items(&self) -> AssocItems {
115with(|cx| cx.associated_items(self.def_id()))
116 }
117}
118119#[derive(#[automatically_derived]
impl ::core::clone::Clone for Attribute {
#[inline]
fn clone(&self) -> Attribute {
Attribute {
value: ::core::clone::Clone::clone(&self.value),
span: ::core::clone::Clone::clone(&self.span),
}
}
}Clone, #[automatically_derived]
impl ::core::fmt::Debug for Attribute {
#[inline]
fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
::core::fmt::Formatter::debug_struct_field2_finish(f, "Attribute",
"value", &self.value, "span", &&self.span)
}
}Debug, #[automatically_derived]
impl ::core::cmp::PartialEq for Attribute {
#[inline]
fn eq(&self, other: &Attribute) -> bool {
self.value == other.value && self.span == other.span
}
}PartialEq, #[automatically_derived]
impl ::core::cmp::Eq for Attribute {
#[inline]
#[doc(hidden)]
#[coverage(off)]
fn assert_receiver_is_total_eq(&self) {
let _: ::core::cmp::AssertParamIsEq<String>;
let _: ::core::cmp::AssertParamIsEq<Span>;
}
}Eq)]
120pub struct Attribute {
121 value: String,
122 span: Span,
123}
124125impl Attribute {
126pub fn new(value: String, span: Span) -> Attribute {
127Attribute { value, span }
128 }
129130/// Get the span of this attribute.
131pub fn span(&self) -> Span {
132self.span
133 }
134135/// Get the string representation of this attribute.
136pub fn as_str(&self) -> &str {
137&self.value
138 }
139}
140141macro_rules!crate_def {
142 ( $(#[$attr:meta])*
143$vis:vis $name:ident $(;)?
144) => {
145 $(#[$attr])*
146#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
147$vis struct $name(pub DefId);
148149impl CrateDef for $name {
150fn def_id(&self) -> DefId {
151self.0
152}
153 }
154 };
155}
156157macro_rules!crate_def_with_ty {
158 ( $(#[$attr:meta])*
159$vis:vis $name:ident $(;)?
160) => {
161 $(#[$attr])*
162#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
163$vis struct $name(pub DefId);
164165impl CrateDef for $name {
166fn def_id(&self) -> DefId {
167self.0
168}
169 }
170171impl CrateDefType for $name {}
172 };
173}
174175macro_rules!impl_crate_def_items {
176 ( $name:ident $(;)? ) => {
177impl CrateDefItems for $name {}
178 };
179}