File tree 2 files changed +46
-8
lines changed
2 files changed +46
-8
lines changed Original file line number Diff line number Diff line change @@ -3773,17 +3773,23 @@ impl GenericSubstitution {
3773
3773
TypeOrConstParamData :: ConstParamData ( _) => None ,
3774
3774
} ) ;
3775
3775
// The `Substitution` is first self then container, we want the reverse order.
3776
- let self_params = self . subst . type_parameters ( Interner ) . zip ( type_params ) ;
3777
- let container_params = self . subst . as_slice ( Interner ) [ generics . len ( ) .. ]
3776
+ let subst_type_params = self . subst . type_parameters ( Interner ) . collect :: < Vec < _ > > ( ) ;
3777
+ let mut self_params = subst_type_params
3778
3778
. iter ( )
3779
- . filter_map ( |param| param. ty ( Interner ) . cloned ( ) )
3780
- . zip ( container_type_params. into_iter ( ) . flatten ( ) ) ;
3781
- container_params
3782
- . chain ( self_params)
3779
+ . zip ( type_params)
3783
3780
. filter_map ( |( ty, name) | {
3784
- Some ( ( name?. symbol ( ) . clone ( ) , Type { ty, env : self . env . clone ( ) } ) )
3781
+ Some ( ( name?. symbol ( ) . clone ( ) , Type { ty : ty . clone ( ) , env : self . env . clone ( ) } ) )
3785
3782
} )
3786
- . collect ( )
3783
+ . collect :: < Vec < _ > > ( ) ;
3784
+ let mut container_params = subst_type_params[ self_params. len ( ) ..]
3785
+ . iter ( )
3786
+ . zip ( container_type_params. into_iter ( ) . flatten ( ) )
3787
+ . filter_map ( |( ty, name) | {
3788
+ Some ( ( name?. symbol ( ) . clone ( ) , Type { ty : ty. clone ( ) , env : self . env . clone ( ) } ) )
3789
+ } )
3790
+ . collect :: < Vec < _ > > ( ) ;
3791
+ container_params. append ( & mut self_params) ;
3792
+ container_params
3787
3793
}
3788
3794
}
3789
3795
Original file line number Diff line number Diff line change @@ -10762,3 +10762,35 @@ fn bar(v: &Foo<i32>) {
10762
10762
"# ] ] ,
10763
10763
) ;
10764
10764
}
10765
+
10766
+ #[ test]
10767
+ fn extra_lifetime_param_on_trait_method_subst ( ) {
10768
+ check (
10769
+ r#"
10770
+ struct AudioFormat;
10771
+
10772
+ trait ValueEnum {
10773
+ fn to_possible_value(&self);
10774
+ }
10775
+
10776
+ impl ValueEnum for AudioFormat {
10777
+ fn to_possible_value<'a>(&'a self) {}
10778
+ }
10779
+
10780
+ fn main() {
10781
+ ValueEnum::to_possible_value$0(&AudioFormat);
10782
+ }
10783
+ "# ,
10784
+ expect ! [ [ r#"
10785
+ *to_possible_value*
10786
+
10787
+ ```rust
10788
+ ra_test_fixture::AudioFormat
10789
+ ```
10790
+
10791
+ ```rust
10792
+ fn to_possible_value<'a>(&'a self)
10793
+ ```
10794
+ "# ] ] ,
10795
+ ) ;
10796
+ }
You can’t perform that action at this time.
0 commit comments