Render layout and other extra informations on hovering Self

This commit is contained in:
Shoyu Vanilla 2025-03-22 23:50:20 +09:00
parent 32fa60f3a6
commit ecc1ff8f33
3 changed files with 73 additions and 7 deletions

View file

@ -18,7 +18,11 @@ use ide_db::{
};
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 @@ fn hover_offset(
}
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 @@ pub(crate) fn hover_for_definition(
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 @@ pub(crate) fn hover_for_definition(
famous_defs.as_ref(),
&notable_traits,
macro_arm,
hovered_definition,
render_extras,
subst_types.as_ref(),
config,
edition,

View file

@ -477,7 +477,7 @@ pub(super) fn definition(
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 @@ pub(super) fn definition(
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 @@ pub(super) fn definition(
};
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)
{

View file

@ -2089,6 +2089,10 @@ impl Thing {
x: u32,
}
```
---
size = 4, align = 4
"#]],
);
check_hover_fields_limit(
@ -2109,6 +2113,10 @@ impl Thing {
```rust
struct Thing
```
---
size = 4, align = 4
"#]],
);
check(
@ -2130,6 +2138,10 @@ impl Thing {
x: u32,
}
```
---
size = 4, align = 4
"#]],
);
check(
@ -2151,6 +2163,10 @@ impl Thing {
A,
}
```
---
size = 0, align = 1
"#]],
);
check(
@ -2172,6 +2188,10 @@ impl Thing {
A,
}
```
---
size = 0, align = 1
"#]],
);
check(
@ -2190,6 +2210,10 @@ impl usize {
```rust
usize
```
---
size = 8, align = 8
"#]],
);
check(
@ -2208,6 +2232,36 @@ impl fn() -> usize {
```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
"#]],
);
}