Skip to main content

rustc_hir/
target_impls.rs

1//! Implements conversions from HIR types to Target.
2
3use rustc_attr_ir::target::{AssocCtxt, MethodKind, Target};
4
5use crate::def::DefKind;
6use crate::{self as hir, ItemKind, TraitItemKind};
7
8impl From<&hir::ForeignItem<'_>> for Target {
9    fn from(foreign_item: &hir::ForeignItem<'_>) -> Target {
10        match foreign_item.kind {
11            hir::ForeignItemKind::Fn(..) => Target::ForeignFn,
12            hir::ForeignItemKind::Static(..) => Target::ForeignStatic,
13            hir::ForeignItemKind::Type => Target::ForeignTy,
14        }
15    }
16}
17
18impl From<&hir::GenericParam<'_>> for Target {
19    fn from(generic_param: &hir::GenericParam<'_>) -> Target {
20        match generic_param.kind {
21            hir::GenericParamKind::Type { .. } => Target::TypeParam,
22            hir::GenericParamKind::Lifetime { .. } => Target::LifetimeParam,
23            hir::GenericParamKind::Const { .. } => Target::ConstParam,
24        }
25    }
26}
27
28impl From<&hir::TraitItem<'_>> for Target {
29    fn from(trait_item: &hir::TraitItem<'_>) -> Target {
30        match trait_item.kind {
31            TraitItemKind::Const(..) => Target::AssocConst(AssocCtxt::Trait),
32            TraitItemKind::Fn(_, hir::TraitFn::Required(_)) => {
33                Target::Method(MethodKind::Trait { body: false })
34            }
35            TraitItemKind::Fn(_, hir::TraitFn::Provided(_)) => {
36                Target::Method(MethodKind::Trait { body: true })
37            }
38            TraitItemKind::Type(..) => Target::AssocTy(AssocCtxt::Trait),
39        }
40    }
41}
42
43impl From<DefKind> for Target {
44    fn from(def_kind: DefKind) -> Target {
45        match def_kind {
46            DefKind::ExternCrate => Target::ExternCrate,
47            DefKind::Use => Target::Use,
48            DefKind::Static { .. } => Target::Static,
49            DefKind::Const => Target::Const,
50            DefKind::Fn => Target::Fn,
51            DefKind::Macro(..) => Target::MacroDef,
52            DefKind::Mod => Target::Mod,
53            DefKind::ForeignMod => Target::ForeignMod,
54            DefKind::GlobalAsm => Target::GlobalAsm,
55            DefKind::TyAlias => Target::TyAlias,
56            DefKind::Enum => Target::Enum,
57            DefKind::Struct => Target::Struct,
58            DefKind::Union => Target::Union,
59            DefKind::Trait => Target::Trait,
60            DefKind::TraitAlias => Target::TraitAlias,
61            DefKind::Impl { of_trait } => Target::Impl { of_trait },
62            _ => { ::core::panicking::panic_fmt(format_args!("impossible case reached")); }panic!("impossible case reached"),
63        }
64    }
65}
66
67impl From<&hir::Item<'_>> for Target {
68    fn from(item: &hir::Item<'_>) -> Target {
69        match item.kind {
70            ItemKind::ExternCrate(..) => Target::ExternCrate,
71            ItemKind::Use(..) => Target::Use,
72            ItemKind::Static { .. } => Target::Static,
73            ItemKind::Const(..) => Target::Const,
74            ItemKind::Fn { .. } => Target::Fn,
75            ItemKind::Macro(..) => Target::MacroDef,
76            ItemKind::Mod(..) => Target::Mod,
77            ItemKind::ForeignMod { .. } => Target::ForeignMod,
78            ItemKind::GlobalAsm { .. } => Target::GlobalAsm,
79            ItemKind::TyAlias(..) => Target::TyAlias,
80            ItemKind::Enum(..) => Target::Enum,
81            ItemKind::Struct(..) => Target::Struct,
82            ItemKind::Union(..) => Target::Union,
83            ItemKind::Trait { .. } => Target::Trait,
84            ItemKind::TraitAlias(..) => Target::TraitAlias,
85            ItemKind::Impl(imp_) => Target::Impl { of_trait: imp_.of_trait.is_some() },
86            ItemKind::TestBinderConstraints { .. } => Target::MacroCall,
87        }
88    }
89}