Render layout and other extra informations on hovering `Self`
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index ea1f673..5cab8ef 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -18,7 +18,11 @@
};
use itertools::{Itertools, multizip};
use span::Edition;
-use syntax::{AstNode, SyntaxKind::*, SyntaxNode, T, ast};
+use syntax::{
+ AstNode,
+ SyntaxKind::{self, *},
+ SyntaxNode, T, ast,
+};
use crate::{
FileId, FilePosition, NavigationTarget, RangeInfo, Runnable, TryToNav,
@@ -274,11 +278,13 @@
}
class => {
- let is_def = matches!(class, IdentClass::NameClass(_));
+ let render_extras = matches!(class, IdentClass::NameClass(_))
+ // Render extra information for `Self` keyword as well
+ || ast::NameRef::cast(node.clone()).is_some_and(|name_ref| name_ref.token_kind() == SyntaxKind::SELF_TYPE_KW);
multizip((
class.definitions(),
iter::repeat(None),
- iter::repeat(is_def),
+ iter::repeat(render_extras),
iter::repeat(node),
))
.collect::<Vec<_>>()
@@ -422,7 +428,7 @@
subst: Option<GenericSubstitution>,
scope_node: &SyntaxNode,
macro_arm: Option<u32>,
- hovered_definition: bool,
+ render_extras: bool,
config: &HoverConfig,
edition: Edition,
display_target: DisplayTarget,
@@ -456,7 +462,7 @@
famous_defs.as_ref(),
¬able_traits,
macro_arm,
- hovered_definition,
+ render_extras,
subst_types.as_ref(),
config,
edition,
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs
index cf2ff1c..a4cb869a 100644
--- a/crates/ide/src/hover/render.rs
+++ b/crates/ide/src/hover/render.rs
@@ -477,7 +477,7 @@
famous_defs: Option<&FamousDefs<'_, '_>>,
notable_traits: &[(Trait, Vec<(Option<Type>, Name)>)],
macro_arm: Option<u32>,
- hovered_definition: bool,
+ render_extras: bool,
subst_types: Option<&Vec<(Symbol, Type)>>,
config: &HoverConfig,
edition: Edition,
@@ -640,6 +640,12 @@
Definition::Local(it) => {
render_memory_layout(config.memory_layout, || it.ty(db).layout(db), |_| None, |_| None)
}
+ Definition::SelfType(it) => render_memory_layout(
+ config.memory_layout,
+ || it.self_ty(db).layout(db),
+ |_| None,
+ |_| None,
+ ),
_ => None,
};
@@ -741,7 +747,7 @@
};
let mut extra = String::new();
- if hovered_definition {
+ if render_extras {
if let Some(notable_traits) =
render_notable_trait(db, notable_traits, edition, display_target)
{
diff --git a/crates/ide/src/hover/tests.rs b/crates/ide/src/hover/tests.rs
index 0266b87..c5f8791 100644
--- a/crates/ide/src/hover/tests.rs
+++ b/crates/ide/src/hover/tests.rs
@@ -2089,6 +2089,10 @@
x: u32,
}
```
+
+ ---
+
+ size = 4, align = 4
"#]],
);
check_hover_fields_limit(
@@ -2109,6 +2113,10 @@
```rust
struct Thing
```
+
+ ---
+
+ size = 4, align = 4
"#]],
);
check(
@@ -2130,6 +2138,10 @@
x: u32,
}
```
+
+ ---
+
+ size = 4, align = 4
"#]],
);
check(
@@ -2151,6 +2163,10 @@
A,
}
```
+
+ ---
+
+ size = 0, align = 1
"#]],
);
check(
@@ -2172,6 +2188,10 @@
A,
}
```
+
+ ---
+
+ size = 0, align = 1
"#]],
);
check(
@@ -2190,6 +2210,10 @@
```rust
usize
```
+
+ ---
+
+ size = 8, align = 8
"#]],
);
check(
@@ -2208,6 +2232,36 @@
```rust
fn() -> usize
```
+
+ ---
+
+ size = 8, align = 8, niches = 1
+ "#]],
+ );
+ check(
+ r#"
+pub struct Foo
+where
+ Self$0:;
+"#,
+ expect![[r#"
+ *Self*
+
+ ```rust
+ ra_test_fixture
+ ```
+
+ ```rust
+ pub struct Foo
+ ```
+
+ ---
+
+ size = 0, align = 1
+
+ ---
+
+ does not contain types with destructors (drop glue); doesn't have a destructor
"#]],
);
}