Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-ty/src/lang_items.rs')
| -rw-r--r-- | crates/hir-ty/src/lang_items.rs | 59 |
1 files changed, 31 insertions, 28 deletions
diff --git a/crates/hir-ty/src/lang_items.rs b/crates/hir-ty/src/lang_items.rs index d0d0aa7a90..18feb0f46a 100644 --- a/crates/hir-ty/src/lang_items.rs +++ b/crates/hir-ty/src/lang_items.rs @@ -1,6 +1,6 @@ //! Functions to detect special lang items -use hir_def::{AdtId, lang_item::LangItem, signatures::StructFlags}; +use hir_def::{AdtId, TraitId, lang_item::LangItems, signatures::StructFlags}; use intern::{Symbol, sym}; use crate::db::HirDatabase; @@ -10,48 +10,51 @@ pub fn is_box(db: &dyn HirDatabase, adt: AdtId) -> bool { db.struct_signature(id).flags.contains(StructFlags::IS_BOX) } -pub fn lang_items_for_bin_op(op: syntax::ast::BinaryOp) -> Option<(Symbol, LangItem)> { +pub fn lang_items_for_bin_op( + lang_items: &LangItems, + op: syntax::ast::BinaryOp, +) -> Option<(Symbol, Option<TraitId>)> { use syntax::ast::{ArithOp, BinaryOp, CmpOp, Ordering}; Some(match op { BinaryOp::LogicOp(_) => return None, BinaryOp::ArithOp(aop) => match aop { - ArithOp::Add => (sym::add, LangItem::Add), - ArithOp::Mul => (sym::mul, LangItem::Mul), - ArithOp::Sub => (sym::sub, LangItem::Sub), - ArithOp::Div => (sym::div, LangItem::Div), - ArithOp::Rem => (sym::rem, LangItem::Rem), - ArithOp::Shl => (sym::shl, LangItem::Shl), - ArithOp::Shr => (sym::shr, LangItem::Shr), - ArithOp::BitXor => (sym::bitxor, LangItem::BitXor), - ArithOp::BitOr => (sym::bitor, LangItem::BitOr), - ArithOp::BitAnd => (sym::bitand, LangItem::BitAnd), + ArithOp::Add => (sym::add, lang_items.Add), + ArithOp::Mul => (sym::mul, lang_items.Mul), + ArithOp::Sub => (sym::sub, lang_items.Sub), + ArithOp::Div => (sym::div, lang_items.Div), + ArithOp::Rem => (sym::rem, lang_items.Rem), + ArithOp::Shl => (sym::shl, lang_items.Shl), + ArithOp::Shr => (sym::shr, lang_items.Shr), + ArithOp::BitXor => (sym::bitxor, lang_items.BitXor), + ArithOp::BitOr => (sym::bitor, lang_items.BitOr), + ArithOp::BitAnd => (sym::bitand, lang_items.BitAnd), }, BinaryOp::Assignment { op: Some(aop) } => match aop { - ArithOp::Add => (sym::add_assign, LangItem::AddAssign), - ArithOp::Mul => (sym::mul_assign, LangItem::MulAssign), - ArithOp::Sub => (sym::sub_assign, LangItem::SubAssign), - ArithOp::Div => (sym::div_assign, LangItem::DivAssign), - ArithOp::Rem => (sym::rem_assign, LangItem::RemAssign), - ArithOp::Shl => (sym::shl_assign, LangItem::ShlAssign), - ArithOp::Shr => (sym::shr_assign, LangItem::ShrAssign), - ArithOp::BitXor => (sym::bitxor_assign, LangItem::BitXorAssign), - ArithOp::BitOr => (sym::bitor_assign, LangItem::BitOrAssign), - ArithOp::BitAnd => (sym::bitand_assign, LangItem::BitAndAssign), + ArithOp::Add => (sym::add_assign, lang_items.AddAssign), + ArithOp::Mul => (sym::mul_assign, lang_items.MulAssign), + ArithOp::Sub => (sym::sub_assign, lang_items.SubAssign), + ArithOp::Div => (sym::div_assign, lang_items.DivAssign), + ArithOp::Rem => (sym::rem_assign, lang_items.RemAssign), + ArithOp::Shl => (sym::shl_assign, lang_items.ShlAssign), + ArithOp::Shr => (sym::shr_assign, lang_items.ShrAssign), + ArithOp::BitXor => (sym::bitxor_assign, lang_items.BitXorAssign), + ArithOp::BitOr => (sym::bitor_assign, lang_items.BitOrAssign), + ArithOp::BitAnd => (sym::bitand_assign, lang_items.BitAndAssign), }, BinaryOp::CmpOp(cop) => match cop { - CmpOp::Eq { negated: false } => (sym::eq, LangItem::PartialEq), - CmpOp::Eq { negated: true } => (sym::ne, LangItem::PartialEq), + CmpOp::Eq { negated: false } => (sym::eq, lang_items.PartialEq), + CmpOp::Eq { negated: true } => (sym::ne, lang_items.PartialEq), CmpOp::Ord { ordering: Ordering::Less, strict: false } => { - (sym::le, LangItem::PartialOrd) + (sym::le, lang_items.PartialOrd) } CmpOp::Ord { ordering: Ordering::Less, strict: true } => { - (sym::lt, LangItem::PartialOrd) + (sym::lt, lang_items.PartialOrd) } CmpOp::Ord { ordering: Ordering::Greater, strict: false } => { - (sym::ge, LangItem::PartialOrd) + (sym::ge, lang_items.PartialOrd) } CmpOp::Ord { ordering: Ordering::Greater, strict: true } => { - (sym::gt, LangItem::PartialOrd) + (sym::gt, lang_items.PartialOrd) } }, BinaryOp::Assignment { op: None } => return None, |