mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-28 09:44:08 +00:00
Auto merge of #15847 - wasd96040501:feat/preview_adt, r=lnicola
feat: preview adt field when hover Closes #13977 ![20231108194345_rec_](https://github.com/rust-lang/rust-analyzer/assets/14040068/95894c4b-de6e-4ca4-98b3-6ab4559d0950)
This commit is contained in:
commit
7059ae2fc2
@ -1,6 +1,6 @@
|
|||||||
//! HirDisplay implementations for various hir types.
|
//! HirDisplay implementations for various hir types.
|
||||||
use hir_def::{
|
use hir_def::{
|
||||||
data::adt::VariantData,
|
data::adt::{StructKind, VariantData},
|
||||||
generics::{
|
generics::{
|
||||||
TypeOrConstParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget,
|
TypeOrConstParamData, TypeParamProvenance, WherePredicate, WherePredicateTypeTarget,
|
||||||
},
|
},
|
||||||
@ -163,7 +163,40 @@ impl HirDisplay for Struct {
|
|||||||
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
|
write!(f, "{}", self.name(f.db).display(f.db.upcast()))?;
|
||||||
let def_id = GenericDefId::AdtId(AdtId::StructId(self.id));
|
let def_id = GenericDefId::AdtId(AdtId::StructId(self.id));
|
||||||
write_generic_params(def_id, f)?;
|
write_generic_params(def_id, f)?;
|
||||||
|
|
||||||
|
let variant_data = self.variant_data(f.db);
|
||||||
|
if let StructKind::Tuple = variant_data.kind() {
|
||||||
|
f.write_char('(')?;
|
||||||
|
let mut it = variant_data.fields().iter().peekable();
|
||||||
|
|
||||||
|
while let Some((id, _)) = it.next() {
|
||||||
|
let field = Field { parent: (*self).into(), id };
|
||||||
|
field.ty(f.db).hir_fmt(f)?;
|
||||||
|
if it.peek().is_some() {
|
||||||
|
f.write_str(", ")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f.write_str(");")?;
|
||||||
|
}
|
||||||
|
|
||||||
write_where_clause(def_id, f)?;
|
write_where_clause(def_id, f)?;
|
||||||
|
|
||||||
|
if let StructKind::Record = variant_data.kind() {
|
||||||
|
let fields = self.fields(f.db);
|
||||||
|
if fields.is_empty() {
|
||||||
|
f.write_str(" {}")?;
|
||||||
|
} else {
|
||||||
|
f.write_str(" {\n")?;
|
||||||
|
for field in self.fields(f.db) {
|
||||||
|
f.write_str(" ")?;
|
||||||
|
field.hir_fmt(f)?;
|
||||||
|
f.write_str(",\n")?;
|
||||||
|
}
|
||||||
|
f.write_str("}")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,6 +209,18 @@ impl HirDisplay for Enum {
|
|||||||
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
|
let def_id = GenericDefId::AdtId(AdtId::EnumId(self.id));
|
||||||
write_generic_params(def_id, f)?;
|
write_generic_params(def_id, f)?;
|
||||||
write_where_clause(def_id, f)?;
|
write_where_clause(def_id, f)?;
|
||||||
|
|
||||||
|
let variants = self.variants(f.db);
|
||||||
|
if !variants.is_empty() {
|
||||||
|
f.write_str(" {\n")?;
|
||||||
|
for variant in variants {
|
||||||
|
f.write_str(" ")?;
|
||||||
|
variant.hir_fmt(f)?;
|
||||||
|
f.write_str(",\n")?;
|
||||||
|
}
|
||||||
|
f.write_str("}")?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -188,6 +233,18 @@ impl HirDisplay for Union {
|
|||||||
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
|
let def_id = GenericDefId::AdtId(AdtId::UnionId(self.id));
|
||||||
write_generic_params(def_id, f)?;
|
write_generic_params(def_id, f)?;
|
||||||
write_where_clause(def_id, f)?;
|
write_where_clause(def_id, f)?;
|
||||||
|
|
||||||
|
let fields = self.fields(f.db);
|
||||||
|
if !fields.is_empty() {
|
||||||
|
f.write_str(" {\n")?;
|
||||||
|
for field in self.fields(f.db) {
|
||||||
|
f.write_str(" ")?;
|
||||||
|
field.hir_fmt(f)?;
|
||||||
|
f.write_str(",\n")?;
|
||||||
|
}
|
||||||
|
f.write_str("}")?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1136,7 +1136,9 @@ impl Thing {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
struct Thing
|
struct Thing {
|
||||||
|
x: u32,
|
||||||
|
}
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -1155,7 +1157,9 @@ impl Thing {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
struct Thing
|
struct Thing {
|
||||||
|
x: u32,
|
||||||
|
}
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -1174,7 +1178,9 @@ impl Thing {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
enum Thing
|
enum Thing {
|
||||||
|
A,
|
||||||
|
}
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -1193,7 +1199,9 @@ impl Thing {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
enum Thing
|
enum Thing {
|
||||||
|
A,
|
||||||
|
}
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -2005,7 +2013,10 @@ fn test_hover_layout_of_enum() {
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
enum Foo // size = 16 (0x10), align = 8, niches = 254
|
enum Foo {
|
||||||
|
Variant1(u8, u16),
|
||||||
|
Variant2(i32, u8, i64),
|
||||||
|
} // size = 16 (0x10), align = 8, niches = 254
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -2346,7 +2357,7 @@ fn main() { let s$0t = S{ f1:0 }; }
|
|||||||
focus_range: 7..8,
|
focus_range: 7..8,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S",
|
description: "struct S {\n f1: u32,\n}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2379,7 +2390,7 @@ fn main() { let s$0t = S{ f1:Arg(0) }; }
|
|||||||
focus_range: 24..25,
|
focus_range: 24..25,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S<T>",
|
description: "struct S<T> {\n f1: T,\n}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -2392,7 +2403,7 @@ fn main() { let s$0t = S{ f1:Arg(0) }; }
|
|||||||
focus_range: 7..10,
|
focus_range: 7..10,
|
||||||
name: "Arg",
|
name: "Arg",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct Arg",
|
description: "struct Arg(u32);",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2438,7 +2449,7 @@ fn main() { let s$0t = S{ f1: S{ f1: Arg(0) } }; }
|
|||||||
focus_range: 24..25,
|
focus_range: 24..25,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S<T>",
|
description: "struct S<T> {\n f1: T,\n}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -2451,7 +2462,7 @@ fn main() { let s$0t = S{ f1: S{ f1: Arg(0) } }; }
|
|||||||
focus_range: 7..10,
|
focus_range: 7..10,
|
||||||
name: "Arg",
|
name: "Arg",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct Arg",
|
description: "struct Arg(u32);",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2487,7 +2498,7 @@ fn main() { let s$0t = (A(1), B(2), M::C(3) ); }
|
|||||||
focus_range: 7..8,
|
focus_range: 7..8,
|
||||||
name: "A",
|
name: "A",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct A",
|
description: "struct A(u32);",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -2500,7 +2511,7 @@ fn main() { let s$0t = (A(1), B(2), M::C(3) ); }
|
|||||||
focus_range: 22..23,
|
focus_range: 22..23,
|
||||||
name: "B",
|
name: "B",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct B",
|
description: "struct B(u32);",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -2514,7 +2525,7 @@ fn main() { let s$0t = (A(1), B(2), M::C(3) ); }
|
|||||||
name: "C",
|
name: "C",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
container_name: "M",
|
container_name: "M",
|
||||||
description: "pub struct C",
|
description: "pub struct C(u32);",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2704,7 +2715,7 @@ fn main() { let s$0t = foo(); }
|
|||||||
focus_range: 39..41,
|
focus_range: 39..41,
|
||||||
name: "S1",
|
name: "S1",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S1",
|
description: "struct S1 {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -2717,7 +2728,7 @@ fn main() { let s$0t = foo(); }
|
|||||||
focus_range: 52..54,
|
focus_range: 52..54,
|
||||||
name: "S2",
|
name: "S2",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S2",
|
description: "struct S2 {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2808,7 +2819,7 @@ fn foo(ar$0g: &impl Foo + Bar<S>) {}
|
|||||||
focus_range: 36..37,
|
focus_range: 36..37,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S",
|
description: "struct S {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2908,7 +2919,7 @@ fn foo(ar$0g: &impl Foo<S>) {}
|
|||||||
focus_range: 23..24,
|
focus_range: 23..24,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S",
|
description: "struct S {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -2945,7 +2956,7 @@ fn main() { let s$0t = foo(); }
|
|||||||
focus_range: 49..50,
|
focus_range: 49..50,
|
||||||
name: "B",
|
name: "B",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct B<T>",
|
description: "struct B<T> {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -3034,7 +3045,7 @@ fn foo(ar$0g: &dyn Foo<S>) {}
|
|||||||
focus_range: 23..24,
|
focus_range: 23..24,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S",
|
description: "struct S {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -3082,7 +3093,7 @@ fn foo(a$0rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
|
|||||||
focus_range: 50..51,
|
focus_range: 50..51,
|
||||||
name: "B",
|
name: "B",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct B<T>",
|
description: "struct B<T> {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
HoverGotoTypeData {
|
HoverGotoTypeData {
|
||||||
@ -3108,7 +3119,7 @@ fn foo(a$0rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
|
|||||||
focus_range: 65..66,
|
focus_range: 65..66,
|
||||||
name: "S",
|
name: "S",
|
||||||
kind: Struct,
|
kind: Struct,
|
||||||
description: "struct S",
|
description: "struct S {}",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
@ -3335,7 +3346,7 @@ struct S$0T<const C: usize = 1, T = Foo>(T);
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
struct ST<const C: usize = 1, T = Foo>
|
struct ST<const C: usize = 1, T = Foo>(T);
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -3356,7 +3367,7 @@ struct S$0T<const C: usize = {40 + 2}, T = Foo>(T);
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
struct ST<const C: usize = {const}, T = Foo>
|
struct ST<const C: usize = {const}, T = Foo>(T);
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -3378,7 +3389,7 @@ struct S$0T<const C: usize = VAL, T = Foo>(T);
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
struct ST<const C: usize = VAL, T = Foo>
|
struct ST<const C: usize = VAL, T = Foo>(T);
|
||||||
```
|
```
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
@ -5935,7 +5946,7 @@ pub struct Foo(i32);
|
|||||||
```
|
```
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
pub struct Foo // size = 4, align = 4
|
pub struct Foo(i32); // size = 4, align = 4
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
Loading…
Reference in New Issue
Block a user