@@ -25,16 +25,19 @@ use hir_def::{
2525 Lookup , ModuleDefId , VariantId ,
2626} ;
2727use hir_expand:: {
28- builtin_fn_macro:: BuiltinFnLikeExpander , hygiene:: Hygiene , name, name:: AsName , HirFileId ,
29- InFile ,
28+ builtin_fn_macro:: BuiltinFnLikeExpander ,
29+ hygiene:: Hygiene ,
30+ name,
31+ name:: { AsName , Name } ,
32+ HirFileId , InFile ,
3033} ;
3134use hir_ty:: {
3235 diagnostics:: {
3336 record_literal_missing_fields, record_pattern_missing_fields, unsafe_expressions,
3437 UnsafeExpr ,
3538 } ,
3639 method_resolution:: { self , lang_names_for_bin_op} ,
37- Adjust , Adjustment , AutoBorrow , InferenceResult , Interner , Substitution , TyExt , TyKind ,
40+ Adjust , Adjustment , AutoBorrow , InferenceResult , Interner , Substitution , Ty , TyExt , TyKind ,
3841 TyLoweringContext ,
3942} ;
4043use itertools:: Itertools ;
@@ -266,8 +269,7 @@ impl SourceAnalyzer {
266269 db : & dyn HirDatabase ,
267270 await_expr : & ast:: AwaitExpr ,
268271 ) -> Option < FunctionId > {
269- let expr_id = self . expr_id ( db, & await_expr. expr ( ) ?. into ( ) ) ?;
270- let ty = self . infer . as_ref ( ) ?. type_of_expr . get ( expr_id) ?;
272+ let ty = self . ty_of_expr ( db, & await_expr. expr ( ) ?. into ( ) ) ?;
271273
272274 let op_fn = db
273275 . lang_item ( self . resolver . krate ( ) , hir_expand:: name![ poll] . to_smol_str ( ) ) ?
@@ -287,12 +289,9 @@ impl SourceAnalyzer {
287289 ast:: UnaryOp :: Not => name ! [ not] ,
288290 ast:: UnaryOp :: Neg => name ! [ neg] ,
289291 } ;
290- let expr_id = self . expr_id ( db, & prefix_expr. expr ( ) ?. into ( ) ) ?;
291- let ty = self . infer . as_ref ( ) ?. type_of_expr . get ( expr_id) ?;
292+ let ty = self . ty_of_expr ( db, & prefix_expr. expr ( ) ?. into ( ) ) ?;
292293
293- let trait_ =
294- db. lang_item ( self . resolver . krate ( ) , lang_item_name. to_smol_str ( ) ) ?. as_trait ( ) ?;
295- let op_fn = db. trait_data ( trait_) . method_by_name ( & lang_item_name) ?;
294+ let op_fn = self . lang_trait_fn ( db, & lang_item_name, & lang_item_name) ?;
296295 let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_fn) . push ( ty. clone ( ) ) . build ( ) ;
297296
298297 Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, & substs) )
@@ -303,16 +302,12 @@ impl SourceAnalyzer {
303302 db : & dyn HirDatabase ,
304303 index_expr : & ast:: IndexExpr ,
305304 ) -> Option < FunctionId > {
306- let base_expr_id = self . expr_id ( db, & index_expr. base ( ) ?. into ( ) ) ?;
307- let index_expr_id = self . expr_id ( db, & index_expr. index ( ) ?. into ( ) ) ?;
308- let base_ty = self . infer . as_ref ( ) ?. type_of_expr . get ( base_expr_id) ?;
309- let index_ty = self . infer . as_ref ( ) ?. type_of_expr . get ( index_expr_id) ?;
305+ let base_ty = self . ty_of_expr ( db, & index_expr. base ( ) ?. into ( ) ) ?;
306+ let index_ty = self . ty_of_expr ( db, & index_expr. index ( ) ?. into ( ) ) ?;
310307
311308 let lang_item_name = name ! [ index] ;
312309
313- let trait_ =
314- db. lang_item ( self . resolver . krate ( ) , lang_item_name. to_smol_str ( ) ) ?. as_trait ( ) ?;
315- let op_fn = db. trait_data ( trait_) . method_by_name ( & lang_item_name) ?;
310+ let op_fn = self . lang_trait_fn ( db, & lang_item_name, & lang_item_name) ?;
316311 let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_fn)
317312 . push ( base_ty. clone ( ) )
318313 . push ( index_ty. clone ( ) )
@@ -326,15 +321,11 @@ impl SourceAnalyzer {
326321 binop_expr : & ast:: BinExpr ,
327322 ) -> Option < FunctionId > {
328323 let op = binop_expr. op_kind ( ) ?;
329- let lhs_expr_id = self . expr_id ( db, & binop_expr. lhs ( ) ?. into ( ) ) ?;
330- let rhs_expr_id = self . expr_id ( db, & binop_expr. rhs ( ) ?. into ( ) ) ?;
331- let lhs = self . infer . as_ref ( ) ?. type_of_expr . get ( lhs_expr_id) ?;
332- let rhs = self . infer . as_ref ( ) ?. type_of_expr . get ( rhs_expr_id) ?;
333-
334- let op_fn = lang_names_for_bin_op ( op) . and_then ( |( name, lang_item) | {
335- db. trait_data ( db. lang_item ( self . resolver . krate ( ) , lang_item. to_smol_str ( ) ) ?. as_trait ( ) ?)
336- . method_by_name ( & name)
337- } ) ?;
324+ let lhs = self . ty_of_expr ( db, & binop_expr. lhs ( ) ?. into ( ) ) ?;
325+ let rhs = self . ty_of_expr ( db, & binop_expr. rhs ( ) ?. into ( ) ) ?;
326+
327+ let op_fn = lang_names_for_bin_op ( op)
328+ . and_then ( |( name, lang_item) | self . lang_trait_fn ( db, & lang_item, & name) ) ?;
338329 let substs =
339330 hir_ty:: TyBuilder :: subst_for_def ( db, op_fn) . push ( lhs. clone ( ) ) . push ( rhs. clone ( ) ) . build ( ) ;
340331
@@ -346,8 +337,7 @@ impl SourceAnalyzer {
346337 db : & dyn HirDatabase ,
347338 try_expr : & ast:: TryExpr ,
348339 ) -> Option < FunctionId > {
349- let expr_id = self . expr_id ( db, & try_expr. expr ( ) ?. into ( ) ) ?;
350- let ty = self . infer . as_ref ( ) ?. type_of_expr . get ( expr_id) ?;
340+ let ty = self . ty_of_expr ( db, & try_expr. expr ( ) ?. into ( ) ) ?;
351341
352342 let op_fn =
353343 db. lang_item ( self . resolver . krate ( ) , name ! [ branch] . to_smol_str ( ) ) ?. as_function ( ) ?;
@@ -772,6 +762,20 @@ impl SourceAnalyzer {
772762 ) -> FunctionId {
773763 self . resolve_impl_method ( db, func, substs) . unwrap_or ( func)
774764 }
765+
766+ fn lang_trait_fn (
767+ & self ,
768+ db : & dyn HirDatabase ,
769+ lang_trait : & Name ,
770+ method_name : & Name ,
771+ ) -> Option < FunctionId > {
772+ db. trait_data ( db. lang_item ( self . resolver . krate ( ) , lang_trait. to_smol_str ( ) ) ?. as_trait ( ) ?)
773+ . method_by_name ( method_name)
774+ }
775+
776+ fn ty_of_expr ( & self , db : & dyn HirDatabase , expr : & ast:: Expr ) -> Option < & Ty > {
777+ self . infer . as_ref ( ) ?. type_of_expr . get ( self . expr_id ( db, & expr) ?)
778+ }
775779}
776780
777781fn scope_for (
0 commit comments