hir_ty/
lang_items.rs

1//! Functions to detect special lang items
2
3use hir_def::{AdtId, lang_item::LangItem, signatures::StructFlags};
4use hir_expand::name::Name;
5use intern::sym;
6
7use crate::db::HirDatabase;
8
9pub fn is_box(db: &dyn HirDatabase, adt: AdtId) -> bool {
10    let AdtId::StructId(id) = adt else { return false };
11    db.struct_signature(id).flags.contains(StructFlags::IS_BOX)
12}
13
14pub fn lang_items_for_bin_op(op: syntax::ast::BinaryOp) -> Option<(Name, LangItem)> {
15    use syntax::ast::{ArithOp, BinaryOp, CmpOp, Ordering};
16    Some(match op {
17        BinaryOp::LogicOp(_) => return None,
18        BinaryOp::ArithOp(aop) => match aop {
19            ArithOp::Add => (Name::new_symbol_root(sym::add), LangItem::Add),
20            ArithOp::Mul => (Name::new_symbol_root(sym::mul), LangItem::Mul),
21            ArithOp::Sub => (Name::new_symbol_root(sym::sub), LangItem::Sub),
22            ArithOp::Div => (Name::new_symbol_root(sym::div), LangItem::Div),
23            ArithOp::Rem => (Name::new_symbol_root(sym::rem), LangItem::Rem),
24            ArithOp::Shl => (Name::new_symbol_root(sym::shl), LangItem::Shl),
25            ArithOp::Shr => (Name::new_symbol_root(sym::shr), LangItem::Shr),
26            ArithOp::BitXor => (Name::new_symbol_root(sym::bitxor), LangItem::BitXor),
27            ArithOp::BitOr => (Name::new_symbol_root(sym::bitor), LangItem::BitOr),
28            ArithOp::BitAnd => (Name::new_symbol_root(sym::bitand), LangItem::BitAnd),
29        },
30        BinaryOp::Assignment { op: Some(aop) } => match aop {
31            ArithOp::Add => (Name::new_symbol_root(sym::add_assign), LangItem::AddAssign),
32            ArithOp::Mul => (Name::new_symbol_root(sym::mul_assign), LangItem::MulAssign),
33            ArithOp::Sub => (Name::new_symbol_root(sym::sub_assign), LangItem::SubAssign),
34            ArithOp::Div => (Name::new_symbol_root(sym::div_assign), LangItem::DivAssign),
35            ArithOp::Rem => (Name::new_symbol_root(sym::rem_assign), LangItem::RemAssign),
36            ArithOp::Shl => (Name::new_symbol_root(sym::shl_assign), LangItem::ShlAssign),
37            ArithOp::Shr => (Name::new_symbol_root(sym::shr_assign), LangItem::ShrAssign),
38            ArithOp::BitXor => (Name::new_symbol_root(sym::bitxor_assign), LangItem::BitXorAssign),
39            ArithOp::BitOr => (Name::new_symbol_root(sym::bitor_assign), LangItem::BitOrAssign),
40            ArithOp::BitAnd => (Name::new_symbol_root(sym::bitand_assign), LangItem::BitAndAssign),
41        },
42        BinaryOp::CmpOp(cop) => match cop {
43            CmpOp::Eq { negated: false } => (Name::new_symbol_root(sym::eq), LangItem::PartialEq),
44            CmpOp::Eq { negated: true } => (Name::new_symbol_root(sym::ne), LangItem::PartialEq),
45            CmpOp::Ord { ordering: Ordering::Less, strict: false } => {
46                (Name::new_symbol_root(sym::le), LangItem::PartialOrd)
47            }
48            CmpOp::Ord { ordering: Ordering::Less, strict: true } => {
49                (Name::new_symbol_root(sym::lt), LangItem::PartialOrd)
50            }
51            CmpOp::Ord { ordering: Ordering::Greater, strict: false } => {
52                (Name::new_symbol_root(sym::ge), LangItem::PartialOrd)
53            }
54            CmpOp::Ord { ordering: Ordering::Greater, strict: true } => {
55                (Name::new_symbol_root(sym::gt), LangItem::PartialOrd)
56            }
57        },
58        BinaryOp::Assignment { op: None } => return None,
59    })
60}