mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 12:54:58 +00:00
Render size, align and offset hover values in hex
This commit is contained in:
parent
eee6872647
commit
be9cc0baae
6 changed files with 165 additions and 110 deletions
|
@ -1125,6 +1125,25 @@ impl Enum {
|
|||
pub fn is_data_carrying(self, db: &dyn HirDatabase) -> bool {
|
||||
self.variants(db).iter().any(|v| !matches!(v.kind(db), StructKind::Unit))
|
||||
}
|
||||
|
||||
pub fn layout(self, db: &dyn HirDatabase) -> Result<(Layout, usize), LayoutError> {
|
||||
let layout = Adt::from(self).layout(db)?;
|
||||
let tag_size =
|
||||
if let layout::Variants::Multiple { tag, tag_encoding, .. } = &layout.variants {
|
||||
match tag_encoding {
|
||||
TagEncoding::Direct => {
|
||||
let target_data_layout = db
|
||||
.target_data_layout(self.module(db).krate().id)
|
||||
.ok_or(LayoutError::TargetLayoutNotAvailable)?;
|
||||
tag.size(&*target_data_layout).bytes_usize()
|
||||
}
|
||||
TagEncoding::Niche { .. } => 0,
|
||||
}
|
||||
} else {
|
||||
0
|
||||
};
|
||||
Ok((layout, tag_size))
|
||||
}
|
||||
}
|
||||
|
||||
impl HasVisibility for Enum {
|
||||
|
@ -1185,23 +1204,16 @@ impl Variant {
|
|||
/// Return layout of the variant and tag size of the parent enum.
|
||||
pub fn layout(&self, db: &dyn HirDatabase) -> Result<(Layout, usize), LayoutError> {
|
||||
let parent_enum = self.parent_enum(db);
|
||||
let parent_layout = Adt::from(parent_enum).layout(db)?;
|
||||
if let layout::Variants::Multiple { variants, tag, tag_encoding, tag_field: _ } =
|
||||
parent_layout.variants
|
||||
{
|
||||
let tag_size = match tag_encoding {
|
||||
TagEncoding::Direct => {
|
||||
let target_data_layout = db
|
||||
.target_data_layout(parent_enum.module(db).krate().id)
|
||||
.ok_or(LayoutError::TargetLayoutNotAvailable)?;
|
||||
tag.size(&*target_data_layout).bytes_usize()
|
||||
let (parent_layout, tag_size) = parent_enum.layout(db)?;
|
||||
Ok((
|
||||
match parent_layout.variants {
|
||||
layout::Variants::Multiple { variants, .. } => {
|
||||
variants[RustcEnumVariantIdx(self.id)].clone()
|
||||
}
|
||||
TagEncoding::Niche { .. } => 0,
|
||||
};
|
||||
Ok((variants[RustcEnumVariantIdx(self.id)].clone(), tag_size))
|
||||
} else {
|
||||
Ok((parent_layout, 0))
|
||||
}
|
||||
_ => parent_layout,
|
||||
},
|
||||
tag_size,
|
||||
))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue