Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions crates/hir/src/display.rs
Original file line number Diff line number Diff line change
Expand Up @@ -192,9 +192,10 @@ fn write_impl_header<'db>(impl_: &Impl, f: &mut HirFormatter<'_, 'db>) -> Result
let def_id = GenericDefId::ImplId(impl_.id);
write_generic_params(def_id, f)?;

if let Some(trait_) = impl_.trait_(db) {
let trait_data = db.trait_signature(trait_.id);
write!(f, " {} for", trait_data.name.display(db, f.edition()))?;
if let Some(trait_ref) = impl_.trait_ref(db) {
f.write_char(' ')?;
trait_ref.hir_fmt(f)?;
f.write_str(" for")?;
}

f.write_char(' ')?;
Expand Down
57 changes: 57 additions & 0 deletions crates/ide/src/hover/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11169,3 +11169,60 @@ fn foo() {
"#]],
);
}

#[test]
fn hover_trait_impl_shows_generic_args() {
// Single generic arg
check(
r#"
trait Foo<T> {
fn foo(&self) {}
}

impl<T> Foo<()> for T {
fn fo$0o(&self) {}
}

fn bar() {
().foo();
}
"#,
expect![[r#"
*foo*

```rust
ra_test_fixture
```

```rust
impl<T> Foo<()> for T
fn foo(&self)
```
"#]],
);

// Multiple generic args
check(
r#"
trait Foo<A, B> {
fn foo(&self) {}
}

impl<T> Foo<i32, u64> for T {
fn fo$0o(&self) {}
}
"#,
expect![[r#"
*foo*

```rust
ra_test_fixture
```

```rust
impl<T> Foo<i32, u64> for T
fn foo(&self)
```
"#]],
);
}