Skip to main content

hir_ty/
lang_items.rs

1//! Functions to detect special lang items
2
3use hir_def::{FunctionId, TraitId, lang_item::LangItems};
4
5pub fn lang_items_for_bin_op(
6    lang_items: &LangItems,
7    op: syntax::ast::BinaryOp,
8) -> Option<(Option<FunctionId>, Option<TraitId>)> {
9    use syntax::ast::{ArithOp, BinaryOp, CmpOp, Ordering};
10    Some(match op {
11        BinaryOp::LogicOp(_) => return None,
12        BinaryOp::ArithOp(aop) => match aop {
13            ArithOp::Add => (lang_items.Add_add, lang_items.Add),
14            ArithOp::Mul => (lang_items.Mul_mul, lang_items.Mul),
15            ArithOp::Sub => (lang_items.Sub_sub, lang_items.Sub),
16            ArithOp::Div => (lang_items.Div_div, lang_items.Div),
17            ArithOp::Rem => (lang_items.Rem_rem, lang_items.Rem),
18            ArithOp::Shl => (lang_items.Shl_shl, lang_items.Shl),
19            ArithOp::Shr => (lang_items.Shr_shr, lang_items.Shr),
20            ArithOp::BitXor => (lang_items.BitXor_bitxor, lang_items.BitXor),
21            ArithOp::BitOr => (lang_items.BitOr_bitor, lang_items.BitOr),
22            ArithOp::BitAnd => (lang_items.BitAnd_bitand, lang_items.BitAnd),
23        },
24        BinaryOp::Assignment { op: Some(aop) } => match aop {
25            ArithOp::Add => (lang_items.AddAssign_add_assign, lang_items.AddAssign),
26            ArithOp::Mul => (lang_items.MulAssign_mul_assign, lang_items.MulAssign),
27            ArithOp::Sub => (lang_items.SubAssign_sub_assign, lang_items.SubAssign),
28            ArithOp::Div => (lang_items.DivAssign_div_assign, lang_items.DivAssign),
29            ArithOp::Rem => (lang_items.RemAssign_rem_assign, lang_items.RemAssign),
30            ArithOp::Shl => (lang_items.ShlAssign_shl_assign, lang_items.ShlAssign),
31            ArithOp::Shr => (lang_items.ShrAssign_shr_assign, lang_items.ShrAssign),
32            ArithOp::BitXor => (lang_items.BitXorAssign_bitxor_assign, lang_items.BitXorAssign),
33            ArithOp::BitOr => (lang_items.BitOrAssign_bitor_assign, lang_items.BitOrAssign),
34            ArithOp::BitAnd => (lang_items.BitAndAssign_bitand_assign, lang_items.BitAndAssign),
35        },
36        BinaryOp::CmpOp(cop) => match cop {
37            CmpOp::Eq { negated: false } => (lang_items.PartialEq_eq, lang_items.PartialEq),
38            CmpOp::Eq { negated: true } => (lang_items.PartialEq_ne, lang_items.PartialEq),
39            CmpOp::Ord { ordering: Ordering::Less, strict: false } => {
40                (lang_items.PartialOrd_le, lang_items.PartialOrd)
41            }
42            CmpOp::Ord { ordering: Ordering::Less, strict: true } => {
43                (lang_items.PartialOrd_lt, lang_items.PartialOrd)
44            }
45            CmpOp::Ord { ordering: Ordering::Greater, strict: false } => {
46                (lang_items.PartialOrd_ge, lang_items.PartialOrd)
47            }
48            CmpOp::Ord { ordering: Ordering::Greater, strict: true } => {
49                (lang_items.PartialOrd_gt, lang_items.PartialOrd)
50            }
51        },
52        BinaryOp::Assignment { op: None } => return None,
53    })
54}