Skip to main content

rustc_hir/
target.rs

1//! This module implements some validity checks for attributes.
2//! In particular it verifies that `#[inline]` and `#[repr]` attributes are
3//! attached to items that actually support them and if there are
4//! conflicts between multiple such attributes attached to the same
5//! item.
6
7use std::fmt::{self, Display};
8
9use rustc_ast::visit::AssocCtxt;
10use rustc_ast::{AssocItemKind, ForeignItemKind, ast};
11use rustc_macros::HashStable_Generic;
12
13use crate::def::DefKind;
14use crate::{Item, ItemKind, TraitItem, TraitItemKind, hir};
15
16#[derive(#[automatically_derived]
impl ::core::marker::Copy for GenericParamKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for GenericParamKind {
    #[inline]
    fn clone(&self) -> GenericParamKind { *self }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for GenericParamKind {
    #[inline]
    fn eq(&self, other: &GenericParamKind) -> 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::fmt::Debug for GenericParamKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        ::core::fmt::Formatter::write_str(f,
            match self {
                GenericParamKind::Type => "Type",
                GenericParamKind::Lifetime => "Lifetime",
                GenericParamKind::Const => "Const",
            })
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for GenericParamKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {}
}Eq, const _: () =
    {
        impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for GenericParamKind where __CTX: crate::HashStableContext {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    GenericParamKind::Type => {}
                    GenericParamKind::Lifetime => {}
                    GenericParamKind::Const => {}
                }
            }
        }
    };HashStable_Generic)]
17pub enum GenericParamKind {
18    Type,
19    Lifetime,
20    Const,
21}
22
23#[derive(#[automatically_derived]
impl ::core::marker::Copy for MethodKind { }Copy, #[automatically_derived]
impl ::core::clone::Clone for MethodKind {
    #[inline]
    fn clone(&self) -> MethodKind {
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for MethodKind {
    #[inline]
    fn eq(&self, other: &MethodKind) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (MethodKind::Trait { body: __self_0 }, MethodKind::Trait {
                    body: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for MethodKind {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            MethodKind::Trait { body: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Trait",
                    "body", &__self_0),
            MethodKind::TraitImpl =>
                ::core::fmt::Formatter::write_str(f, "TraitImpl"),
            MethodKind::Inherent =>
                ::core::fmt::Formatter::write_str(f, "Inherent"),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for MethodKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, const _: () =
    {
        impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for MethodKind where __CTX: crate::HashStableContext {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    MethodKind::Trait { body: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    MethodKind::TraitImpl => {}
                    MethodKind::Inherent => {}
                }
            }
        }
    };HashStable_Generic)]
24pub enum MethodKind {
25    /// Method in a `trait Trait` block
26    Trait {
27        /// Whether a default is provided for this method
28        body: bool,
29    },
30    /// Method in a `impl Trait for Type` block
31    TraitImpl,
32    /// Method in a `impl Type` block
33    Inherent,
34}
35
36#[derive(#[automatically_derived]
impl ::core::marker::Copy for Target { }Copy, #[automatically_derived]
impl ::core::clone::Clone for Target {
    #[inline]
    fn clone(&self) -> Target {
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<MethodKind>;
        let _: ::core::clone::AssertParamIsClone<GenericParamKind>;
        *self
    }
}Clone, #[automatically_derived]
impl ::core::cmp::PartialEq for Target {
    #[inline]
    fn eq(&self, other: &Target) -> bool {
        let __self_discr = ::core::intrinsics::discriminant_value(self);
        let __arg1_discr = ::core::intrinsics::discriminant_value(other);
        __self_discr == __arg1_discr &&
            match (self, other) {
                (Target::Impl { of_trait: __self_0 }, Target::Impl {
                    of_trait: __arg1_0 }) => __self_0 == __arg1_0,
                (Target::Method(__self_0), Target::Method(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Target::GenericParam { kind: __self_0, has_default: __self_1
                    }, Target::GenericParam {
                    kind: __arg1_0, has_default: __arg1_1 }) =>
                    __self_1 == __arg1_1 && __self_0 == __arg1_0,
                (Target::Delegation { mac: __self_0 }, Target::Delegation {
                    mac: __arg1_0 }) => __self_0 == __arg1_0,
                _ => true,
            }
    }
}PartialEq, #[automatically_derived]
impl ::core::fmt::Debug for Target {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Target::ExternCrate =>
                ::core::fmt::Formatter::write_str(f, "ExternCrate"),
            Target::Use => ::core::fmt::Formatter::write_str(f, "Use"),
            Target::Static => ::core::fmt::Formatter::write_str(f, "Static"),
            Target::Const => ::core::fmt::Formatter::write_str(f, "Const"),
            Target::Fn => ::core::fmt::Formatter::write_str(f, "Fn"),
            Target::Closure =>
                ::core::fmt::Formatter::write_str(f, "Closure"),
            Target::Mod => ::core::fmt::Formatter::write_str(f, "Mod"),
            Target::ForeignMod =>
                ::core::fmt::Formatter::write_str(f, "ForeignMod"),
            Target::GlobalAsm =>
                ::core::fmt::Formatter::write_str(f, "GlobalAsm"),
            Target::TyAlias =>
                ::core::fmt::Formatter::write_str(f, "TyAlias"),
            Target::Enum => ::core::fmt::Formatter::write_str(f, "Enum"),
            Target::Variant =>
                ::core::fmt::Formatter::write_str(f, "Variant"),
            Target::Struct => ::core::fmt::Formatter::write_str(f, "Struct"),
            Target::Field => ::core::fmt::Formatter::write_str(f, "Field"),
            Target::Union => ::core::fmt::Formatter::write_str(f, "Union"),
            Target::Trait => ::core::fmt::Formatter::write_str(f, "Trait"),
            Target::TraitAlias =>
                ::core::fmt::Formatter::write_str(f, "TraitAlias"),
            Target::Impl { of_trait: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f, "Impl",
                    "of_trait", &__self_0),
            Target::Expression =>
                ::core::fmt::Formatter::write_str(f, "Expression"),
            Target::Statement =>
                ::core::fmt::Formatter::write_str(f, "Statement"),
            Target::Arm => ::core::fmt::Formatter::write_str(f, "Arm"),
            Target::AssocConst =>
                ::core::fmt::Formatter::write_str(f, "AssocConst"),
            Target::Method(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Method",
                    &__self_0),
            Target::AssocTy =>
                ::core::fmt::Formatter::write_str(f, "AssocTy"),
            Target::ForeignFn =>
                ::core::fmt::Formatter::write_str(f, "ForeignFn"),
            Target::ForeignStatic =>
                ::core::fmt::Formatter::write_str(f, "ForeignStatic"),
            Target::ForeignTy =>
                ::core::fmt::Formatter::write_str(f, "ForeignTy"),
            Target::GenericParam { kind: __self_0, has_default: __self_1 } =>
                ::core::fmt::Formatter::debug_struct_field2_finish(f,
                    "GenericParam", "kind", __self_0, "has_default", &__self_1),
            Target::MacroDef =>
                ::core::fmt::Formatter::write_str(f, "MacroDef"),
            Target::Param => ::core::fmt::Formatter::write_str(f, "Param"),
            Target::PatField =>
                ::core::fmt::Formatter::write_str(f, "PatField"),
            Target::ExprField =>
                ::core::fmt::Formatter::write_str(f, "ExprField"),
            Target::WherePredicate =>
                ::core::fmt::Formatter::write_str(f, "WherePredicate"),
            Target::MacroCall =>
                ::core::fmt::Formatter::write_str(f, "MacroCall"),
            Target::Crate => ::core::fmt::Formatter::write_str(f, "Crate"),
            Target::Delegation { mac: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Delegation", "mac", &__self_0),
        }
    }
}Debug, #[automatically_derived]
impl ::core::cmp::Eq for Target {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_receiver_is_total_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<MethodKind>;
        let _: ::core::cmp::AssertParamIsEq<GenericParamKind>;
    }
}Eq, const _: () =
    {
        impl<__CTX> ::rustc_data_structures::stable_hasher::HashStable<__CTX>
            for Target where __CTX: crate::HashStableContext {
            #[inline]
            fn hash_stable(&self, __hcx: &mut __CTX,
                __hasher:
                    &mut ::rustc_data_structures::stable_hasher::StableHasher) {
                ::std::mem::discriminant(self).hash_stable(__hcx, __hasher);
                match *self {
                    Target::ExternCrate => {}
                    Target::Use => {}
                    Target::Static => {}
                    Target::Const => {}
                    Target::Fn => {}
                    Target::Closure => {}
                    Target::Mod => {}
                    Target::ForeignMod => {}
                    Target::GlobalAsm => {}
                    Target::TyAlias => {}
                    Target::Enum => {}
                    Target::Variant => {}
                    Target::Struct => {}
                    Target::Field => {}
                    Target::Union => {}
                    Target::Trait => {}
                    Target::TraitAlias => {}
                    Target::Impl { of_trait: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    Target::Expression => {}
                    Target::Statement => {}
                    Target::Arm => {}
                    Target::AssocConst => {}
                    Target::Method(ref __binding_0) => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                    Target::AssocTy => {}
                    Target::ForeignFn => {}
                    Target::ForeignStatic => {}
                    Target::ForeignTy => {}
                    Target::GenericParam {
                        kind: ref __binding_0, has_default: ref __binding_1 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                        { __binding_1.hash_stable(__hcx, __hasher); }
                    }
                    Target::MacroDef => {}
                    Target::Param => {}
                    Target::PatField => {}
                    Target::ExprField => {}
                    Target::WherePredicate => {}
                    Target::MacroCall => {}
                    Target::Crate => {}
                    Target::Delegation { mac: ref __binding_0 } => {
                        { __binding_0.hash_stable(__hcx, __hasher); }
                    }
                }
            }
        }
    };HashStable_Generic)]
37pub enum Target {
38    ExternCrate,
39    Use,
40    Static,
41    Const,
42    Fn,
43    Closure,
44    Mod,
45    ForeignMod,
46    GlobalAsm,
47    TyAlias,
48    Enum,
49    Variant,
50    Struct,
51    Field,
52    Union,
53    Trait,
54    TraitAlias,
55    Impl { of_trait: bool },
56    Expression,
57    Statement,
58    Arm,
59    AssocConst,
60    Method(MethodKind),
61    AssocTy,
62    ForeignFn,
63    ForeignStatic,
64    ForeignTy,
65    GenericParam { kind: GenericParamKind, has_default: bool },
66    MacroDef,
67    Param,
68    PatField,
69    ExprField,
70    WherePredicate,
71    MacroCall,
72    Crate,
73    Delegation { mac: bool },
74}
75
76impl Display for Target {
77    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
78        f.write_fmt(format_args!("{0}", Self::name(*self)))write!(f, "{}", Self::name(*self))
79    }
80}
81
82impl ::rustc_error_messages::IntoDiagArg for Target {
    fn into_diag_arg(self, path: &mut Option<std::path::PathBuf>)
        -> ::rustc_error_messages::DiagArgValue {
        self.to_string().into_diag_arg(path)
    }
}rustc_error_messages::into_diag_arg_using_display!(Target);
83
84impl Target {
85    pub fn is_associated_item(self) -> bool {
86        match self {
87            Target::AssocConst | Target::AssocTy | Target::Method(_) => true,
88            Target::ExternCrate
89            | Target::Use
90            | Target::Static
91            | Target::Const
92            | Target::Fn
93            | Target::Closure
94            | Target::Mod
95            | Target::ForeignMod
96            | Target::GlobalAsm
97            | Target::TyAlias
98            | Target::Enum
99            | Target::Variant
100            | Target::Struct
101            | Target::Field
102            | Target::Union
103            | Target::Trait
104            | Target::TraitAlias
105            | Target::Impl { .. }
106            | Target::Expression
107            | Target::Statement
108            | Target::Arm
109            | Target::ForeignFn
110            | Target::ForeignStatic
111            | Target::ForeignTy
112            | Target::GenericParam { .. }
113            | Target::MacroDef
114            | Target::Param
115            | Target::PatField
116            | Target::ExprField
117            | Target::MacroCall
118            | Target::Crate
119            | Target::WherePredicate
120            | Target::Delegation { .. } => false,
121        }
122    }
123
124    pub fn from_item(item: &Item<'_>) -> Target {
125        match item.kind {
126            ItemKind::ExternCrate(..) => Target::ExternCrate,
127            ItemKind::Use(..) => Target::Use,
128            ItemKind::Static { .. } => Target::Static,
129            ItemKind::Const(..) => Target::Const,
130            ItemKind::Fn { .. } => Target::Fn,
131            ItemKind::Macro(..) => Target::MacroDef,
132            ItemKind::Mod(..) => Target::Mod,
133            ItemKind::ForeignMod { .. } => Target::ForeignMod,
134            ItemKind::GlobalAsm { .. } => Target::GlobalAsm,
135            ItemKind::TyAlias(..) => Target::TyAlias,
136            ItemKind::Enum(..) => Target::Enum,
137            ItemKind::Struct(..) => Target::Struct,
138            ItemKind::Union(..) => Target::Union,
139            ItemKind::Trait(..) => Target::Trait,
140            ItemKind::TraitAlias(..) => Target::TraitAlias,
141            ItemKind::Impl(imp_) => Target::Impl { of_trait: imp_.of_trait.is_some() },
142        }
143    }
144
145    // FIXME: For now, should only be used with def_kinds from ItemIds
146    pub fn from_def_kind(def_kind: DefKind) -> Target {
147        match def_kind {
148            DefKind::ExternCrate => Target::ExternCrate,
149            DefKind::Use => Target::Use,
150            DefKind::Static { .. } => Target::Static,
151            DefKind::Const => Target::Const,
152            DefKind::Fn => Target::Fn,
153            DefKind::Macro(..) => Target::MacroDef,
154            DefKind::Mod => Target::Mod,
155            DefKind::ForeignMod => Target::ForeignMod,
156            DefKind::GlobalAsm => Target::GlobalAsm,
157            DefKind::TyAlias => Target::TyAlias,
158            DefKind::Enum => Target::Enum,
159            DefKind::Struct => Target::Struct,
160            DefKind::Union => Target::Union,
161            DefKind::Trait => Target::Trait,
162            DefKind::TraitAlias => Target::TraitAlias,
163            DefKind::Impl { of_trait } => Target::Impl { of_trait },
164            _ => { ::core::panicking::panic_fmt(format_args!("impossible case reached")); }panic!("impossible case reached"),
165        }
166    }
167
168    pub fn from_ast_item(item: &ast::Item) -> Target {
169        match item.kind {
170            ast::ItemKind::ExternCrate(..) => Target::ExternCrate,
171            ast::ItemKind::Use(..) => Target::Use,
172            ast::ItemKind::Static { .. } => Target::Static,
173            ast::ItemKind::Const(..) => Target::Const,
174            ast::ItemKind::ConstBlock(..) => Target::Const,
175            ast::ItemKind::Fn { .. } => Target::Fn,
176            ast::ItemKind::Mod(..) => Target::Mod,
177            ast::ItemKind::ForeignMod { .. } => Target::ForeignMod,
178            ast::ItemKind::GlobalAsm { .. } => Target::GlobalAsm,
179            ast::ItemKind::TyAlias(..) => Target::TyAlias,
180            ast::ItemKind::Enum(..) => Target::Enum,
181            ast::ItemKind::Struct(..) => Target::Struct,
182            ast::ItemKind::Union(..) => Target::Union,
183            ast::ItemKind::Trait(..) => Target::Trait,
184            ast::ItemKind::TraitAlias(..) => Target::TraitAlias,
185            ast::ItemKind::Impl(ref i) => Target::Impl { of_trait: i.of_trait.is_some() },
186            ast::ItemKind::MacCall(..) => Target::MacroCall,
187            ast::ItemKind::MacroDef(..) => Target::MacroDef,
188            ast::ItemKind::Delegation(..) => Target::Delegation { mac: false },
189            ast::ItemKind::DelegationMac(..) => Target::Delegation { mac: true },
190        }
191    }
192
193    pub fn from_foreign_item_kind(kind: &ast::ForeignItemKind) -> Target {
194        match kind {
195            ForeignItemKind::Static(_) => Target::ForeignStatic,
196            ForeignItemKind::Fn(_) => Target::ForeignFn,
197            ForeignItemKind::TyAlias(_) => Target::ForeignTy,
198            ForeignItemKind::MacCall(_) => Target::MacroCall,
199        }
200    }
201
202    pub fn from_trait_item(trait_item: &TraitItem<'_>) -> Target {
203        match trait_item.kind {
204            TraitItemKind::Const(..) => Target::AssocConst,
205            TraitItemKind::Fn(_, hir::TraitFn::Required(_)) => {
206                Target::Method(MethodKind::Trait { body: false })
207            }
208            TraitItemKind::Fn(_, hir::TraitFn::Provided(_)) => {
209                Target::Method(MethodKind::Trait { body: true })
210            }
211            TraitItemKind::Type(..) => Target::AssocTy,
212        }
213    }
214
215    pub fn from_foreign_item(foreign_item: &hir::ForeignItem<'_>) -> Target {
216        match foreign_item.kind {
217            hir::ForeignItemKind::Fn(..) => Target::ForeignFn,
218            hir::ForeignItemKind::Static(..) => Target::ForeignStatic,
219            hir::ForeignItemKind::Type => Target::ForeignTy,
220        }
221    }
222
223    pub fn from_generic_param(generic_param: &hir::GenericParam<'_>) -> Target {
224        match generic_param.kind {
225            hir::GenericParamKind::Type { default, .. } => Target::GenericParam {
226                kind: GenericParamKind::Type,
227                has_default: default.is_some(),
228            },
229            hir::GenericParamKind::Lifetime { .. } => {
230                Target::GenericParam { kind: GenericParamKind::Lifetime, has_default: false }
231            }
232            hir::GenericParamKind::Const { default, .. } => Target::GenericParam {
233                kind: GenericParamKind::Const,
234                has_default: default.is_some(),
235            },
236        }
237    }
238
239    pub fn from_assoc_item_kind(kind: &ast::AssocItemKind, assoc_ctxt: AssocCtxt) -> Target {
240        match kind {
241            AssocItemKind::Const(_) => Target::AssocConst,
242            AssocItemKind::Fn(f) => Target::Method(match assoc_ctxt {
243                AssocCtxt::Trait => MethodKind::Trait { body: f.body.is_some() },
244                AssocCtxt::Impl { of_trait, .. } => {
245                    if of_trait {
246                        MethodKind::TraitImpl
247                    } else {
248                        MethodKind::Inherent
249                    }
250                }
251            }),
252            AssocItemKind::Type(_) => Target::AssocTy,
253            AssocItemKind::Delegation(_) => Target::Delegation { mac: false },
254            AssocItemKind::DelegationMac(_) => Target::Delegation { mac: true },
255            AssocItemKind::MacCall(_) => Target::MacroCall,
256        }
257    }
258
259    pub fn from_expr(expr: &ast::Expr) -> Self {
260        match &expr.kind {
261            ast::ExprKind::Closure(..) | ast::ExprKind::Gen(..) => Self::Closure,
262            ast::ExprKind::Paren(e) => Self::from_expr(&e),
263            _ => Self::Expression,
264        }
265    }
266
267    pub fn name(self) -> &'static str {
268        match self {
269            Target::ExternCrate => "extern crate",
270            Target::Use => "use",
271            Target::Static => "static",
272            Target::Const => "constant",
273            Target::Fn => "function",
274            Target::Closure => "closure",
275            Target::Mod => "module",
276            Target::ForeignMod => "foreign module",
277            Target::GlobalAsm => "global asm",
278            Target::TyAlias => "type alias",
279            Target::Enum => "enum",
280            Target::Variant => "enum variant",
281            Target::Struct => "struct",
282            Target::Field => "struct field",
283            Target::Union => "union",
284            Target::Trait => "trait",
285            Target::TraitAlias => "trait alias",
286            Target::Impl { .. } => "implementation block",
287            Target::Expression => "expression",
288            Target::Statement => "statement",
289            Target::Arm => "match arm",
290            Target::AssocConst => "associated const",
291            Target::Method(kind) => match kind {
292                MethodKind::Inherent => "inherent method",
293                MethodKind::Trait { body: false } => "required trait method",
294                MethodKind::Trait { body: true } => "provided trait method",
295                MethodKind::TraitImpl => "trait method in an impl block",
296            },
297            Target::AssocTy => "associated type",
298            Target::ForeignFn => "foreign function",
299            Target::ForeignStatic => "foreign static item",
300            Target::ForeignTy => "foreign type",
301            Target::GenericParam { kind, .. } => match kind {
302                GenericParamKind::Type => "type parameter",
303                GenericParamKind::Lifetime => "lifetime parameter",
304                GenericParamKind::Const => "const parameter",
305            },
306            Target::MacroDef => "macro def",
307            Target::Param => "function param",
308            Target::PatField => "pattern field",
309            Target::ExprField => "struct field",
310            Target::WherePredicate => "where predicate",
311            Target::MacroCall => "macro call",
312            Target::Crate => "crate",
313            Target::Delegation { .. } => "delegation",
314        }
315    }
316
317    pub fn plural_name(self) -> &'static str {
318        match self {
319            Target::ExternCrate => "extern crates",
320            Target::Use => "use statements",
321            Target::Static => "statics",
322            Target::Const => "constants",
323            Target::Fn => "functions",
324            Target::Closure => "closures",
325            Target::Mod => "modules",
326            Target::ForeignMod => "foreign modules",
327            Target::GlobalAsm => "global asms",
328            Target::TyAlias => "type aliases",
329            Target::Enum => "enums",
330            Target::Variant => "enum variants",
331            Target::Struct => "structs",
332            Target::Field => "struct fields",
333            Target::Union => "unions",
334            Target::Trait => "traits",
335            Target::TraitAlias => "trait aliases",
336            Target::Impl { of_trait: false } => "inherent impl blocks",
337            Target::Impl { of_trait: true } => "trait impl blocks",
338            Target::Expression => "expressions",
339            Target::Statement => "statements",
340            Target::Arm => "match arms",
341            Target::AssocConst => "associated consts",
342            Target::Method(kind) => match kind {
343                MethodKind::Inherent => "inherent methods",
344                MethodKind::Trait { body: false } => "required trait methods",
345                MethodKind::Trait { body: true } => "provided trait methods",
346                MethodKind::TraitImpl => "trait methods in impl blocks",
347            },
348            Target::AssocTy => "associated types",
349            Target::ForeignFn => "foreign functions",
350            Target::ForeignStatic => "foreign statics",
351            Target::ForeignTy => "foreign types",
352            Target::GenericParam { kind, has_default: _ } => match kind {
353                GenericParamKind::Type => "type parameters",
354                GenericParamKind::Lifetime => "lifetime parameters",
355                GenericParamKind::Const => "const parameters",
356            },
357            Target::MacroDef => "macro defs",
358            Target::Param => "function params",
359            Target::PatField => "pattern fields",
360            Target::ExprField => "struct fields",
361            Target::WherePredicate => "where predicates",
362            Target::MacroCall => "macro calls",
363            Target::Crate => "crates",
364            Target::Delegation { .. } => "delegations",
365        }
366    }
367}