Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/hover/render.rs')
| -rw-r--r-- | crates/ide/src/hover/render.rs | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/crates/ide/src/hover/render.rs b/crates/ide/src/hover/render.rs index 4cbe7cca5a..d4c310447f 100644 --- a/crates/ide/src/hover/render.rs +++ b/crates/ide/src/hover/render.rs @@ -3,8 +3,8 @@ use std::fmt::Display; use either::Either; use hir::{ - Adt, AsAssocItem, AttributeTemplate, CaptureKind, HasAttrs, HasSource, HirDisplay, Semantics, - TypeInfo, + db::HirDatabase, Adt, AsAssocItem, AttributeTemplate, CaptureKind, HasAttrs, HasCrate, + HasSource, HirDisplay, Layout, Semantics, TypeInfo, }; use ide_db::{ base_db::SourceDatabase, @@ -404,8 +404,9 @@ pub(super) fn definition( .map(|layout| format!(", offset = {:#X}", layout.fields.offset(id).bytes())), _ => None, }; + let niches = niches(db, it, &layout).unwrap_or_default(); Some(format!( - "size = {:#X}, align = {:#X}{}", + "size = {:#X}, align = {:#X}{}{niches}", layout.size.bytes(), layout.align.abi.bytes(), offset.as_deref().unwrap_or_default() @@ -415,8 +416,9 @@ pub(super) fn definition( Definition::Function(it) => label_and_docs(db, it), Definition::Adt(it) => label_and_layout_info_and_docs(db, it, config, |&it| { let layout = it.layout(db).ok()?; + let niches = niches(db, it, &layout).unwrap_or_default(); Some(format!( - "size = {:#X}, align = {:#X}", + "size = {:#X}, align = {:#X}{niches}", layout.size.bytes(), layout.align.abi.bytes() )) @@ -437,14 +439,15 @@ pub(super) fn definition( None } }, - |it| { + |&it| { let (layout, tag_size) = it.layout(db).ok()?; let size = layout.size.bytes_usize() - tag_size; if size == 0 { // There is no value in showing layout info for fieldless variants return None; } - Some(format!("size = {:#X}", layout.size.bytes())) + let niches = niches(db, it, &layout).unwrap_or_default(); + Some(format!("size = {:#X}{niches}", layout.size.bytes())) }, ), Definition::Const(it) => label_value_and_docs(db, it, |it| { @@ -473,10 +476,11 @@ pub(super) fn definition( Definition::TraitAlias(it) => label_and_docs(db, it), Definition::TypeAlias(it) => label_and_layout_info_and_docs(db, it, config, |&it| { let layout = it.ty(db).layout(db).ok()?; + let niches = niches(db, it, &layout).unwrap_or_default(); Some(format!( - "size = {:#X}, align = {:#X}", + "size = {:#X}, align = {:#X}{niches}", layout.size.bytes(), - layout.align.abi.bytes() + layout.align.abi.bytes(), )) }), Definition::BuiltinType(it) => { @@ -513,6 +517,13 @@ pub(super) fn definition( markup(docs, label, mod_path) } +fn niches(db: &RootDatabase, it: impl HasCrate, layout: &Layout) -> Option<String> { + Some(format!( + ", niches = {}", + layout.largest_niche?.available(&*db.target_data_layout(it.krate(db).into())?) + )) +} + fn type_info( sema: &Semantics<'_, RootDatabase>, config: &HoverConfig, |