Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #17832 - ShoyuVanilla:issue-17811, r=Veykril
fix: Panic while rendering function type hint with impl trait arg Fixes #17811
bors 2024-08-08
parent 34d9409 · parent aa62c9d · commit dab022f
-rw-r--r--crates/hir-ty/src/display.rs8
-rw-r--r--crates/ide/src/hover/tests.rs23
2 files changed, 27 insertions, 4 deletions
diff --git a/crates/hir-ty/src/display.rs b/crates/hir-ty/src/display.rs
index a433ecfd77..47ea2f5347 100644
--- a/crates/hir-ty/src/display.rs
+++ b/crates/hir-ty/src/display.rs
@@ -1022,16 +1022,16 @@ impl HirDisplay for Ty {
// We print all params except implicit impl Trait params. Still a bit weird; should we leave out parent and self?
if parameters.len() - impl_ > 0 {
// `parameters` are in the order of fn's params (including impl traits), fn's lifetimes
+ let without_impl = self_param as usize + type_ + const_ + lifetime;
// parent's params (those from enclosing impl or trait, if any).
- let (fn_params, other) =
- parameters.split_at(self_param as usize + type_ + const_ + lifetime);
- let (_impl, parent_params) = other.split_at(impl_);
+ let (fn_params, parent_params) = parameters.split_at(without_impl + impl_);
debug_assert_eq!(parent_params.len(), parent_len);
let parent_params =
generic_args_sans_defaults(f, Some(generic_def_id), parent_params);
let fn_params =
- generic_args_sans_defaults(f, Some(generic_def_id), fn_params);
+ &generic_args_sans_defaults(f, Some(generic_def_id), fn_params)
+ [0..without_impl];
write!(f, "<")?;
hir_fmt_generic_arguments(f, parent_params, None)?;
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index ecfcf82e00..516e32ef91 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -8579,3 +8579,26 @@ fn main(a$0: T) {}
"#]],
);
}
+
+#[test]
+fn hover_fn_with_impl_trait_arg() {
+ check(
+ r#"
+trait Foo {}
+impl Foo for bool {}
+fn bar<const WIDTH: u8>(_: impl Foo) {}
+fn test() {
+ let f = bar::<3>;
+ f$0(true);
+}
+"#,
+ expect![[r#"
+ *f*
+
+ ```rust
+ // size = 0, align = 1
+ let f: fn bar<3>(bool)
+ ```
+ "#]],
+ );
+}