diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index f560157deb..65c8ec0c25 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -3773,17 +3773,23 @@ impl GenericSubstitution { TypeOrConstParamData::ConstParamData(_) => None, }); // The `Substitution` is first self then container, we want the reverse order. - let self_params = self.subst.type_parameters(Interner).zip(type_params); - let container_params = self.subst.as_slice(Interner)[generics.len()..] + let subst_type_params = self.subst.type_parameters(Interner).collect::>(); + let mut self_params = subst_type_params .iter() - .filter_map(|param| param.ty(Interner).cloned()) - .zip(container_type_params.into_iter().flatten()); - container_params - .chain(self_params) + .zip(type_params) .filter_map(|(ty, name)| { - Some((name?.symbol().clone(), Type { ty, env: self.env.clone() })) + Some((name?.symbol().clone(), Type { ty: ty.clone(), env: self.env.clone() })) }) - .collect() + .collect::>(); + let mut container_params = subst_type_params[self_params.len()..] + .iter() + .zip(container_type_params.into_iter().flatten()) + .filter_map(|(ty, name)| { + Some((name?.symbol().clone(), Type { ty: ty.clone(), env: self.env.clone() })) + }) + .collect::>(); + container_params.append(&mut self_params); + container_params } } diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs index ab73590734..e08a95659e 100644 --- a/crates/ide/src/hover/tests.rs +++ b/crates/ide/src/hover/tests.rs @@ -10762,3 +10762,35 @@ fn bar(v: &Foo) { "#]], ); } + +#[test] +fn extra_lifetime_param_on_trait_method_subst() { + check( + r#" +struct AudioFormat; + +trait ValueEnum { + fn to_possible_value(&self); +} + +impl ValueEnum for AudioFormat { + fn to_possible_value<'a>(&'a self) {} +} + +fn main() { + ValueEnum::to_possible_value$0(&AudioFormat); +} + "#, + expect![[r#" + *to_possible_value* + + ```rust + ra_test_fixture::AudioFormat + ``` + + ```rust + fn to_possible_value<'a>(&'a self) + ``` + "#]], + ); +}