rustc_middle/middle/
lang_items.rs1use rustc_hir::LangItem;
11use rustc_hir::def_id::DefId;
12use rustc_span::Span;
13use rustc_target::spec::PanicStrategy;
14
15use crate::ty::{self, TyCtxt};
16
17impl<'tcx> TyCtxt<'tcx> {
18 pub fn require_lang_item(self, lang_item: LangItem, span: Option<Span>) -> DefId {
21 self.lang_items().get(lang_item).unwrap_or_else(|| {
22 self.dcx().emit_fatal(crate::error::RequiresLangItem { span, name: lang_item.name() });
23 })
24 }
25
26 pub fn is_lang_item(self, def_id: DefId, lang_item: LangItem) -> bool {
27 self.lang_items().get(lang_item) == Some(def_id)
28 }
29
30 pub fn as_lang_item(self, def_id: DefId) -> Option<LangItem> {
31 self.lang_items().from_def_id(def_id)
32 }
33
34 pub fn fn_trait_kind_from_def_id(self, id: DefId) -> Option<ty::ClosureKind> {
38 match self.as_lang_item(id)? {
39 LangItem::Fn => Some(ty::ClosureKind::Fn),
40 LangItem::FnMut => Some(ty::ClosureKind::FnMut),
41 LangItem::FnOnce => Some(ty::ClosureKind::FnOnce),
42 _ => None,
43 }
44 }
45
46 pub fn async_fn_trait_kind_from_def_id(self, id: DefId) -> Option<ty::ClosureKind> {
50 match self.as_lang_item(id)? {
51 LangItem::AsyncFn => Some(ty::ClosureKind::Fn),
52 LangItem::AsyncFnMut => Some(ty::ClosureKind::FnMut),
53 LangItem::AsyncFnOnce => Some(ty::ClosureKind::FnOnce),
54 _ => None,
55 }
56 }
57
58 pub fn fn_trait_kind_to_def_id(self, kind: ty::ClosureKind) -> Option<DefId> {
61 let items = self.lang_items();
62 match kind {
63 ty::ClosureKind::Fn => items.fn_trait(),
64 ty::ClosureKind::FnMut => items.fn_mut_trait(),
65 ty::ClosureKind::FnOnce => items.fn_once_trait(),
66 }
67 }
68
69 pub fn async_fn_trait_kind_to_def_id(self, kind: ty::ClosureKind) -> Option<DefId> {
72 let items = self.lang_items();
73 match kind {
74 ty::ClosureKind::Fn => items.async_fn_trait(),
75 ty::ClosureKind::FnMut => items.async_fn_mut_trait(),
76 ty::ClosureKind::FnOnce => items.async_fn_once_trait(),
77 }
78 }
79
80 pub fn is_fn_trait(self, id: DefId) -> bool {
82 self.fn_trait_kind_from_def_id(id).is_some()
83 }
84}
85
86pub fn required(tcx: TyCtxt<'_>, lang_item: LangItem) -> bool {
93 match tcx.sess.panic_strategy() {
97 PanicStrategy::Abort => {
98 lang_item != LangItem::EhPersonality && lang_item != LangItem::EhCatchTypeinfo
99 }
100 PanicStrategy::Unwind => true,
101 }
102}