1use 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}