hir_ty/
lang_items.rs

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