File tree Expand file tree Collapse file tree 2 files changed +46
-8
lines changed
src/tools/rust-analyzer/crates Expand file tree Collapse file tree 2 files changed +46
-8
lines changed Original file line number Diff line number Diff line change @@ -3773,17 +3773,23 @@ impl GenericSubstitution {
37733773 TypeOrConstParamData :: ConstParamData ( _) => None ,
37743774 } ) ;
37753775 // 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
37783778 . 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)
37833780 . 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 ( ) } ) )
37853782 } )
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
37873793 }
37883794}
37893795
Original file line number Diff line number Diff line change @@ -10762,3 +10762,35 @@ fn bar(v: &Foo<i32>) {
1076210762 "# ] ] ,
1076310763 ) ;
1076410764}
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