Skip to content

Commit cd49553

Browse files
committed
feat: preview adt field when hover
1 parent 6943228 commit cd49553

File tree

2 files changed

+86
-13
lines changed

2 files changed

+86
-13
lines changed

crates/hir/src/display.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,40 @@ impl HirDisplay for Struct {
163163
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
164164
let def_id = GenericDefId::AdtId(AdtId::StructId(self.id));
165165
write_generic_params(def_id, f)?;
166+
167+
let field_is_tuple_index =
168+
self.variant_data(f.db).fields().iter().any(|(_, f)| f.name.as_tuple_index().is_some());
169+
170+
if field_is_tuple_index {
171+
f.write_char('(')?;
172+
let variant_data = self.variant_data(f.db);
173+
let mut it = variant_data.fields().iter().peekable();
174+
175+
while let Some((id, _)) = it.next() {
176+
let field = Field { parent: (*self).into(), id };
177+
field.ty(f.db).hir_fmt(f)?;
178+
if it.peek().is_some() {
179+
f.write_str(", ")?;
180+
}
181+
}
182+
183+
f.write_str(");")?;
184+
return Ok(());
185+
}
186+
166187
write_where_clause(def_id, f)?;
188+
189+
let fields = self.fields(f.db);
190+
if !fields.is_empty() {
191+
f.write_str("\n{\n")?;
192+
for field in self.fields(f.db) {
193+
f.write_str(" ")?;
194+
field.hir_fmt(f)?;
195+
f.write_str(",\n")?;
196+
}
197+
f.write_str("}")?;
198+
}
199+
167200
Ok(())
168201
}
169202
}
@@ -176,6 +209,18 @@ impl HirDisplay for Enum {
176209
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
177210
write_generic_params(def_id, f)?;
178211
write_where_clause(def_id, f)?;
212+
213+
let variants = self.variants(f.db);
214+
if !variants.is_empty() {
215+
f.write_str("\n{\n")?;
216+
for variant in variants {
217+
f.write_str(" ")?;
218+
variant.hir_fmt(f)?;
219+
f.write_str(",\n")?;
220+
}
221+
f.write_str("}")?;
222+
}
223+
179224
Ok(())
180225
}
181226
}
@@ -188,6 +233,18 @@ impl HirDisplay for Union {
188233
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
189234
write_generic_params(def_id, f)?;
190235
write_where_clause(def_id, f)?;
236+
237+
let fields = self.fields(f.db);
238+
if !fields.is_empty() {
239+
f.write_str(" {\n")?;
240+
for field in self.fields(f.db) {
241+
f.write_str(" ")?;
242+
field.hir_fmt(f)?;
243+
f.write_char('\n')?;
244+
}
245+
f.write_str("}")?;
246+
}
247+
191248
Ok(())
192249
}
193250
}

crates/ide/src/hover/tests.rs

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1137,6 +1137,9 @@ impl Thing {
11371137
11381138
```rust
11391139
struct Thing
1140+
{
1141+
x: u32,
1142+
}
11401143
```
11411144
"#]],
11421145
);
@@ -1156,6 +1159,9 @@ impl Thing {
11561159
11571160
```rust
11581161
struct Thing
1162+
{
1163+
x: u32,
1164+
}
11591165
```
11601166
"#]],
11611167
);
@@ -1175,6 +1181,9 @@ impl Thing {
11751181
11761182
```rust
11771183
enum Thing
1184+
{
1185+
A,
1186+
}
11781187
```
11791188
"#]],
11801189
);
@@ -1194,6 +1203,9 @@ impl Thing {
11941203
11951204
```rust
11961205
enum Thing
1206+
{
1207+
A,
1208+
}
11971209
```
11981210
"#]],
11991211
);
@@ -2005,7 +2017,11 @@ fn test_hover_layout_of_enum() {
20052017
```
20062018
20072019
```rust
2008-
enum Foo // size = 16 (0x10), align = 8, niches = 254
2020+
enum Foo
2021+
{
2022+
Variant1(u8, u16),
2023+
Variant2(i32, u8, i64),
2024+
} // size = 16 (0x10), align = 8, niches = 254
20092025
```
20102026
"#]],
20112027
);
@@ -2346,7 +2362,7 @@ fn main() { let s$0t = S{ f1:0 }; }
23462362
focus_range: 7..8,
23472363
name: "S",
23482364
kind: Struct,
2349-
description: "struct S",
2365+
description: "struct S\n{\n f1: u32,\n}",
23502366
},
23512367
},
23522368
],
@@ -2379,7 +2395,7 @@ fn main() { let s$0t = S{ f1:Arg(0) }; }
23792395
focus_range: 24..25,
23802396
name: "S",
23812397
kind: Struct,
2382-
description: "struct S<T>",
2398+
description: "struct S<T>\n{\n f1: T,\n}",
23832399
},
23842400
},
23852401
HoverGotoTypeData {
@@ -2392,7 +2408,7 @@ fn main() { let s$0t = S{ f1:Arg(0) }; }
23922408
focus_range: 7..10,
23932409
name: "Arg",
23942410
kind: Struct,
2395-
description: "struct Arg",
2411+
description: "struct Arg(u32);",
23962412
},
23972413
},
23982414
],
@@ -2438,7 +2454,7 @@ fn main() { let s$0t = S{ f1: S{ f1: Arg(0) } }; }
24382454
focus_range: 24..25,
24392455
name: "S",
24402456
kind: Struct,
2441-
description: "struct S<T>",
2457+
description: "struct S<T>\n{\n f1: T,\n}",
24422458
},
24432459
},
24442460
HoverGotoTypeData {
@@ -2451,7 +2467,7 @@ fn main() { let s$0t = S{ f1: S{ f1: Arg(0) } }; }
24512467
focus_range: 7..10,
24522468
name: "Arg",
24532469
kind: Struct,
2454-
description: "struct Arg",
2470+
description: "struct Arg(u32);",
24552471
},
24562472
},
24572473
],
@@ -2487,7 +2503,7 @@ fn main() { let s$0t = (A(1), B(2), M::C(3) ); }
24872503
focus_range: 7..8,
24882504
name: "A",
24892505
kind: Struct,
2490-
description: "struct A",
2506+
description: "struct A(u32);",
24912507
},
24922508
},
24932509
HoverGotoTypeData {
@@ -2500,7 +2516,7 @@ fn main() { let s$0t = (A(1), B(2), M::C(3) ); }
25002516
focus_range: 22..23,
25012517
name: "B",
25022518
kind: Struct,
2503-
description: "struct B",
2519+
description: "struct B(u32);",
25042520
},
25052521
},
25062522
HoverGotoTypeData {
@@ -2514,7 +2530,7 @@ fn main() { let s$0t = (A(1), B(2), M::C(3) ); }
25142530
name: "C",
25152531
kind: Struct,
25162532
container_name: "M",
2517-
description: "pub struct C",
2533+
description: "pub struct C(u32);",
25182534
},
25192535
},
25202536
],
@@ -3335,7 +3351,7 @@ struct S$0T<const C: usize = 1, T = Foo>(T);
33353351
```
33363352
33373353
```rust
3338-
struct ST<const C: usize = 1, T = Foo>
3354+
struct ST<const C: usize = 1, T = Foo>(T);
33393355
```
33403356
"#]],
33413357
);
@@ -3356,7 +3372,7 @@ struct S$0T<const C: usize = {40 + 2}, T = Foo>(T);
33563372
```
33573373
33583374
```rust
3359-
struct ST<const C: usize = {const}, T = Foo>
3375+
struct ST<const C: usize = {const}, T = Foo>(T);
33603376
```
33613377
"#]],
33623378
);
@@ -3378,7 +3394,7 @@ struct S$0T<const C: usize = VAL, T = Foo>(T);
33783394
```
33793395
33803396
```rust
3381-
struct ST<const C: usize = VAL, T = Foo>
3397+
struct ST<const C: usize = VAL, T = Foo>(T);
33823398
```
33833399
"#]],
33843400
);
@@ -5935,7 +5951,7 @@ pub struct Foo(i32);
59355951
```
59365952
59375953
```rust
5938-
pub struct Foo // size = 4, align = 4
5954+
pub struct Foo(i32); // size = 4, align = 4
59395955
```
59405956
59415957
---

0 commit comments

Comments
 (0)