Skip to main content

rustc_attr_ir/
target.rs

1//! This module lists attribute targets, with conversions from other types.
2
3use std::fmt::{self, Display};
4
5use rustc_abi::ExternAbi;
6pub use rustc_ast::visit::AssocCtxt;
7use rustc_ast::{
8    Arm, AssocItemKind, Closure, ConstBlockItem, ConstItem, Crate, EnumDef, Expr, ExprField,
9    FieldDef, Fn, ForeignItemKind, ForeignMod, GenericParam, Generics, Impl, InlineAsm, MacroDef,
10    ModKind, Param, Pat, Safety, StaticItem, Stmt, Trait, TraitAlias, TyAlias, UseTree, Variant,
11    VariantData, WherePredicate, ast,
12};
13use rustc_macros::StableHash;
14use rustc_span::{Ident, Symbol};
15
16/// This enum lists all possible types of AST items.
17#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'a>
    ::core::clone::TrivialClone for AstTarget<'a> {
}
#[automatically_derived]impl<'a> ::core::clone::Clone for AstTarget<'a> {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<&'a ConstItem>;
        let _: ::core::clone::AssertParamIsClone<&'a Fn>;
        let _: ::core::clone::AssertParamIsClone<&'a TyAlias>;
        let _: ::core::clone::AssertParamIsClone<&'a StaticItem>;
        let _: ::core::clone::AssertParamIsClone<&'a Fn>;
        let _: ::core::clone::AssertParamIsClone<&'a TyAlias>;
        let _: ::core::clone::AssertParamIsClone<&'a Option<Symbol>>;
        let _: ::core::clone::AssertParamIsClone<&'a Ident>;
        let _: ::core::clone::AssertParamIsClone<&'a UseTree>;
        let _: ::core::clone::AssertParamIsClone<&'a StaticItem>;
        let _: ::core::clone::AssertParamIsClone<ConstTypeAstTarget<'a>>;
        let _: ::core::clone::AssertParamIsClone<&'a Fn>;
        let _: ::core::clone::AssertParamIsClone<&'a Safety>;
        let _: ::core::clone::AssertParamIsClone<&'a Ident>;
        let _: ::core::clone::AssertParamIsClone<&'a ModKind>;
        let _: ::core::clone::AssertParamIsClone<&'a ForeignMod>;
        let _: ::core::clone::AssertParamIsClone<&'a InlineAsm>;
        let _: ::core::clone::AssertParamIsClone<&'a TyAlias>;
        let _: ::core::clone::AssertParamIsClone<&'a Ident>;
        let _: ::core::clone::AssertParamIsClone<&'a Generics>;
        let _: ::core::clone::AssertParamIsClone<&'a EnumDef>;
        let _: ::core::clone::AssertParamIsClone<&'a Ident>;
        let _: ::core::clone::AssertParamIsClone<&'a Generics>;
        let _: ::core::clone::AssertParamIsClone<&'a VariantData>;
        let _: ::core::clone::AssertParamIsClone<&'a Ident>;
        let _: ::core::clone::AssertParamIsClone<&'a Generics>;
        let _: ::core::clone::AssertParamIsClone<&'a VariantData>;
        let _: ::core::clone::AssertParamIsClone<&'a Trait>;
        let _: ::core::clone::AssertParamIsClone<&'a TraitAlias>;
        let _: ::core::clone::AssertParamIsClone<&'a Impl>;
        let _: ::core::clone::AssertParamIsClone<&'a Ident>;
        let _: ::core::clone::AssertParamIsClone<&'a MacroDef>;
        let _: ::core::clone::AssertParamIsClone<&'a Closure>;
        let _: ::core::clone::AssertParamIsClone<&'a Expr>;
        let _: ::core::clone::AssertParamIsClone<&'a Arm>;
        let _: ::core::clone::AssertParamIsClone<&'a Crate>;
        let _: ::core::clone::AssertParamIsClone<&'a ExprField>;
        let _: ::core::clone::AssertParamIsClone<&'a FieldDef>;
        let _: ::core::clone::AssertParamIsClone<&'a GenericParam>;
        let _: ::core::clone::AssertParamIsClone<&'a Param>;
        let _: ::core::clone::AssertParamIsClone<&'a Pat>;
        let _: ::core::clone::AssertParamIsClone<&'a Stmt>;
        let _: ::core::clone::AssertParamIsClone<&'a Variant>;
        let _: ::core::clone::AssertParamIsClone<&'a WherePredicate>;
        *self
    }
}Clone, #[automatically_derived]impl<'a> ::core::marker::Copy for AstTarget<'a> { }Copy, #[automatically_derived]impl<'a> ::core::fmt::Debug for AstTarget<'a> {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::Delegation =>
                ::core::fmt::Formatter::write_str(f, "Delegation"),
            Self::MacroCall =>
                ::core::fmt::Formatter::write_str(f, "MacroCall"),
            Self::AssocConst(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AssocConst", &__self_0),
            Self::Method(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Method",
                    &__self_0),
            Self::AssocTy(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AssocTy", &__self_0),
            Self::ForeignStatic(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForeignStatic", &__self_0),
            Self::ForeignFn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForeignFn", &__self_0),
            Self::ForeignTy(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForeignTy", &__self_0),
            Self::ExternCrate(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "ExternCrate", __self_0, &__self_1),
            Self::Use(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Use",
                    &__self_0),
            Self::Static(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Static",
                    &__self_0),
            Self::Const(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Const",
                    &__self_0),
            Self::Fn(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Fn",
                    &__self_0),
            Self::Mod(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Mod",
                    __self_0, __self_1, &__self_2),
            Self::ForeignMod(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ForeignMod", &__self_0),
            Self::GlobalAsm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "GlobalAsm", &__self_0),
            Self::TyAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TyAlias", &__self_0),
            Self::Enum(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Enum",
                    __self_0, __self_1, &__self_2),
            Self::Struct(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Struct",
                    __self_0, __self_1, &__self_2),
            Self::Union(__self_0, __self_1, __self_2) =>
                ::core::fmt::Formatter::debug_tuple_field3_finish(f, "Union",
                    __self_0, __self_1, &__self_2),
            Self::Trait(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Trait",
                    &__self_0),
            Self::TraitAlias(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "TraitAlias", &__self_0),
            Self::Impl(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Impl",
                    &__self_0),
            Self::MacroDef(__self_0, __self_1) =>
                ::core::fmt::Formatter::debug_tuple_field2_finish(f,
                    "MacroDef", __self_0, &__self_1),
            Self::Closure(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Closure", &__self_0),
            Self::Expression(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Expression", &__self_0),
            Self::Arm(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Arm",
                    &__self_0),
            Self::Crate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Crate",
                    &__self_0),
            Self::ExprField(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ExprField", &__self_0),
            Self::Field(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Field",
                    &__self_0),
            Self::GenericParam(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "GenericParam", &__self_0),
            Self::Param(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Param",
                    &__self_0),
            Self::Pat(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Pat",
                    &__self_0),
            Self::Statement(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Statement", &__self_0),
            Self::Variant(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "Variant", &__self_0),
            Self::WherePredicate(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "WherePredicate", &__self_0),
            Self::None => ::core::fmt::Formatter::write_str(f, "None"),
        }
    }
}Debug)]
18pub enum AstTarget<'a> {
19    // Target types that may correspond to different kinds of items.
20    Delegation,
21    MacroCall,
22
23    // Target types that correspond exclusively to `AssocItem` kind. Mapping is obtained from `Target::from_assoc_item_kind`.
24    AssocConst(&'a ConstItem),
25    Method(&'a Fn),
26    AssocTy(&'a TyAlias),
27
28    // Target types that correspond exclusively to `ForeignItem` kind. Mapping is obtained from `Target::from_foreign_item_kind`.
29    ForeignStatic(&'a StaticItem),
30    ForeignFn(&'a Fn),
31    ForeignTy(&'a TyAlias),
32
33    // Target types that correspond exclusively to `Item` kind. Mapping is obtained from `Target::from_ast_item`.
34    ExternCrate(&'a Option<Symbol>, &'a Ident),
35    Use(&'a UseTree),
36    Static(&'a StaticItem),
37    Const(ConstTypeAstTarget<'a>),
38    Fn(&'a Fn),
39    Mod(&'a Safety, &'a Ident, &'a ModKind),
40    ForeignMod(&'a ForeignMod),
41    GlobalAsm(&'a InlineAsm),
42    TyAlias(&'a TyAlias),
43    Enum(&'a Ident, &'a Generics, &'a EnumDef),
44    Struct(&'a Ident, &'a Generics, &'a VariantData),
45    Union(&'a Ident, &'a Generics, &'a VariantData),
46    Trait(&'a Trait),
47    TraitAlias(&'a TraitAlias),
48    Impl(&'a Impl),
49    MacroDef(&'a Ident, &'a MacroDef),
50
51    // Target types that correspond exclusively to `Expr` kind. Mapping is obtained from `Target::from_expr`.
52    Closure(&'a Closure),
53    Expression(&'a Expr),
54
55    Arm(&'a Arm),
56    Crate(&'a Crate),
57    ExprField(&'a ExprField),
58    Field(&'a FieldDef),
59    GenericParam(&'a GenericParam),
60    Param(&'a Param),
61    Pat(&'a Pat),
62    Statement(&'a Stmt),
63    Variant(&'a Variant),
64    WherePredicate(&'a WherePredicate),
65
66    // Only reserved for cases when it is not possible to obtain detailed Ast Target
67    None,
68}
69
70#[derive(#[automatically_derived]#[doc(hidden)]unsafe impl<'a>
    ::core::clone::TrivialClone for ConstTypeAstTarget<'a> {
}
#[automatically_derived]impl<'a> ::core::clone::Clone for
    ConstTypeAstTarget<'a> {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<&'a ConstItem>;
        let _: ::core::clone::AssertParamIsClone<&'a ConstBlockItem>;
        *self
    }
}Clone, #[automatically_derived]impl<'a> ::core::marker::Copy for
    ConstTypeAstTarget<'a> {
}Copy, #[automatically_derived]impl<'a> ::core::fmt::Debug for ConstTypeAstTarget<'a>
    {
    #[inline]
    fn fmt(&self, f: &mut ::core::fmt::Formatter) -> ::core::fmt::Result {
        match self {
            Self::ConstItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstItem", &__self_0),
            Self::ConstBlockItem(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "ConstBlockItem", &__self_0),
        }
    }
}Debug)]
71pub enum ConstTypeAstTarget<'a> {
72    ConstItem(&'a ConstItem),
73    ConstBlockItem(&'a ConstBlockItem),
74}
75
76#[derive(#[automatically_derived]impl ::core::marker::Copy for MethodKind { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for MethodKind {
}
#[automatically_derived]impl ::core::clone::Clone for MethodKind {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<bool>;
        *self
    }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for
    MethodKind {
}
#[automatically_derived]impl ::core::cmp::PartialEq for MethodKind {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Trait { body: __self_0 }, Self::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 {
            Self::Trait { body: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Trait body", &__self_0),
            Self::TraitImpl =>
                ::core::fmt::Formatter::write_str(f, "TraitImpl"),
            Self::Inherent =>
                ::core::fmt::Formatter::write_str(f, "Inherent"),
        }
    }
}Debug, #[automatically_derived]impl ::core::cmp::Eq for MethodKind {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
    }
}Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for MethodKind {
            #[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 {
                    MethodKind::Trait { body: ref __binding_0 } =>
                        0u8.stable_hash(__hcx, __hasher),
                    MethodKind::TraitImpl => 1u8.stable_hash(__hcx, __hasher),
                    MethodKind::Inherent => 2u8.stable_hash(__hcx, __hasher),
                }
                match *self {
                    MethodKind::Trait { body: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    MethodKind::TraitImpl => {}
                    MethodKind::Inherent => {}
                }
            }
        }
    };StableHash)]
77pub enum MethodKind {
78    /// Method in a `trait Trait` block
79    Trait {
80        /// Whether a default is provided for this method
81        body: bool,
82    },
83    /// Method in a `impl Trait for Type` block
84    TraitImpl,
85    /// Method in a `impl Type` block
86    Inherent,
87}
88
89// FIXME(rtjkro): `AstTarget` has nearly one-to-one mapping with `Target`, barring the extra fields from `AssocConst`, `Method`, and `AssocTy`.
90// In the future, remove `Target` and use `AstTarget` instead.
91#[derive(#[automatically_derived]impl ::core::marker::Copy for Target { }Copy, #[automatically_derived]#[doc(hidden)]unsafe impl ::core::clone::TrivialClone
    for Target {
}
#[automatically_derived]impl ::core::clone::Clone for Target {
    #[inline]
    fn clone(&self) -> Self {
        let _: ::core::clone::AssertParamIsClone<bool>;
        let _: ::core::clone::AssertParamIsClone<AssocCtxt>;
        let _: ::core::clone::AssertParamIsClone<MethodKind>;
        *self
    }
}Clone, #[automatically_derived]impl ::core::marker::StructuralPartialEq for Target {
}
#[automatically_derived]impl ::core::cmp::PartialEq for Target {
    #[inline]
    fn eq(&self, other: &Self) -> bool {
        ::core::intrinsics::discriminant_value(self) ==
                ::core::intrinsics::discriminant_value(other) &&
            match (self, other) {
                (Self::Impl { of_trait: __self_0 }, Self::Impl {
                    of_trait: __arg1_0 }) => __self_0 == __arg1_0,
                (Self::AssocConst(__self_0), Self::AssocConst(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Method(__self_0), Self::Method(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::AssocTy(__self_0), Self::AssocTy(__arg1_0)) =>
                    __self_0 == __arg1_0,
                (Self::Delegation { mac: __self_0 }, Self::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 {
            Self::ExternCrate =>
                ::core::fmt::Formatter::write_str(f, "ExternCrate"),
            Self::Use => ::core::fmt::Formatter::write_str(f, "Use"),
            Self::Static => ::core::fmt::Formatter::write_str(f, "Static"),
            Self::Const => ::core::fmt::Formatter::write_str(f, "Const"),
            Self::Fn => ::core::fmt::Formatter::write_str(f, "Fn"),
            Self::Closure => ::core::fmt::Formatter::write_str(f, "Closure"),
            Self::Mod => ::core::fmt::Formatter::write_str(f, "Mod"),
            Self::ForeignMod =>
                ::core::fmt::Formatter::write_str(f, "ForeignMod"),
            Self::GlobalAsm =>
                ::core::fmt::Formatter::write_str(f, "GlobalAsm"),
            Self::TyAlias => ::core::fmt::Formatter::write_str(f, "TyAlias"),
            Self::Enum => ::core::fmt::Formatter::write_str(f, "Enum"),
            Self::Variant => ::core::fmt::Formatter::write_str(f, "Variant"),
            Self::Struct => ::core::fmt::Formatter::write_str(f, "Struct"),
            Self::Field => ::core::fmt::Formatter::write_str(f, "Field"),
            Self::Union => ::core::fmt::Formatter::write_str(f, "Union"),
            Self::Trait => ::core::fmt::Formatter::write_str(f, "Trait"),
            Self::TraitAlias =>
                ::core::fmt::Formatter::write_str(f, "TraitAlias"),
            Self::Impl { of_trait: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Impl of_trait", &__self_0),
            Self::Expression =>
                ::core::fmt::Formatter::write_str(f, "Expression"),
            Self::Statement =>
                ::core::fmt::Formatter::write_str(f, "Statement"),
            Self::Arm => ::core::fmt::Formatter::write_str(f, "Arm"),
            Self::AssocConst(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AssocConst", &__self_0),
            Self::Method(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f, "Method",
                    &__self_0),
            Self::AssocTy(__self_0) =>
                ::core::fmt::Formatter::debug_tuple_field1_finish(f,
                    "AssocTy", &__self_0),
            Self::ForeignFn =>
                ::core::fmt::Formatter::write_str(f, "ForeignFn"),
            Self::ForeignStatic =>
                ::core::fmt::Formatter::write_str(f, "ForeignStatic"),
            Self::ForeignTy =>
                ::core::fmt::Formatter::write_str(f, "ForeignTy"),
            Self::LifetimeParam =>
                ::core::fmt::Formatter::write_str(f, "LifetimeParam"),
            Self::TypeParam =>
                ::core::fmt::Formatter::write_str(f, "TypeParam"),
            Self::ConstParam =>
                ::core::fmt::Formatter::write_str(f, "ConstParam"),
            Self::MacroDef =>
                ::core::fmt::Formatter::write_str(f, "MacroDef"),
            Self::Param => ::core::fmt::Formatter::write_str(f, "Param"),
            Self::PatField =>
                ::core::fmt::Formatter::write_str(f, "PatField"),
            Self::ExprField =>
                ::core::fmt::Formatter::write_str(f, "ExprField"),
            Self::WherePredicate =>
                ::core::fmt::Formatter::write_str(f, "WherePredicate"),
            Self::MacroCall =>
                ::core::fmt::Formatter::write_str(f, "MacroCall"),
            Self::Crate => ::core::fmt::Formatter::write_str(f, "Crate"),
            Self::Delegation { mac: __self_0 } =>
                ::core::fmt::Formatter::debug_struct_field1_finish(f,
                    "Delegation mac", &__self_0),
            Self::ForLoop => ::core::fmt::Formatter::write_str(f, "ForLoop"),
            Self::While => ::core::fmt::Formatter::write_str(f, "While"),
            Self::Loop => ::core::fmt::Formatter::write_str(f, "Loop"),
            Self::Break => ::core::fmt::Formatter::write_str(f, "Break"),
        }
    }
}Debug, #[automatically_derived]impl ::core::cmp::Eq for Target {
    #[inline]
    #[doc(hidden)]
    #[coverage(off)]
    fn assert_fields_are_eq(&self) {
        let _: ::core::cmp::AssertParamIsEq<bool>;
        let _: ::core::cmp::AssertParamIsEq<AssocCtxt>;
        let _: ::core::cmp::AssertParamIsEq<MethodKind>;
    }
}Eq, const _: () =
    {
        impl ::rustc_data_structures::stable_hash::StableHash for Target {
            #[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 {
                    Target::ExternCrate => 0u8.stable_hash(__hcx, __hasher),
                    Target::Use => 1u8.stable_hash(__hcx, __hasher),
                    Target::Static => 2u8.stable_hash(__hcx, __hasher),
                    Target::Const => 3u8.stable_hash(__hcx, __hasher),
                    Target::Fn => 4u8.stable_hash(__hcx, __hasher),
                    Target::Closure => 5u8.stable_hash(__hcx, __hasher),
                    Target::Mod => 6u8.stable_hash(__hcx, __hasher),
                    Target::ForeignMod => 7u8.stable_hash(__hcx, __hasher),
                    Target::GlobalAsm => 8u8.stable_hash(__hcx, __hasher),
                    Target::TyAlias => 9u8.stable_hash(__hcx, __hasher),
                    Target::Enum => 10u8.stable_hash(__hcx, __hasher),
                    Target::Variant => 11u8.stable_hash(__hcx, __hasher),
                    Target::Struct => 12u8.stable_hash(__hcx, __hasher),
                    Target::Field => 13u8.stable_hash(__hcx, __hasher),
                    Target::Union => 14u8.stable_hash(__hcx, __hasher),
                    Target::Trait => 15u8.stable_hash(__hcx, __hasher),
                    Target::TraitAlias => 16u8.stable_hash(__hcx, __hasher),
                    Target::Impl { of_trait: ref __binding_0 } =>
                        17u8.stable_hash(__hcx, __hasher),
                    Target::Expression => 18u8.stable_hash(__hcx, __hasher),
                    Target::Statement => 19u8.stable_hash(__hcx, __hasher),
                    Target::Arm => 20u8.stable_hash(__hcx, __hasher),
                    Target::AssocConst(ref __binding_0) =>
                        21u8.stable_hash(__hcx, __hasher),
                    Target::Method(ref __binding_0) =>
                        22u8.stable_hash(__hcx, __hasher),
                    Target::AssocTy(ref __binding_0) =>
                        23u8.stable_hash(__hcx, __hasher),
                    Target::ForeignFn => 24u8.stable_hash(__hcx, __hasher),
                    Target::ForeignStatic => 25u8.stable_hash(__hcx, __hasher),
                    Target::ForeignTy => 26u8.stable_hash(__hcx, __hasher),
                    Target::LifetimeParam => 27u8.stable_hash(__hcx, __hasher),
                    Target::TypeParam => 28u8.stable_hash(__hcx, __hasher),
                    Target::ConstParam => 29u8.stable_hash(__hcx, __hasher),
                    Target::MacroDef => 30u8.stable_hash(__hcx, __hasher),
                    Target::Param => 31u8.stable_hash(__hcx, __hasher),
                    Target::PatField => 32u8.stable_hash(__hcx, __hasher),
                    Target::ExprField => 33u8.stable_hash(__hcx, __hasher),
                    Target::WherePredicate => 34u8.stable_hash(__hcx, __hasher),
                    Target::MacroCall => 35u8.stable_hash(__hcx, __hasher),
                    Target::Crate => 36u8.stable_hash(__hcx, __hasher),
                    Target::Delegation { mac: ref __binding_0 } =>
                        37u8.stable_hash(__hcx, __hasher),
                    Target::ForLoop => 38u8.stable_hash(__hcx, __hasher),
                    Target::While => 39u8.stable_hash(__hcx, __hasher),
                    Target::Loop => 40u8.stable_hash(__hcx, __hasher),
                    Target::Break => 41u8.stable_hash(__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.stable_hash(__hcx, __hasher); }
                    }
                    Target::Expression => {}
                    Target::Statement => {}
                    Target::Arm => {}
                    Target::AssocConst(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Target::Method(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Target::AssocTy(ref __binding_0) => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Target::ForeignFn => {}
                    Target::ForeignStatic => {}
                    Target::ForeignTy => {}
                    Target::LifetimeParam => {}
                    Target::TypeParam => {}
                    Target::ConstParam => {}
                    Target::MacroDef => {}
                    Target::Param => {}
                    Target::PatField => {}
                    Target::ExprField => {}
                    Target::WherePredicate => {}
                    Target::MacroCall => {}
                    Target::Crate => {}
                    Target::Delegation { mac: ref __binding_0 } => {
                        { __binding_0.stable_hash(__hcx, __hasher); }
                    }
                    Target::ForLoop => {}
                    Target::While => {}
                    Target::Loop => {}
                    Target::Break => {}
                }
            }
        }
    };StableHash)]
92pub enum Target {
93    ExternCrate,
94    Use,
95    Static,
96    Const,
97    Fn,
98    Closure,
99    Mod,
100    ForeignMod,
101    GlobalAsm,
102    TyAlias,
103    Enum,
104    Variant,
105    Struct,
106    Field,
107    Union,
108    Trait,
109    TraitAlias,
110    Impl { of_trait: bool },
111    Expression,
112    Statement,
113    Arm,
114    AssocConst(AssocCtxt),
115    Method(MethodKind),
116    AssocTy(AssocCtxt),
117    ForeignFn,
118    ForeignStatic,
119    ForeignTy,
120    LifetimeParam,
121    TypeParam,
122    ConstParam,
123    MacroDef,
124    Param,
125    PatField,
126    ExprField,
127    WherePredicate,
128    MacroCall,
129    Crate,
130    Delegation { mac: bool },
131    ForLoop,
132    While,
133    Loop,
134    Break,
135}
136
137impl<'a> AstTarget<'a> {
138    pub fn get_abi(&self) -> Option<ExternAbi> {
139        let ext = match self {
140            AstTarget::Method(fn_item) => fn_item.sig.header.ext,
141            AstTarget::Fn(fn_item) => fn_item.sig.header.ext,
142            AstTarget::ForeignFn(fn_item) => fn_item.sig.header.ext,
143            _ => return None,
144        };
145
146        match ext {
147            ast::Extern::None => Some(ExternAbi::Rust),
148            ast::Extern::Implicit(_) => Some(ExternAbi::FALLBACK),
149            ast::Extern::Explicit(abi, _) => Some(abi.symbol_unescaped.as_str().parse().ok()?),
150        }
151    }
152
153    pub fn get_fn_sig(&self) -> Option<&rustc_ast::ast::FnSig> {
154        match self {
155            AstTarget::Method(fn_item) => Some(&fn_item.sig),
156            AstTarget::Fn(fn_item) => Some(&fn_item.sig),
157            AstTarget::ForeignFn(fn_item) => Some(&fn_item.sig),
158            _ => None,
159        }
160    }
161
162    pub fn from_foreign_item_kind(kind: &'a ast::ForeignItemKind) -> Self {
163        match kind {
164            ForeignItemKind::Static(static_item) => AstTarget::ForeignStatic(static_item),
165            ForeignItemKind::Fn(f) => AstTarget::ForeignFn(f),
166            ForeignItemKind::TyAlias(ty_alias) => AstTarget::ForeignTy(ty_alias),
167            ForeignItemKind::MacCall(_) => AstTarget::MacroCall,
168        }
169    }
170
171    pub fn from_assoc_item_kind(kind: &'a ast::AssocItemKind) -> Self {
172        match kind {
173            AssocItemKind::Const(const_item) => AstTarget::AssocConst(const_item),
174            AssocItemKind::Fn(f) => AstTarget::Method(f),
175            AssocItemKind::Type(type_alias) => AstTarget::AssocTy(type_alias),
176            AssocItemKind::Delegation(_) => AstTarget::Delegation,
177            AssocItemKind::DelegationMac(_) => AstTarget::Delegation,
178            AssocItemKind::MacCall(_) => AstTarget::MacroCall,
179        }
180    }
181
182    pub fn from_ast_item(kind: &'a ast::ItemKind) -> Self {
183        match kind {
184            ast::ItemKind::ExternCrate(symbol, ident) => AstTarget::ExternCrate(symbol, ident),
185            ast::ItemKind::Use(use_tree) => AstTarget::Use(use_tree),
186            ast::ItemKind::Static(static_item) => AstTarget::Static(static_item),
187            ast::ItemKind::Const(const_item) => {
188                AstTarget::Const(ConstTypeAstTarget::ConstItem(const_item))
189            }
190            ast::ItemKind::ConstBlock(const_block_item) => {
191                AstTarget::Const(ConstTypeAstTarget::ConstBlockItem(const_block_item))
192            }
193            ast::ItemKind::Fn(f) => AstTarget::Fn(f),
194            ast::ItemKind::Mod(s, i, mk) => AstTarget::Mod(s, i, mk),
195            ast::ItemKind::ForeignMod(foreign_mod) => AstTarget::ForeignMod(foreign_mod),
196            ast::ItemKind::GlobalAsm(inline_asm) => AstTarget::GlobalAsm(inline_asm),
197            ast::ItemKind::TyAlias(ty_alias) => AstTarget::TyAlias(ty_alias),
198            ast::ItemKind::Enum(i, g, ed) => AstTarget::Enum(i, g, ed),
199            ast::ItemKind::Struct(i, g, vd) => AstTarget::Struct(i, g, vd),
200            ast::ItemKind::Union(i, g, vd) => AstTarget::Union(i, g, vd),
201            ast::ItemKind::Trait(trait_kind) => AstTarget::Trait(trait_kind),
202            ast::ItemKind::TraitAlias(trait_alias) => AstTarget::TraitAlias(trait_alias),
203            ast::ItemKind::Impl(i) => AstTarget::Impl(i),
204            ast::ItemKind::MacCall(..) => AstTarget::MacroCall,
205            ast::ItemKind::MacroDef(ident, macro_def) => AstTarget::MacroDef(ident, macro_def),
206            ast::ItemKind::Delegation(..) => AstTarget::Delegation,
207            ast::ItemKind::DelegationMac(..) => AstTarget::Delegation,
208            ast::ItemKind::TestBinderConstraints(..) => AstTarget::MacroCall,
209        }
210    }
211}
212
213impl Display for Target {
214    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
215        f.write_fmt(format_args!("{0}", Self::name(*self)))write!(f, "{}", Self::name(*self))
216    }
217}
218
219impl ::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);
220
221impl Target {
222    pub fn is_associated_item(self) -> bool {
223        match self {
224            Target::AssocConst(_) | Target::AssocTy(_) | Target::Method(_) => true,
225            Target::ExternCrate
226            | Target::Use
227            | Target::Static
228            | Target::Const
229            | Target::Fn
230            | Target::Closure
231            | Target::Mod
232            | Target::ForeignMod
233            | Target::GlobalAsm
234            | Target::TyAlias
235            | Target::Enum
236            | Target::Variant
237            | Target::Struct
238            | Target::Field
239            | Target::Union
240            | Target::Trait
241            | Target::TraitAlias
242            | Target::Impl { .. }
243            | Target::Expression
244            | Target::Statement
245            | Target::Arm
246            | Target::ForeignFn
247            | Target::ForeignStatic
248            | Target::ForeignTy
249            | Target::TypeParam
250            | Target::LifetimeParam
251            | Target::ConstParam
252            | Target::MacroDef
253            | Target::Param
254            | Target::PatField
255            | Target::ExprField
256            | Target::MacroCall
257            | Target::Crate
258            | Target::WherePredicate
259            | Target::Delegation { .. }
260            | Target::Loop
261            | Target::While
262            | Target::ForLoop
263            | Target::Break => false,
264        }
265    }
266    pub fn from_ast_item(item: &ast::Item) -> Target {
267        match item.kind {
268            ast::ItemKind::ExternCrate(..) => Target::ExternCrate,
269            ast::ItemKind::Use(..) => Target::Use,
270            ast::ItemKind::Static { .. } => Target::Static,
271            ast::ItemKind::Const(..) => Target::Const,
272            ast::ItemKind::ConstBlock(..) => Target::Const,
273            ast::ItemKind::Fn { .. } => Target::Fn,
274            ast::ItemKind::Mod(..) => Target::Mod,
275            ast::ItemKind::ForeignMod { .. } => Target::ForeignMod,
276            ast::ItemKind::GlobalAsm { .. } => Target::GlobalAsm,
277            ast::ItemKind::TyAlias(..) => Target::TyAlias,
278            ast::ItemKind::Enum(..) => Target::Enum,
279            ast::ItemKind::Struct(..) => Target::Struct,
280            ast::ItemKind::Union(..) => Target::Union,
281            ast::ItemKind::Trait(..) => Target::Trait,
282            ast::ItemKind::TraitAlias(..) => Target::TraitAlias,
283            ast::ItemKind::Impl(ref i) => Target::Impl { of_trait: i.of_trait.is_some() },
284            ast::ItemKind::MacCall(..) => Target::MacroCall,
285            ast::ItemKind::MacroDef(..) => Target::MacroDef,
286            ast::ItemKind::Delegation(..) => Target::Delegation { mac: false },
287            ast::ItemKind::DelegationMac(..) => Target::Delegation { mac: true },
288            ast::ItemKind::TestBinderConstraints(..) => Target::MacroCall,
289        }
290    }
291
292    pub fn from_foreign_item_kind(kind: &ast::ForeignItemKind) -> Target {
293        match kind {
294            ForeignItemKind::Static(_) => Target::ForeignStatic,
295            ForeignItemKind::Fn(_) => Target::ForeignFn,
296            ForeignItemKind::TyAlias(_) => Target::ForeignTy,
297            ForeignItemKind::MacCall(_) => Target::MacroCall,
298        }
299    }
300
301    pub fn from_assoc_item_kind(kind: &ast::AssocItemKind, assoc_ctxt: AssocCtxt) -> Target {
302        match kind {
303            AssocItemKind::Const(_) => Target::AssocConst(assoc_ctxt),
304            AssocItemKind::Fn(f) => Target::Method(match assoc_ctxt {
305                AssocCtxt::Trait => MethodKind::Trait { body: f.body.is_some() },
306                AssocCtxt::Impl { of_trait, .. } => {
307                    if of_trait {
308                        MethodKind::TraitImpl
309                    } else {
310                        MethodKind::Inherent
311                    }
312                }
313            }),
314            AssocItemKind::Type(_) => Target::AssocTy(assoc_ctxt),
315            AssocItemKind::Delegation(_) => Target::Delegation { mac: false },
316            AssocItemKind::DelegationMac(_) => Target::Delegation { mac: true },
317            AssocItemKind::MacCall(_) => Target::MacroCall,
318        }
319    }
320
321    pub fn from_expr(expr: &ast::Expr) -> Self {
322        match &expr.kind {
323            ast::ExprKind::Closure(..) | ast::ExprKind::Gen(..) => Self::Closure,
324            ast::ExprKind::Paren(e) => Self::from_expr(&e),
325            ast::ExprKind::ForLoop { .. } => Self::ForLoop,
326            ast::ExprKind::Loop(..) => Self::Loop,
327            ast::ExprKind::While(..) => Self::While,
328            ast::ExprKind::Break(..) => Self::Break,
329            _ => Self::Expression,
330        }
331    }
332
333    pub fn name(self) -> &'static str {
334        match self {
335            Target::ExternCrate => "extern crate",
336            Target::Use => "use",
337            Target::Static => "static",
338            Target::Const => "constant",
339            Target::Fn => "function",
340            Target::Closure => "closure",
341            Target::Mod => "module",
342            Target::ForeignMod => "foreign module",
343            Target::GlobalAsm => "global asm",
344            Target::TyAlias => "type alias",
345            Target::Enum => "enum",
346            Target::Variant => "enum variant",
347            Target::Struct => "struct",
348            Target::Field => "struct field",
349            Target::Union => "union",
350            Target::Trait => "trait",
351            Target::TraitAlias => "trait alias",
352            Target::Impl { .. } => "implementation block",
353            Target::Expression => "expression",
354            Target::Statement => "statement",
355            Target::Arm => "match arm",
356            Target::AssocConst(_) => "associated const",
357            Target::Method(kind) => match kind {
358                MethodKind::Inherent => "inherent method",
359                MethodKind::Trait { body: false } => "required trait method",
360                MethodKind::Trait { body: true } => "provided trait method",
361                MethodKind::TraitImpl => "trait method in an impl block",
362            },
363            Target::AssocTy(_) => "associated type",
364            Target::ForeignFn => "foreign function",
365            Target::ForeignStatic => "foreign static item",
366            Target::ForeignTy => "foreign type",
367            Target::TypeParam => "type parameter",
368            Target::LifetimeParam => "lifetime parameter",
369            Target::ConstParam => "const parameter",
370            Target::MacroDef => "macro def",
371            Target::Param => "function param",
372            Target::PatField => "pattern field",
373            Target::ExprField => "struct field",
374            Target::WherePredicate => "where predicate",
375            Target::MacroCall => "macro call",
376            Target::Crate => "crate",
377            Target::Delegation { .. } => "delegation",
378            Target::Loop => "loop",
379            Target::ForLoop => "for loop",
380            Target::While => "while loop",
381            Target::Break => "break expression",
382        }
383    }
384
385    pub fn plural_name(self) -> &'static str {
386        match self {
387            Target::ExternCrate => "extern crates",
388            Target::Use => "use statements",
389            Target::Static => "statics",
390            Target::Const => "constants",
391            Target::Fn => "functions",
392            Target::Closure => "closures",
393            Target::Mod => "modules",
394            Target::ForeignMod => "foreign modules",
395            Target::GlobalAsm => "global asms",
396            Target::TyAlias => "type aliases",
397            Target::Enum => "enums",
398            Target::Variant => "enum variants",
399            Target::Struct => "structs",
400            Target::Field => "struct fields",
401            Target::Union => "unions",
402            Target::Trait => "traits",
403            Target::TraitAlias => "trait aliases",
404            Target::Impl { of_trait: false } => "inherent impl blocks",
405            Target::Impl { of_trait: true } => "trait impl blocks",
406            Target::Expression => "expressions",
407            Target::Statement => "statements",
408            Target::Arm => "match arms",
409            Target::AssocConst(_) => "associated consts",
410            Target::Method(kind) => match kind {
411                MethodKind::Inherent => "inherent methods",
412                MethodKind::Trait { body: false } => "required trait methods",
413                MethodKind::Trait { body: true } => "provided trait methods",
414                MethodKind::TraitImpl => "trait methods in impl blocks",
415            },
416            Target::AssocTy(_) => "associated types",
417            Target::ForeignFn => "foreign functions",
418            Target::ForeignStatic => "foreign statics",
419            Target::ForeignTy => "foreign types",
420            Target::TypeParam => "type parameters",
421            Target::LifetimeParam => "lifetime parameters",
422            Target::ConstParam => "const parameters",
423            Target::MacroDef => "macro defs",
424            Target::Param => "function params",
425            Target::PatField => "pattern fields",
426            Target::ExprField => "struct fields",
427            Target::WherePredicate => "where predicates",
428            Target::MacroCall => "macro calls",
429            Target::Crate => "crates",
430            Target::Delegation { .. } => "delegations",
431            Target::ForLoop => "for loops",
432            Target::Loop => "loops",
433            Target::While => "while loops",
434            Target::Break => "break expressions",
435        }
436    }
437}