Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/lib.rs')
| -rw-r--r-- | crates/hir/src/lib.rs | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 64f9745276..b1583c9d00 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -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, + )) } } |