@@ -7,9 +7,8 @@ use std::{ops::ControlFlow, sync::Arc};
77use base_db:: { CrateId , Edition } ;
88use chalk_ir:: { cast:: Cast , Mutability , TyKind , UniverseIndex , WhereClause } ;
99use hir_def:: {
10- data:: ImplData , item_scope:: ItemScope , lang_item:: LangItem , nameres:: DefMap , AssocItemId ,
11- BlockId , ConstId , FunctionId , HasModule , ImplId , ItemContainerId , Lookup , ModuleDefId ,
12- ModuleId , TraitId ,
10+ data:: ImplData , item_scope:: ItemScope , nameres:: DefMap , AssocItemId , BlockId , ConstId ,
11+ FunctionId , HasModule , ImplId , ItemContainerId , Lookup , ModuleDefId , ModuleId , TraitId ,
1312} ;
1413use hir_expand:: name:: Name ;
1514use rustc_hash:: { FxHashMap , FxHashSet } ;
@@ -451,55 +450,6 @@ pub fn def_crates(
451450 }
452451}
453452
454- pub fn lang_items_for_bin_op ( op : syntax:: ast:: BinaryOp ) -> Option < ( Name , LangItem ) > {
455- use hir_expand:: name;
456- use syntax:: ast:: { ArithOp , BinaryOp , CmpOp , Ordering } ;
457- Some ( match op {
458- BinaryOp :: LogicOp ( _) => return None ,
459- BinaryOp :: ArithOp ( aop) => match aop {
460- ArithOp :: Add => ( name ! [ add] , LangItem :: Add ) ,
461- ArithOp :: Mul => ( name ! [ mul] , LangItem :: Mul ) ,
462- ArithOp :: Sub => ( name ! [ sub] , LangItem :: Sub ) ,
463- ArithOp :: Div => ( name ! [ div] , LangItem :: Div ) ,
464- ArithOp :: Rem => ( name ! [ rem] , LangItem :: Rem ) ,
465- ArithOp :: Shl => ( name ! [ shl] , LangItem :: Shl ) ,
466- ArithOp :: Shr => ( name ! [ shr] , LangItem :: Shr ) ,
467- ArithOp :: BitXor => ( name ! [ bitxor] , LangItem :: BitXor ) ,
468- ArithOp :: BitOr => ( name ! [ bitor] , LangItem :: BitOr ) ,
469- ArithOp :: BitAnd => ( name ! [ bitand] , LangItem :: BitAnd ) ,
470- } ,
471- BinaryOp :: Assignment { op : Some ( aop) } => match aop {
472- ArithOp :: Add => ( name ! [ add_assign] , LangItem :: AddAssign ) ,
473- ArithOp :: Mul => ( name ! [ mul_assign] , LangItem :: MulAssign ) ,
474- ArithOp :: Sub => ( name ! [ sub_assign] , LangItem :: SubAssign ) ,
475- ArithOp :: Div => ( name ! [ div_assign] , LangItem :: DivAssign ) ,
476- ArithOp :: Rem => ( name ! [ rem_assign] , LangItem :: RemAssign ) ,
477- ArithOp :: Shl => ( name ! [ shl_assign] , LangItem :: ShlAssign ) ,
478- ArithOp :: Shr => ( name ! [ shr_assign] , LangItem :: ShrAssign ) ,
479- ArithOp :: BitXor => ( name ! [ bitxor_assign] , LangItem :: BitXorAssign ) ,
480- ArithOp :: BitOr => ( name ! [ bitor_assign] , LangItem :: BitOrAssign ) ,
481- ArithOp :: BitAnd => ( name ! [ bitand_assign] , LangItem :: BitAndAssign ) ,
482- } ,
483- BinaryOp :: CmpOp ( cop) => match cop {
484- CmpOp :: Eq { negated : false } => ( name ! [ eq] , LangItem :: PartialEq ) ,
485- CmpOp :: Eq { negated : true } => ( name ! [ ne] , LangItem :: PartialEq ) ,
486- CmpOp :: Ord { ordering : Ordering :: Less , strict : false } => {
487- ( name ! [ le] , LangItem :: PartialOrd )
488- }
489- CmpOp :: Ord { ordering : Ordering :: Less , strict : true } => {
490- ( name ! [ lt] , LangItem :: PartialOrd )
491- }
492- CmpOp :: Ord { ordering : Ordering :: Greater , strict : false } => {
493- ( name ! [ ge] , LangItem :: PartialOrd )
494- }
495- CmpOp :: Ord { ordering : Ordering :: Greater , strict : true } => {
496- ( name ! [ gt] , LangItem :: PartialOrd )
497- }
498- } ,
499- BinaryOp :: Assignment { op : None } => return None ,
500- } )
501- }
502-
503453/// Look up the method with the given name.
504454pub ( crate ) fn lookup_method (
505455 db : & dyn HirDatabase ,
@@ -1310,16 +1260,18 @@ fn iterate_inherent_methods(
13101260/// Returns the receiver type for the index trait call.
13111261pub fn resolve_indexing_op (
13121262 db : & dyn HirDatabase ,
1313- env : Arc < TraitEnvironment > ,
1263+ table : & mut InferenceTable < ' _ > ,
13141264 ty : Canonical < Ty > ,
13151265 index_trait : TraitId ,
13161266) -> Option < ReceiverAdjustments > {
1317- let mut table = InferenceTable :: new ( db, env. clone ( ) ) ;
13181267 let ty = table. instantiate_canonical ( ty) ;
1319- let deref_chain = autoderef_method_receiver ( & mut table, ty) ;
1268+ let deref_chain = autoderef_method_receiver ( table, ty) ;
13201269 for ( ty, adj) in deref_chain {
1321- let goal = generic_implements_goal ( db, env. clone ( ) , index_trait, & ty) ;
1322- if db. trait_solve ( env. krate , env. block , goal. cast ( Interner ) ) . is_some ( ) {
1270+ let goal = generic_implements_goal ( db, table. trait_env . clone ( ) , index_trait, & ty) ;
1271+ if db
1272+ . trait_solve ( table. trait_env . krate , table. trait_env . block , goal. cast ( Interner ) )
1273+ . is_some ( )
1274+ {
13231275 return Some ( adj) ;
13241276 }
13251277 }
0 commit comments