@@ -270,7 +270,7 @@ impl SourceAnalyzer {
270
270
let expr_id = self . expr_id ( db, & call. clone ( ) . into ( ) ) ?;
271
271
let ( f_in_trait, substs) = self . infer . as_ref ( ) ?. method_resolution ( expr_id) ?;
272
272
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) )
274
274
}
275
275
276
276
pub ( crate ) fn resolve_await_to_poll (
@@ -311,7 +311,7 @@ impl SourceAnalyzer {
311
311
// HACK: subst for `poll()` coincides with that for `Future` because `poll()` itself
312
312
// doesn't have any generic parameters, so we skip building another subst for `poll()`.
313
313
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) )
315
315
}
316
316
317
317
pub ( crate ) fn resolve_prefix_expr (
@@ -331,7 +331,7 @@ impl SourceAnalyzer {
331
331
// don't have any generic parameters, so we skip building another subst for the methods.
332
332
let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_trait, None ) . push ( ty. clone ( ) ) . build ( ) ;
333
333
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) )
335
335
}
336
336
337
337
pub ( crate ) fn resolve_index_expr (
@@ -351,7 +351,7 @@ impl SourceAnalyzer {
351
351
. push ( base_ty. clone ( ) )
352
352
. push ( index_ty. clone ( ) )
353
353
. 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) )
355
355
}
356
356
357
357
pub ( crate ) fn resolve_bin_expr (
@@ -372,7 +372,7 @@ impl SourceAnalyzer {
372
372
. push ( rhs. clone ( ) )
373
373
. build ( ) ;
374
374
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) )
376
376
}
377
377
378
378
pub ( crate ) fn resolve_try_expr (
@@ -392,7 +392,7 @@ impl SourceAnalyzer {
392
392
// doesn't have any generic parameters, so we skip building another subst for `branch()`.
393
393
let substs = hir_ty:: TyBuilder :: subst_for_def ( db, op_trait, None ) . push ( ty. clone ( ) ) . build ( ) ;
394
394
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) )
396
396
}
397
397
398
398
pub ( crate ) fn resolve_field (
@@ -487,19 +487,22 @@ impl SourceAnalyzer {
487
487
488
488
let mut prefer_value_ns = false ;
489
489
let resolved = ( || {
490
+ let infer = self . infer . as_deref ( ) ?;
490
491
if let Some ( path_expr) = parent ( ) . and_then ( ast:: PathExpr :: cast) {
491
492
let expr_id = self . expr_id ( db, & path_expr. into ( ) ) ?;
492
- let infer = self . infer . as_ref ( ) ?;
493
493
if let Some ( assoc) = infer. assoc_resolutions_for_expr ( expr_id) {
494
494
let assoc = match assoc {
495
495
AssocItemId :: FunctionId ( f_in_trait) => {
496
496
match infer. type_of_expr . get ( expr_id) {
497
497
None => assoc,
498
498
Some ( func_ty) => {
499
499
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 ( )
503
506
} else {
504
507
assoc
505
508
}
@@ -520,18 +523,18 @@ impl SourceAnalyzer {
520
523
prefer_value_ns = true ;
521
524
} else if let Some ( path_pat) = parent ( ) . and_then ( ast:: PathPat :: cast) {
522
525
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) {
524
527
return Some ( PathResolution :: Def ( AssocItem :: from ( assoc) . into ( ) ) ) ;
525
528
}
526
529
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)
528
531
{
529
532
return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
530
533
}
531
534
} else if let Some ( rec_lit) = parent ( ) . and_then ( ast:: RecordExpr :: cast) {
532
535
let expr_id = self . expr_id ( db, & rec_lit. into ( ) ) ?;
533
536
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)
535
538
{
536
539
return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
537
540
}
@@ -541,8 +544,7 @@ impl SourceAnalyzer {
541
544
|| parent ( ) . and_then ( ast:: TupleStructPat :: cast) . map ( ast:: Pat :: from) ;
542
545
if let Some ( pat) = record_pat. or_else ( tuple_struct_pat) {
543
546
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) ;
546
548
if let Some ( VariantId :: EnumVariantId ( variant) ) = variant_res_for_pat {
547
549
return Some ( PathResolution :: Def ( ModuleDef :: Variant ( variant. into ( ) ) ) ) ;
548
550
}
@@ -780,37 +782,22 @@ impl SourceAnalyzer {
780
782
false
781
783
}
782
784
783
- fn resolve_impl_method (
785
+ fn resolve_impl_method_or_trait_def (
784
786
& self ,
785
787
db : & dyn HirDatabase ,
786
788
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 {
797
791
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 (
799
797
|| Arc :: new ( hir_ty:: TraitEnvironment :: empty ( krate) ) ,
800
798
|d| db. trait_environment ( d) ,
801
799
) ;
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)
814
801
}
815
802
816
803
fn lang_trait_fn (
0 commit comments