From 173cbecc66ee1bbb54c039a00c3b75b4cdf7e277 Mon Sep 17 00:00:00 2001 From: Manish Goregaokar Date: Sat, 20 Mar 2021 19:39:29 -0700 Subject: [PATCH] rustdoc: smartly hide associated items of traits if there are too many of them --- src/librustdoc/html/render/print_item.rs | 30 ++++++++++++++++----- src/librustdoc/html/static/rustdoc.css | 6 ++--- src/librustdoc/html/static/themes/ayu.css | 2 +- src/librustdoc/html/static/themes/dark.css | 2 +- src/librustdoc/html/static/themes/light.css | 2 +- 5 files changed, 30 insertions(+), 12 deletions(-) diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index b6e9a8e244a97..8db78e7718dc1 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -443,10 +443,25 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra } else { // FIXME: we should be using a derived_id for the Anchors here w.write_str("{\n"); + let mut toggle = false; + + // If there are too many associated types, hide _everything_ + if should_hide_fields(types.len()) { + toggle = true; + toggle_open(w, "associated items"); + } for t in &types { render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx); w.write_str(";\n"); } + // If there are too many associated constants, hide everything after them + // We also do this if the types + consts is large because otherwise we could + // render a bunch of types and _then_ a bunch of consts just because both were + // _just_ under the limit + if !toggle & should_hide_fields(types.len() + consts.len()) { + toggle = true; + toggle_open(w, "associated constants and methods"); + } if !types.is_empty() && !consts.is_empty() { w.write_str("\n"); } @@ -454,6 +469,10 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx); w.write_str(";\n"); } + if !toggle & should_hide_fields(required.len() + provided.len()) { + toggle = true; + toggle_open(w, "methods"); + } if !consts.is_empty() && !required.is_empty() { w.write_str("\n"); } @@ -484,6 +503,9 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra w.write_str("
"); } } + if toggle { + toggle_close(w); + } w.write_str("}"); } w.write_str("") @@ -1284,9 +1306,7 @@ fn render_union( write!(w, " {{\n{}", tab); let count_fields = fields .iter() - .filter( - |f| if let clean::StructFieldItem(..) = *f.kind { true } else { false }, - ) + .filter(|f| if let clean::StructFieldItem(..) = *f.kind { true } else { false }) .count(); let toggle = should_hide_fields(count_fields); if toggle { @@ -1343,9 +1363,7 @@ fn render_struct( w.write_str(" {"); let count_fields = fields .iter() - .filter( - |f| if let clean::StructFieldItem(..) = *f.kind { true } else { false }, - ) + .filter(|f| if let clean::StructFieldItem(..) = *f.kind { true } else { false }) .count(); let has_visible_fields = count_fields > 0; let toggle = should_hide_fields(count_fields); diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 2cdacbe0b06ab..309e55670b18a 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -1058,8 +1058,8 @@ h3 > .collapse-toggle, h4 > .collapse-toggle { margin-top: 3px; } -/* for enum and struct fields */ -.enum > .toggle-wrapper + .docblock, .struct > .toggle-wrapper + .docblock, .union > .toggle-wrapper + .docblock { +/* for hiding fields/variants/associated items */ +.enum > .toggle-wrapper + .docblock, .struct > .toggle-wrapper + .docblock, .union > .toggle-wrapper + .docblock, .trait > .toggle-wrapper + .docblock { margin-left: 0px; } @@ -1785,7 +1785,7 @@ div.name.expand::before { .type-decl > pre > .docblock.attributes.top-attr { margin-left: 1.8em !important; } -.type-decl > pre > .toggle-attributes { +.type-decl > pre .toggle-attributes { margin-left: 2.2em; } .type-decl > pre > .docblock.attributes { diff --git a/src/librustdoc/html/static/themes/ayu.css b/src/librustdoc/html/static/themes/ayu.css index b24f4035ca868..0404fa50b99f2 100644 --- a/src/librustdoc/html/static/themes/ayu.css +++ b/src/librustdoc/html/static/themes/ayu.css @@ -218,7 +218,7 @@ a { color: #c5c5c5; } -.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow), +.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow):not(.collapse-toggle), .docblock-short a:not(.srclink):not(.test-arrow), .item-info a, #help a { color: #39AFD7; diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css index e863ed03f5156..15b485a966fda 100644 --- a/src/librustdoc/html/static/themes/dark.css +++ b/src/librustdoc/html/static/themes/dark.css @@ -176,7 +176,7 @@ a { color: #ddd; } -.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow), +.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow):not(.collapse-toggle), .docblock-short a:not(.srclink):not(.test-arrow), .item-info a, #help a { color: #D2991D; diff --git a/src/librustdoc/html/static/themes/light.css b/src/librustdoc/html/static/themes/light.css index 9335dd96d299a..4c83879e234b7 100644 --- a/src/librustdoc/html/static/themes/light.css +++ b/src/librustdoc/html/static/themes/light.css @@ -174,7 +174,7 @@ a { color: #000; } -.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow), +.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow):not(.collapse-toggle), .docblock-short a:not(.srclink):not(.test-arrow), .item-info a, #help a { color: #3873AD;