@@ -270,7 +270,7 @@ impl SourceAnalyzer {
270270 let expr_id = self . expr_id ( db, & call. clone ( ) . into ( ) ) ?;
271271 let ( f_in_trait, substs) = self . infer . as_ref ( ) ?. method_resolution ( expr_id) ?;
272272
273- Some ( self . resolve_impl_method_or_trait_def ( db, f_in_trait, & substs) )
273+ Some ( self . resolve_impl_method_or_trait_def ( db, f_in_trait, substs) )
274274 }
275275
276276 pub ( crate ) fn resolve_await_to_poll (
@@ -311,7 +311,7 @@ impl SourceAnalyzer {
311311 // HACK: subst for `poll()` coincides with that for `Future` because `poll()` itself
312312 // doesn't have any generic parameters, so we skip building another subst for `poll()`.
313313 let substs = hir_ty:: TyBuilder :: subst_for_def ( db, future_trait, None ) . push ( ty) . build ( ) ;
314- Some ( self . resolve_impl_method_or_trait_def ( db, poll_fn, & substs) )
314+ Some ( self . resolve_impl_method_or_trait_def ( db, poll_fn, substs) )
315315 }
316316
317317 pub ( crate ) fn resolve_prefix_expr (
@@ -331,7 +331,7 @@ impl SourceAnalyzer {
331331 // don't have any generic parameters, so we skip building another subst for the methods.
332332 let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_trait, None ) . push ( ty. clone ( ) ) . build ( ) ;
333333
334- Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, & substs) )
334+ Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, substs) )
335335 }
336336
337337 pub ( crate ) fn resolve_index_expr (
@@ -351,7 +351,7 @@ impl SourceAnalyzer {
351351 . push ( base_ty. clone ( ) )
352352 . push ( index_ty. clone ( ) )
353353 . build ( ) ;
354- Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, & substs) )
354+ Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, substs) )
355355 }
356356
357357 pub ( crate ) fn resolve_bin_expr (
@@ -372,7 +372,7 @@ impl SourceAnalyzer {
372372 . push ( rhs. clone ( ) )
373373 . build ( ) ;
374374
375- Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, & substs) )
375+ Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, substs) )
376376 }
377377
378378 pub ( crate ) fn resolve_try_expr (
@@ -392,7 +392,7 @@ impl SourceAnalyzer {
392392 // doesn't have any generic parameters, so we skip building another subst for `branch()`.
393393 let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_trait, None ) . push ( ty. clone ( ) ) . build ( ) ;
394394
395- Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, & substs) )
395+ Some ( self . resolve_impl_method_or_trait_def ( db, op_fn, substs) )
396396 }
397397
398398 pub ( crate ) fn resolve_field (
@@ -487,19 +487,22 @@ impl SourceAnalyzer {
487487
488488 let mut prefer_value_ns = false ;
489489 let resolved = ( || {
490+ let infer = self . infer . as_deref ( ) ?;
490491 if let Some ( path_expr) = parent ( ) . and_then ( ast:: PathExpr :: cast) {
491492 let expr_id = self . expr_id ( db, & path_expr. into ( ) ) ?;
492- let infer = self . infer . as_ref ( ) ?;
493493 if let Some ( assoc) = infer. assoc_resolutions_for_expr ( expr_id) {
494494 let assoc = match assoc {
495495 AssocItemId :: FunctionId ( f_in_trait) => {
496496 match infer. type_of_expr . get ( expr_id) {
497497 None => assoc,
498498 Some ( func_ty) => {
499499 if let TyKind :: FnDef ( _fn_def, subs) = func_ty. kind ( Interner ) {
500- self . resolve_impl_method ( db, f_in_trait, subs)
501- . map ( AssocItemId :: FunctionId )
502- . unwrap_or ( assoc)
500+ self . resolve_impl_method_or_trait_def (
501+ db,
502+ f_in_trait,
503+ subs. clone ( ) ,
504+ )
505+ . into ( )
503506 } else {
504507 assoc
505508 }
@@ -520,18 +523,18 @@ impl SourceAnalyzer {
520523 prefer_value_ns = true ;
521524 } else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
522525 let pat_id = self . pat_id ( & path_pat. into ( ) ) ?;
523- if let Some ( assoc) = self . infer . as_ref ( ) ? . assoc_resolutions_for_pat ( pat_id) {
526+ if let Some ( assoc) = infer. assoc_resolutions_for_pat ( pat_id) {
524527 return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
525528 }
526529 if let Some ( VariantId :: EnumVariantId ( variant) ) =
527- self . infer . as_ref ( ) ? . variant_resolution_for_pat ( pat_id)
530+ infer. variant_resolution_for_pat ( pat_id)
528531 {
529532 return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
530533 }
531534 } else if let Some ( rec_lit) = parent ( ) . and_then ( ast:: RecordExpr :: cast) {
532535 let expr_id = self . expr_id ( db, & rec_lit. into ( ) ) ?;
533536 if let Some ( VariantId :: EnumVariantId ( variant) ) =
534- self . infer . as_ref ( ) ? . variant_resolution_for_expr ( expr_id)
537+ infer. variant_resolution_for_expr ( expr_id)
535538 {
536539 return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
537540 }
@@ -541,8 +544,7 @@ impl SourceAnalyzer {
541544 || parent ( ) . and_then ( ast:: TupleStructPat :: cast) . map ( ast:: Pat :: from) ;
542545 if let Some ( pat) = record_pat. or_else ( tuple_struct_pat) {
543546 let pat_id = self . pat_id ( & pat) ?;
544- let variant_res_for_pat =
545- self . infer . as_ref ( ) ?. variant_resolution_for_pat ( pat_id) ;
547+ let variant_res_for_pat = infer. variant_resolution_for_pat ( pat_id) ;
546548 if let Some ( VariantId :: EnumVariantId ( variant) ) = variant_res_for_pat {
547549 return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
548550 }
@@ -780,37 +782,22 @@ impl SourceAnalyzer {
780782 false
781783 }
782784
783- fn resolve_impl_method (
785+ fn resolve_impl_method_or_trait_def (
784786 & self ,
785787 db : & dyn HirDatabase ,
786788 func : FunctionId ,
787- substs : & Substitution ,
788- ) -> Option < FunctionId > {
789- let impled_trait = match func. lookup ( db. upcast ( ) ) . container {
790- ItemContainerId :: TraitId ( trait_id) => trait_id,
791- _ => return None ,
792- } ;
793- if substs. is_empty ( Interner ) {
794- return None ;
795- }
796- let self_ty = substs. at ( Interner , 0 ) . ty ( Interner ) ?;
789+ substs : Substitution ,
790+ ) -> FunctionId {
797791 let krate = self . resolver . krate ( ) ;
798- let trait_env = self . resolver . body_owner ( ) ?. as_generic_def_id ( ) . map_or_else (
792+ let owner = match self . resolver . body_owner ( ) {
793+ Some ( it) => it,
794+ None => return func,
795+ } ;
796+ let env = owner. as_generic_def_id ( ) . map_or_else (
799797 || Arc :: new ( hir_ty:: TraitEnvironment :: empty ( krate) ) ,
800798 |d| db. trait_environment ( d) ,
801799 ) ;
802-
803- let fun_data = db. function_data ( func) ;
804- method_resolution:: lookup_impl_method ( self_ty, db, trait_env, impled_trait, & fun_data. name )
805- }
806-
807- fn resolve_impl_method_or_trait_def (
808- & self ,
809- db : & dyn HirDatabase ,
810- func : FunctionId ,
811- substs : & Substitution ,
812- ) -> FunctionId {
813- self . resolve_impl_method ( db, func, substs) . unwrap_or ( func)
800+ method_resolution:: lookup_impl_method ( db, env, func, substs)
814801 }
815802
816803 fn lang_trait_fn (
0 commit comments