diff options
| author | Camelid <camelidcamel@gmail.com> | 2021-03-21 19:21:45 -0700 |
|---|---|---|
| committer | Camelid <camelidcamel@gmail.com> | 2021-05-11 09:55:31 -0700 |
| commit | 001f0dd5a1a544ac9373f0d18e13014ec18dff94 (patch) | |
| tree | c2ee9c403d1a3c505ccd4f72fb3daee4edcf35f6 | |
| parent | 2bafe96272bf22cd191c6a01741184b60063292d (diff) | |
| download | rust-001f0dd5a1a544ac9373f0d18e13014ec18dff94.tar.gz rust-001f0dd5a1a544ac9373f0d18e13014ec18dff94.zip | |
rustdoc: Show basic type layout information
Right now it just shows the size.
| -rw-r--r-- | src/librustdoc/html/render/print_item.rs | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index 7ccc313cc59..9b7006150b7 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -846,6 +846,7 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni }); document(w, cx, it, None); + let mut fields = s .fields .iter() @@ -880,7 +881,9 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni document(w, cx, field, Some(it)); } } - render_assoc_items(w, cx, it, it.def_id.expect_real(), AssocItemRender::All) + let def_id = it.def_id.expect_real(); + render_assoc_items(w, cx, it, def_id, AssocItemRender::All); + document_ty_layout(w, cx, def_id); } fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum) { @@ -940,6 +943,7 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum }); document(w, cx, it, None); + if !e.variants.is_empty() { write!( w, @@ -1014,7 +1018,9 @@ fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum render_stability_since(w, variant, it, cx.tcx()); } } - render_assoc_items(w, cx, it, it.def_id.expect_real(), AssocItemRender::All) + let def_id = it.def_id.expect_real(); + render_assoc_items(w, cx, it, def_id, AssocItemRender::All); + document_ty_layout(w, cx, def_id); } fn item_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Macro) { @@ -1114,6 +1120,7 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St }); document(w, cx, it, None); + let mut fields = s .fields .iter() @@ -1152,7 +1159,9 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St } } } - render_assoc_items(w, cx, it, it.def_id.expect_real(), AssocItemRender::All) + let def_id = it.def_id.expect_real(); + render_assoc_items(w, cx, it, def_id, AssocItemRender::All); + document_ty_layout(w, cx, def_id); } fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Static) { @@ -1522,3 +1531,27 @@ fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) { w.write_str("</div></details>"); } } + +fn document_ty_layout(w: &mut Buffer, cx: &Context<'_>, ty_def_id: DefId) { + let param_env = cx.tcx().param_env(ty_def_id); + let ty = cx.tcx().type_of(ty_def_id); + match cx.tcx().layout_of(param_env.and(ty)) { + Ok(ty_layout) => { + writeln!(w, r#"<h2 class="small-section-header">Layout</h2>"#); + writeln!(w, "<div>"); + if ty_layout.layout.abi.is_unsized() { + writeln!(w, "<strong>Sized:</strong> (unsized)"); + } else { + writeln!( + w, + "<strong>Size:</strong> {size} byte{pl}", + size = ty_layout.layout.size.bytes(), + pl = if ty_layout.layout.size.bytes() == 1 { "" } else { "s" }, + ); + } + writeln!(w, "</div>"); + } + // FIXME: should we crash instead? or report an error? + Err(_layout_err) => {} + } +} |
