diff options
| author | Jack Huey <31162821+jackh726@users.noreply.github.com> | 2021-09-08 12:24:14 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-08 12:24:14 -0400 |
| commit | 2f2aed1de7d7c7f0dd943635188078f810e1d468 (patch) | |
| tree | c0fcd9d2477776d42f6e9cf329c9ea3d5eb94b57 | |
| parent | c9db3e0fbc84d8409285698486375f080d361ef3 (diff) | |
| parent | c0451f73b2094d7edccb77d7ea8be48f64887e67 (diff) | |
| download | rust-2f2aed1de7d7c7f0dd943635188078f810e1d468.tar.gz rust-2f2aed1de7d7c7f0dd943635188078f810e1d468.zip | |
Rollup merge of #86263 - fee1-dead:rustdoc-layout-variants, r=camelid
Rustdoc: Report Layout of enum variants Followup of #83501, Fixes #86253. cc `@camelid` `@rustbot` label A-rustdoc
| -rw-r--r-- | src/librustdoc/html/render/print_item.rs | 57 | ||||
| -rw-r--r-- | src/test/rustdoc/type-layout.rs | 18 |
2 files changed, 64 insertions, 11 deletions
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 39ef641a3ac..470749ef7b3 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -8,10 +8,12 @@ use rustc_hir as hir; use rustc_hir::def::CtorKind; use rustc_hir::def_id::DefId; use rustc_middle::middle::stability; +use rustc_middle::span_bug; use rustc_middle::ty::layout::LayoutError; -use rustc_middle::ty::TyCtxt; +use rustc_middle::ty::{Adt, TyCtxt}; use rustc_span::hygiene::MacroKind; use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_target::abi::{Layout, Primitive, TagEncoding, Variants}; use super::{ collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, notable_traits_decl, @@ -1621,6 +1623,15 @@ fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) { } fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) { + fn write_size_of_layout(w: &mut Buffer, layout: &Layout, tag_size: u64) { + if layout.abi.is_unsized() { + write!(w, "(unsized)"); + } else { + let bytes = layout.size.bytes() - tag_size; + write!(w, "{size} byte{pl}", size = bytes, pl = if bytes == 1 { "" } else { "s" },); + } + } + if !cx.shared.show_type_layout { return; } @@ -1642,16 +1653,40 @@ fn document_type_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) { <a href=\"https://doc.rust-lang.org/reference/type-layout.html\">“Type Layout”</a> \ chapter for details on type layout guarantees.</p></div>" ); - if ty_layout.layout.abi.is_unsized() { - writeln!(w, "<p><strong>Size:</strong> (unsized)</p>"); - } else { - let bytes = ty_layout.layout.size.bytes(); - writeln!( - w, - "<p><strong>Size:</strong> {size} byte{pl}</p>", - size = bytes, - pl = if bytes == 1 { "" } else { "s" }, - ); + w.write_str("<p><strong>Size:</strong> "); + write_size_of_layout(w, ty_layout.layout, 0); + writeln!(w, "</p>"); + if let Variants::Multiple { variants, tag, tag_encoding, .. } = + &ty_layout.layout.variants + { + if !variants.is_empty() { + w.write_str( + "<p><strong>Size for each variant:</strong></p>\ + <ul>", + ); + + let adt = if let Adt(adt, _) = ty_layout.ty.kind() { + adt + } else { + span_bug!(tcx.def_span(ty_def_id), "not an adt") + }; + + let tag_size = if let TagEncoding::Niche { .. } = tag_encoding { + 0 + } else if let Primitive::Int(i, _) = tag.value { + i.size().bytes() + } else { + span_bug!(tcx.def_span(ty_def_id), "tag is neither niche nor int") + }; + + for (index, layout) in variants.iter_enumerated() { + let ident = adt.variants[index].ident; + write!(w, "<li><code>{name}</code>: ", name = ident); + write_size_of_layout(w, layout, tag_size); + writeln!(w, "</li>"); + } + w.write_str("</ul>"); + } } } // This kind of layout error can occur with valid code, e.g. if you try to diff --git a/src/test/rustdoc/type-layout.rs b/src/test/rustdoc/type-layout.rs index 272911de681..0868486fa59 100644 --- a/src/test/rustdoc/type-layout.rs +++ b/src/test/rustdoc/type-layout.rs @@ -52,3 +52,21 @@ pub struct Unsized([u8]); // @!has type_layout/trait.MyTrait.html 'Size: ' pub trait MyTrait {} + +// @has type_layout/enum.Variants.html 'Size: ' +// @has - '2 bytes' +// @has - '<code>A</code>: 0 bytes' +// @has - '<code>B</code>: 1 byte' +pub enum Variants { + A, + B(u8), +} + +// @has type_layout/enum.WithNiche.html 'Size: ' +// @has - //p '4 bytes' +// @has - '<code>None</code>: 0 bytes' +// @has - '<code>Some</code>: 4 bytes' +pub enum WithNiche { + None, + Some(std::num::NonZeroU32), +} |
