about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/tools/rust-analyzer/crates/hir/src/lib.rs22
-rw-r--r--src/tools/rust-analyzer/crates/ide/src/hover/tests.rs32
2 files changed, 46 insertions, 8 deletions
diff --git a/src/tools/rust-analyzer/crates/hir/src/lib.rs b/src/tools/rust-analyzer/crates/hir/src/lib.rs
index f560157deb8..65c8ec0c25e 100644
--- a/src/tools/rust-analyzer/crates/hir/src/lib.rs
+++ b/src/tools/rust-analyzer/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/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs b/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
index ab735907344..e08a95659e5 100644
--- a/src/tools/rust-analyzer/crates/ide/src/hover/tests.rs
+++ b/src/tools/rust-analyzer/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)
+            ```
+        "#]],
+    );
+}