@@ -10,13 +10,13 @@ use chalk_ir::{
10
10
cast:: Cast , fold:: Shift , DebruijnIndex , GenericArgData , Mutability , TyVariableKind ,
11
11
} ;
12
12
use 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 } ,
14
14
generics:: TypeOrConstParamData ,
15
15
path:: { GenericArg , GenericArgs } ,
16
16
resolver:: resolver_for_expr,
17
- ConstParamId , FieldId , FunctionId , ItemContainerId , Lookup ,
17
+ ConstParamId , FieldId , ItemContainerId , Lookup ,
18
18
} ;
19
- use hir_expand:: name:: { name , Name } ;
19
+ use hir_expand:: name:: Name ;
20
20
use stdx:: always;
21
21
use syntax:: ast:: RangeOp ;
22
22
@@ -28,7 +28,7 @@ use crate::{
28
28
const_or_path_to_chalk, generic_arg_to_chalk, lower_to_chalk_mutability, ParamLoweringMode ,
29
29
} ,
30
30
mapping:: { from_chalk, ToChalk } ,
31
- method_resolution:: { self , VisibleFromModule } ,
31
+ method_resolution:: { self , lang_names_for_bin_op , VisibleFromModule } ,
32
32
primitive:: { self , UintTy } ,
33
33
static_lifetime, to_chalk_trait_id,
34
34
utils:: { generics, Generics } ,
@@ -947,7 +947,9 @@ impl<'a> InferenceContext<'a> {
947
947
let lhs_ty = self . infer_expr ( lhs, & lhs_expectation) ;
948
948
let rhs_ty = self . table . new_type_var ( ) ;
949
949
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
+ } ) ;
951
953
let func = match func {
952
954
Some ( func) => func,
953
955
None => {
@@ -1473,55 +1475,4 @@ impl<'a> InferenceContext<'a> {
1473
1475
} ,
1474
1476
} )
1475
1477
}
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
- }
1527
1478
}
0 commit comments