Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 3514f2f

Browse files
committed
Render niches on hover
1 parent bc82952 commit 3514f2f

File tree

3 files changed

+33
-13
lines changed

3 files changed

+33
-13
lines changed

crates/hir/src/lib.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use hir_ty::{
6262
consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
6363
diagnostics::BodyValidationDiagnostic,
6464
display::HexifiedConst,
65-
layout::{Layout, LayoutError, RustcEnumVariantIdx, TagEncoding},
65+
layout::{LayoutError, RustcEnumVariantIdx, TagEncoding},
6666
method_resolution::{self, TyFingerprint},
6767
mir::{self, interpret_mir},
6868
primitive::UintTy,
@@ -133,8 +133,11 @@ pub use {
133133
},
134134
hir_ty::{
135135
display::{ClosureStyle, HirDisplay, HirDisplayError, HirWrite},
136+
// FIXME: This just needs a HIR wrapper
137+
layout::Layout,
136138
mir::MirEvalError,
137-
PointerCast, Safety,
139+
PointerCast,
140+
Safety,
138141
},
139142
};
140143

@@ -4506,6 +4509,12 @@ impl HasCrate for Union {
45064509
}
45074510
}
45084511

4512+
impl HasCrate for Enum {
4513+
fn krate(&self, db: &dyn HirDatabase) -> Crate {
4514+
self.module(db).krate()
4515+
}
4516+
}
4517+
45094518
impl HasCrate for Field {
45104519
fn krate(&self, db: &dyn HirDatabase) -> Crate {
45114520
self.parent_def(db).module(db).krate()

crates/ide/src/hover/render.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use std::fmt::Display;
33

44
use either::Either;
55
use hir::{
6-
Adt, AsAssocItem, AttributeTemplate, CaptureKind, HasAttrs, HasSource, HirDisplay, Semantics,
7-
TypeInfo,
6+
db::HirDatabase, Adt, AsAssocItem, AttributeTemplate, CaptureKind, HasAttrs, HasCrate,
7+
HasSource, HirDisplay, Layout, Semantics, TypeInfo,
88
};
99
use ide_db::{
1010
base_db::SourceDatabase,
@@ -404,8 +404,9 @@ pub(super) fn definition(
404404
.map(|layout| format!(", offset = {:#X}", layout.fields.offset(id).bytes())),
405405
_ => None,
406406
};
407+
let niches = niches(db, it, &layout).unwrap_or_default();
407408
Some(format!(
408-
"size = {:#X}, align = {:#X}{}",
409+
"size = {:#X}, align = {:#X}{}{niches}",
409410
layout.size.bytes(),
410411
layout.align.abi.bytes(),
411412
offset.as_deref().unwrap_or_default()
@@ -415,8 +416,9 @@ pub(super) fn definition(
415416
Definition::Function(it) => label_and_docs(db, it),
416417
Definition::Adt(it) => label_and_layout_info_and_docs(db, it, config, |&it| {
417418
let layout = it.layout(db).ok()?;
419+
let niches = niches(db, it, &layout).unwrap_or_default();
418420
Some(format!(
419-
"size = {:#X}, align = {:#X}",
421+
"size = {:#X}, align = {:#X}{niches}",
420422
layout.size.bytes(),
421423
layout.align.abi.bytes()
422424
))
@@ -437,14 +439,15 @@ pub(super) fn definition(
437439
None
438440
}
439441
},
440-
|it| {
442+
|&it| {
441443
let (layout, tag_size) = it.layout(db).ok()?;
442444
let size = layout.size.bytes_usize() - tag_size;
443445
if size == 0 {
444446
// There is no value in showing layout info for fieldless variants
445447
return None;
446448
}
447-
Some(format!("size = {:#X}", layout.size.bytes()))
449+
let niches = niches(db, it, &layout).unwrap_or_default();
450+
Some(format!("size = {:#X}{niches}", layout.size.bytes()))
448451
},
449452
),
450453
Definition::Const(it) => label_value_and_docs(db, it, |it| {
@@ -473,10 +476,11 @@ pub(super) fn definition(
473476
Definition::TraitAlias(it) => label_and_docs(db, it),
474477
Definition::TypeAlias(it) => label_and_layout_info_and_docs(db, it, config, |&it| {
475478
let layout = it.ty(db).layout(db).ok()?;
479+
let niches = niches(db, it, &layout).unwrap_or_default();
476480
Some(format!(
477-
"size = {:#X}, align = {:#X}",
481+
"size = {:#X}, align = {:#X}{niches}",
478482
layout.size.bytes(),
479-
layout.align.abi.bytes()
483+
layout.align.abi.bytes(),
480484
))
481485
}),
482486
Definition::BuiltinType(it) => {
@@ -513,6 +517,13 @@ pub(super) fn definition(
513517
markup(docs, label, mod_path)
514518
}
515519

520+
fn niches(db: &RootDatabase, it: impl HasCrate, layout: &Layout) -> Option<String> {
521+
Some(format!(
522+
", niches = {}",
523+
layout.largest_niche?.available(&*db.target_data_layout(it.krate(db).into())?)
524+
))
525+
}
526+
516527
fn type_info(
517528
sema: &Semantics<'_, RootDatabase>,
518529
config: &HoverConfig,

crates/ide/src/hover/tests.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1528,7 +1528,7 @@ fn test_hover_function_pointer_show_identifiers() {
15281528
```
15291529
15301530
```rust
1531-
type foo = fn(a: i32, b: i32) -> i32 // size = 0x8, align = 0x8
1531+
type foo = fn(a: i32, b: i32) -> i32 // size = 0x8, align = 0x8, niches = 1
15321532
```
15331533
"#]],
15341534
);
@@ -1546,7 +1546,7 @@ fn test_hover_function_pointer_no_identifier() {
15461546
```
15471547
15481548
```rust
1549-
type foo = fn(i32, i32) -> i32 // size = 0x8, align = 0x8
1549+
type foo = fn(i32, i32) -> i32 // size = 0x8, align = 0x8, niches = 1
15501550
```
15511551
"#]],
15521552
);
@@ -1904,7 +1904,7 @@ fn test_hover_layout_of_enum() {
19041904
```
19051905
19061906
```rust
1907-
enum Foo // size = 0x10, align = 0x8
1907+
enum Foo // size = 0x10, align = 0x8, niches = 254
19081908
```
19091909
"#]],
19101910
);

0 commit comments

Comments
 (0)