@@ -10,13 +10,13 @@ use chalk_ir::{
1010 cast:: Cast , fold:: Shift , DebruijnIndex , GenericArgData , Mutability , TyVariableKind ,
1111} ;
1212use hir_def:: {
13- expr:: { ArithOp , Array , BinaryOp , CmpOp , Expr , ExprId , Literal , Ordering , Statement , UnaryOp } ,
13+ expr:: { ArithOp , Array , BinaryOp , CmpOp , Expr , ExprId , Literal , Statement , UnaryOp } ,
1414 generics:: TypeOrConstParamData ,
1515 path:: { GenericArg , GenericArgs } ,
1616 resolver:: resolver_for_expr,
17- ConstParamId , FieldId , FunctionId , ItemContainerId , Lookup ,
17+ ConstParamId , FieldId , ItemContainerId , Lookup ,
1818} ;
19- use hir_expand:: name:: { name , Name } ;
19+ use hir_expand:: name:: Name ;
2020use stdx:: always;
2121use syntax:: ast:: RangeOp ;
2222
@@ -28,7 +28,7 @@ use crate::{
2828 const_or_path_to_chalk, generic_arg_to_chalk, lower_to_chalk_mutability, ParamLoweringMode ,
2929 } ,
3030 mapping:: { from_chalk, ToChalk } ,
31- method_resolution:: { self , VisibleFromModule } ,
31+ method_resolution:: { self , lang_names_for_bin_op , VisibleFromModule } ,
3232 primitive:: { self , UintTy } ,
3333 static_lifetime, to_chalk_trait_id,
3434 utils:: { generics, Generics } ,
@@ -947,7 +947,9 @@ impl<'a> InferenceContext<'a> {
947947 let lhs_ty = self . infer_expr ( lhs, & lhs_expectation) ;
948948 let rhs_ty = self . table . new_type_var ( ) ;
949949
950- let func = self . resolve_binop_method ( op) ;
950+ let func = lang_names_for_bin_op ( op) . and_then ( |( name, lang_item) | {
951+ self . db . trait_data ( self . resolve_lang_item ( lang_item) ?. as_trait ( ) ?) . method_by_name ( & name)
952+ } ) ;
951953 let func = match func {
952954 Some ( func) => func,
953955 None => {
@@ -1473,55 +1475,4 @@ impl<'a> InferenceContext<'a> {
14731475 } ,
14741476 } )
14751477 }
1476-
1477- fn resolve_binop_method ( & self , op : BinaryOp ) -> Option < FunctionId > {
1478- let ( name, lang_item) = match op {
1479- BinaryOp :: LogicOp ( _) => return None ,
1480- BinaryOp :: ArithOp ( aop) => match aop {
1481- ArithOp :: Add => ( name ! ( add) , name ! ( add) ) ,
1482- ArithOp :: Mul => ( name ! ( mul) , name ! ( mul) ) ,
1483- ArithOp :: Sub => ( name ! ( sub) , name ! ( sub) ) ,
1484- ArithOp :: Div => ( name ! ( div) , name ! ( div) ) ,
1485- ArithOp :: Rem => ( name ! ( rem) , name ! ( rem) ) ,
1486- ArithOp :: Shl => ( name ! ( shl) , name ! ( shl) ) ,
1487- ArithOp :: Shr => ( name ! ( shr) , name ! ( shr) ) ,
1488- ArithOp :: BitXor => ( name ! ( bitxor) , name ! ( bitxor) ) ,
1489- ArithOp :: BitOr => ( name ! ( bitor) , name ! ( bitor) ) ,
1490- ArithOp :: BitAnd => ( name ! ( bitand) , name ! ( bitand) ) ,
1491- } ,
1492- BinaryOp :: Assignment { op : Some ( aop) } => match aop {
1493- ArithOp :: Add => ( name ! ( add_assign) , name ! ( add_assign) ) ,
1494- ArithOp :: Mul => ( name ! ( mul_assign) , name ! ( mul_assign) ) ,
1495- ArithOp :: Sub => ( name ! ( sub_assign) , name ! ( sub_assign) ) ,
1496- ArithOp :: Div => ( name ! ( div_assign) , name ! ( div_assign) ) ,
1497- ArithOp :: Rem => ( name ! ( rem_assign) , name ! ( rem_assign) ) ,
1498- ArithOp :: Shl => ( name ! ( shl_assign) , name ! ( shl_assign) ) ,
1499- ArithOp :: Shr => ( name ! ( shr_assign) , name ! ( shr_assign) ) ,
1500- ArithOp :: BitXor => ( name ! ( bitxor_assign) , name ! ( bitxor_assign) ) ,
1501- ArithOp :: BitOr => ( name ! ( bitor_assign) , name ! ( bitor_assign) ) ,
1502- ArithOp :: BitAnd => ( name ! ( bitand_assign) , name ! ( bitand_assign) ) ,
1503- } ,
1504- BinaryOp :: CmpOp ( cop) => match cop {
1505- CmpOp :: Eq { negated : false } => ( name ! ( eq) , name ! ( eq) ) ,
1506- CmpOp :: Eq { negated : true } => ( name ! ( ne) , name ! ( eq) ) ,
1507- CmpOp :: Ord { ordering : Ordering :: Less , strict : false } => {
1508- ( name ! ( le) , name ! ( partial_ord) )
1509- }
1510- CmpOp :: Ord { ordering : Ordering :: Less , strict : true } => {
1511- ( name ! ( lt) , name ! ( partial_ord) )
1512- }
1513- CmpOp :: Ord { ordering : Ordering :: Greater , strict : false } => {
1514- ( name ! ( ge) , name ! ( partial_ord) )
1515- }
1516- CmpOp :: Ord { ordering : Ordering :: Greater , strict : true } => {
1517- ( name ! ( gt) , name ! ( partial_ord) )
1518- }
1519- } ,
1520- BinaryOp :: Assignment { op : None } => return None ,
1521- } ;
1522-
1523- let trait_ = self . resolve_lang_item ( lang_item) ?. as_trait ( ) ?;
1524-
1525- self . db . trait_data ( trait_) . method_by_name ( & name)
1526- }
15271478}
0 commit comments