@@ -25,16 +25,19 @@ use hir_def::{
25
25
Lookup , ModuleDefId , VariantId ,
26
26
} ;
27
27
use 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 ,
30
33
} ;
31
34
use hir_ty:: {
32
35
diagnostics:: {
33
36
record_literal_missing_fields, record_pattern_missing_fields, unsafe_expressions,
34
37
UnsafeExpr ,
35
38
} ,
36
39
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 ,
38
41
TyLoweringContext ,
39
42
} ;
40
43
use itertools:: Itertools ;
@@ -266,8 +269,7 @@ impl SourceAnalyzer {
266
269
db : & dyn HirDatabase ,
267
270
await_expr : & ast:: AwaitExpr ,
268
271
) -> 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 ( ) ) ?;
271
273
272
274
let op_fn = db
273
275
. lang_item ( self . resolver . krate ( ) , hir_expand:: name![ poll] . to_smol_str ( ) ) ?
@@ -287,12 +289,9 @@ impl SourceAnalyzer {
287
289
ast:: UnaryOp :: Not => name ! [ not] ,
288
290
ast:: UnaryOp :: Neg => name ! [ neg] ,
289
291
} ;
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 ( ) ) ?;
292
293
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) ?;
296
295
let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_fn) . push ( ty. clone ( ) ) . build ( ) ;
297
296
298
297
Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, & substs) )
@@ -303,16 +302,12 @@ impl SourceAnalyzer {
303
302
db : & dyn HirDatabase ,
304
303
index_expr : & ast:: IndexExpr ,
305
304
) -> 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 ( ) ) ?;
310
307
311
308
let lang_item_name = name ! [ index] ;
312
309
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) ?;
316
311
let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_fn)
317
312
. push ( base_ty. clone ( ) )
318
313
. push ( index_ty. clone ( ) )
@@ -326,15 +321,11 @@ impl SourceAnalyzer {
326
321
binop_expr : & ast:: BinExpr ,
327
322
) -> Option < FunctionId > {
328
323
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) ) ?;
338
329
let substs =
339
330
hir_ty:: TyBuilder :: subst_for_def ( db, op_fn) . push ( lhs. clone ( ) ) . push ( rhs. clone ( ) ) . build ( ) ;
340
331
@@ -346,8 +337,7 @@ impl SourceAnalyzer {
346
337
db : & dyn HirDatabase ,
347
338
try_expr : & ast:: TryExpr ,
348
339
) -> 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 ( ) ) ?;
351
341
352
342
let op_fn =
353
343
db. lang_item ( self . resolver . krate ( ) , name ! [ branch] . to_smol_str ( ) ) ?. as_function ( ) ?;
@@ -772,6 +762,20 @@ impl SourceAnalyzer {
772
762
) -> FunctionId {
773
763
self . resolve_impl_method ( db, func, substs) . unwrap_or ( func)
774
764
}
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
+ }
775
779
}
776
780
777
781
fn scope_for (
0 commit comments