Skip to content

Commit e1b11fe

Browse files
Merge pull request #21226 from benodiwal/fix/impl-display-trait-generic-args
fix: fixed Impl display to show trait generic args
2 parents 205a172 + 2cf82ff commit e1b11fe

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

crates/hir/src/display.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,11 @@ fn write_impl_header<'db>(impl_: &Impl, f: &mut HirFormatter<'_, 'db>) -> Result
192192
let def_id = GenericDefId::ImplId(impl_.id);
193193
write_generic_params(def_id, f)?;
194194

195-
if let Some(trait_) = impl_.trait_(db) {
196-
let trait_data = db.trait_signature(trait_.id);
197-
write!(f, " {} for", trait_data.name.display(db, f.edition()))?;
195+
let impl_data = db.impl_signature(impl_.id);
196+
if let Some(target_trait) = &impl_data.target_trait {
197+
f.write_char(' ')?;
198+
hir_display_with_store(&impl_data.store[target_trait.path], &impl_data.store).hir_fmt(f)?;
199+
f.write_str(" for")?;
198200
}
199201

200202
f.write_char(' ')?;

crates/ide/src/hover/tests.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11169,3 +11169,60 @@ fn foo() {
1116911169
"#]],
1117011170
);
1117111171
}
11172+
11173+
#[test]
11174+
fn hover_trait_impl_shows_generic_args() {
11175+
// Single generic arg
11176+
check(
11177+
r#"
11178+
trait Foo<T> {
11179+
fn foo(&self) {}
11180+
}
11181+
11182+
impl<T> Foo<()> for T {
11183+
fn fo$0o(&self) {}
11184+
}
11185+
11186+
fn bar() {
11187+
().foo();
11188+
}
11189+
"#,
11190+
expect![[r#"
11191+
*foo*
11192+
11193+
```rust
11194+
ra_test_fixture
11195+
```
11196+
11197+
```rust
11198+
impl<T> Foo<()> for T
11199+
fn foo(&self)
11200+
```
11201+
"#]],
11202+
);
11203+
11204+
// Multiple generic args
11205+
check(
11206+
r#"
11207+
trait Foo<A, B> {
11208+
fn foo(&self) {}
11209+
}
11210+
11211+
impl<T> Foo<i32, u64> for T {
11212+
fn fo$0o(&self) {}
11213+
}
11214+
"#,
11215+
expect![[r#"
11216+
*foo*
11217+
11218+
```rust
11219+
ra_test_fixture
11220+
```
11221+
11222+
```rust
11223+
impl<T> Foo<i32, u64> for T
11224+
fn foo(&self)
11225+
```
11226+
"#]],
11227+
);
11228+
}

0 commit comments

Comments
 (0)