Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir/src/lib.rs22
-rw-r--r--crates/ide/src/hover/tests.rs32
2 files changed, 46 insertions, 8 deletions
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::<Vec<_>>();
+ 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::<Vec<_>>();
+ 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::<Vec<_>>();
+ 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<i32>) {
"#]],
);
}
+
+#[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)
+ ```
+ "#]],
+ );
+}