mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-29 02:52:11 +00:00
Render layout and other extra informations on hovering Self
This commit is contained in:
parent
32fa60f3a6
commit
ecc1ff8f33
3 changed files with 73 additions and 7 deletions
|
|
@ -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(),
|
||||
¬able_traits,
|
||||
macro_arm,
|
||||
hovered_definition,
|
||||
render_extras,
|
||||
subst_types.as_ref(),
|
||||
config,
|
||||
edition,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue