@@ -521,7 +521,7 @@ impl<'a> TyLoweringContext<'a> {
521
521
TyDefId :: AdtId ( it) => Some ( it. into ( ) ) ,
522
522
TyDefId :: TypeAliasId ( it) => Some ( it. into ( ) ) ,
523
523
} ;
524
- let substs = self . substs_from_path_segment ( segment, generic_def, infer_args) ;
524
+ let substs = self . substs_from_path_segment ( segment, generic_def, infer_args, None ) ;
525
525
self . db . ty ( typeable) . subst ( & substs)
526
526
}
527
527
@@ -558,14 +558,15 @@ impl<'a> TyLoweringContext<'a> {
558
558
( segment, Some ( var. parent . into ( ) ) )
559
559
}
560
560
} ;
561
- self . substs_from_path_segment ( segment, generic_def, infer_args)
561
+ self . substs_from_path_segment ( segment, generic_def, infer_args, None )
562
562
}
563
563
564
564
fn substs_from_path_segment (
565
565
& self ,
566
566
segment : PathSegment < ' _ > ,
567
567
def_generic : Option < GenericDefId > ,
568
568
infer_args : bool ,
569
+ explicit_self_ty : Option < Ty > ,
569
570
) -> Substitution {
570
571
let mut substs = Vec :: new ( ) ;
571
572
let def_generics = def_generic. map ( |def| generics ( self . db . upcast ( ) , def) ) ;
@@ -576,11 +577,19 @@ impl<'a> TyLoweringContext<'a> {
576
577
577
578
substs. extend ( iter:: repeat ( TyKind :: Unknown . intern ( & Interner ) ) . take ( parent_params) ) ;
578
579
580
+ let fill_self_params = || {
581
+ substs. extend (
582
+ explicit_self_ty
583
+ . into_iter ( )
584
+ . chain ( iter:: repeat ( TyKind :: Unknown . intern ( & Interner ) ) )
585
+ . take ( self_params) ,
586
+ )
587
+ } ;
579
588
let mut had_explicit_type_args = false ;
580
589
581
590
if let Some ( generic_args) = & segment. args_and_bindings {
582
591
if !generic_args. has_self_type {
583
- substs . extend ( iter :: repeat ( TyKind :: Unknown . intern ( & Interner ) ) . take ( self_params ) ) ;
592
+ fill_self_params ( ) ;
584
593
}
585
594
let expected_num =
586
595
if generic_args. has_self_type { self_params + type_params } else { type_params } ;
@@ -602,6 +611,8 @@ impl<'a> TyLoweringContext<'a> {
602
611
GenericArg :: Lifetime ( _) => { }
603
612
}
604
613
}
614
+ } else {
615
+ fill_self_params ( ) ;
605
616
}
606
617
607
618
// handle defaults. In expression or pattern path segments without
@@ -650,10 +661,7 @@ impl<'a> TyLoweringContext<'a> {
650
661
segment : PathSegment < ' _ > ,
651
662
explicit_self_ty : Option < Ty > ,
652
663
) -> TraitRef {
653
- let mut substs = self . trait_ref_substs_from_path ( segment, resolved) ;
654
- if let Some ( self_ty) = explicit_self_ty {
655
- substs. 0 [ 0 ] = self_ty;
656
- }
664
+ let substs = self . trait_ref_substs_from_path ( segment, resolved, explicit_self_ty) ;
657
665
TraitRef { trait_id : to_chalk_trait_id ( resolved) , substitution : substs }
658
666
}
659
667
@@ -673,8 +681,9 @@ impl<'a> TyLoweringContext<'a> {
673
681
& self ,
674
682
segment : PathSegment < ' _ > ,
675
683
resolved : TraitId ,
684
+ explicit_self_ty : Option < Ty > ,
676
685
) -> Substitution {
677
- self . substs_from_path_segment ( segment, Some ( resolved. into ( ) ) , false )
686
+ self . substs_from_path_segment ( segment, Some ( resolved. into ( ) ) , false , explicit_self_ty )
678
687
}
679
688
680
689
pub ( crate ) fn lower_where_predicate (
0 commit comments