blob: 57564bd815595b6f613ef0878717a25938ed7ea4 [file]
//! Implements conversions from HIR types to Target.
use rustc_attr_ir::target::{GenericParamKind, MethodKind, Target};
use crate::def::DefKind;
use crate::{self as hir, ItemKind, TraitItemKind};
impl From<&hir::ForeignItem<'_>> for Target {
fn from(foreign_item: &hir::ForeignItem<'_>) -> Target {
match foreign_item.kind {
hir::ForeignItemKind::Fn(..) => Target::ForeignFn,
hir::ForeignItemKind::Static(..) => Target::ForeignStatic,
hir::ForeignItemKind::Type => Target::ForeignTy,
}
}
}
impl From<&hir::GenericParam<'_>> for Target {
fn from(generic_param: &hir::GenericParam<'_>) -> Target {
match generic_param.kind {
hir::GenericParamKind::Type { default, .. } => Target::GenericParam {
kind: GenericParamKind::Type,
has_default: default.is_some(),
},
hir::GenericParamKind::Lifetime { .. } => {
Target::GenericParam { kind: GenericParamKind::Lifetime, has_default: false }
}
hir::GenericParamKind::Const { default, .. } => Target::GenericParam {
kind: GenericParamKind::Const,
has_default: default.is_some(),
},
}
}
}
impl From<&hir::TraitItem<'_>> for Target {
fn from(trait_item: &hir::TraitItem<'_>) -> Target {
match trait_item.kind {
TraitItemKind::Const(..) => Target::AssocConst,
TraitItemKind::Fn(_, hir::TraitFn::Required(_)) => {
Target::Method(MethodKind::Trait { body: false })
}
TraitItemKind::Fn(_, hir::TraitFn::Provided(_)) => {
Target::Method(MethodKind::Trait { body: true })
}
TraitItemKind::Type(..) => Target::AssocTy,
}
}
}
impl From<DefKind> for Target {
fn from(def_kind: DefKind) -> Target {
match def_kind {
DefKind::ExternCrate => Target::ExternCrate,
DefKind::Use => Target::Use,
DefKind::Static { .. } => Target::Static,
DefKind::Const { .. } => Target::Const,
DefKind::Fn => Target::Fn,
DefKind::Macro(..) => Target::MacroDef,
DefKind::Mod => Target::Mod,
DefKind::ForeignMod => Target::ForeignMod,
DefKind::GlobalAsm => Target::GlobalAsm,
DefKind::TyAlias => Target::TyAlias,
DefKind::Enum => Target::Enum,
DefKind::Struct => Target::Struct,
DefKind::Union => Target::Union,
DefKind::Trait => Target::Trait,
DefKind::TraitAlias => Target::TraitAlias,
DefKind::Impl { of_trait } => Target::Impl { of_trait },
_ => panic!("impossible case reached"),
}
}
}
impl From<&hir::Item<'_>> for Target {
fn from(item: &hir::Item<'_>) -> Target {
match item.kind {
ItemKind::ExternCrate(..) => Target::ExternCrate,
ItemKind::Use(..) => Target::Use,
ItemKind::Static { .. } => Target::Static,
ItemKind::Const(..) => Target::Const,
ItemKind::Fn { .. } => Target::Fn,
ItemKind::Macro(..) => Target::MacroDef,
ItemKind::Mod(..) => Target::Mod,
ItemKind::ForeignMod { .. } => Target::ForeignMod,
ItemKind::GlobalAsm { .. } => Target::GlobalAsm,
ItemKind::TyAlias(..) => Target::TyAlias,
ItemKind::Enum(..) => Target::Enum,
ItemKind::Struct(..) => Target::Struct,
ItemKind::Union(..) => Target::Union,
ItemKind::Trait { .. } => Target::Trait,
ItemKind::TraitAlias(..) => Target::TraitAlias,
ItemKind::Impl(imp_) => Target::Impl { of_trait: imp_.of_trait.is_some() },
}
}
}