tag, it is formatted using
+// a div to produce a newline after it.
+fn render_attributes_in_code(w: &mut Buffer, it: &clean::Item) {
+ for a in attributes(it) {
+ write!(w, "{}
", a);
}
}
diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs
index e13eab3c53db7..9fd2bd12ab028 100644
--- a/src/librustdoc/html/render/print_item.rs
+++ b/src/librustdoc/html/render/print_item.rs
@@ -11,8 +11,8 @@ use rustc_span::symbol::{kw, sym, Symbol};
use super::{
collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, render_assoc_item,
- render_assoc_items, render_attributes, render_impl, render_stability_since_raw, spotlight_decl,
- write_srclink, AssocItemLink, Context,
+ render_assoc_items, render_attributes_in_code, render_attributes_in_pre, render_impl,
+ render_stability_since_raw, spotlight_decl, write_srclink, AssocItemLink, Context,
};
use crate::clean::{self, GetDefId};
use crate::formats::cache::Cache;
@@ -137,11 +137,15 @@ fn should_hide_fields(n_fields: usize) -> bool {
}
fn toggle_open(w: &mut Buffer, text: &str) {
- write!(w, "", text);
+ write!(
+ w,
+ "Show {}
",
+ text
+ );
}
fn toggle_close(w: &mut Buffer) {
- w.write_str("
");
+ w.write_str("");
}
fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) {
@@ -390,7 +394,7 @@ fn item_function(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, f: &clean::
)
.len();
w.write_str("");
- render_attributes(w, it, false);
+ render_attributes_in_pre(w, it, "");
write!(
w,
"{vis}{constness}{asyncness}{unsafety}{abi}fn \
@@ -421,7 +425,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
// Output the trait definition
wrap_into_docblock(w, |w| {
w.write_str("");
- render_attributes(w, it, true);
+ render_attributes_in_pre(w, it, "");
write!(
w,
"{}{}{}trait {}{}{}",
@@ -731,7 +735,7 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra
fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::TraitAlias) {
w.write_str("");
- render_attributes(w, it, false);
+ render_attributes_in_pre(w, it, "");
write!(
w,
"trait {}{}{} = {};
",
@@ -752,7 +756,7 @@ fn item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clea
fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::OpaqueTy) {
w.write_str("");
- render_attributes(w, it, false);
+ render_attributes_in_pre(w, it, "");
write!(
w,
"type {}{}{where_clause} = impl {bounds};
",
@@ -774,7 +778,7 @@ fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean:
fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Typedef) {
w.write_str("");
- render_attributes(w, it, false);
+ render_attributes_in_pre(w, it, "");
write!(
w,
"type {}{}{where_clause} = {type_};
",
@@ -797,7 +801,7 @@ fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::T
fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Union) {
wrap_into_docblock(w, |w| {
w.write_str("");
- render_attributes(w, it, true);
+ render_attributes_in_pre(w, it, "");
render_union(w, it, Some(&s.generics), &s.fields, "", true, cx);
w.write_str("
")
});
@@ -843,7 +847,7 @@ fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Uni
fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum) {
wrap_into_docblock(w, |w| {
w.write_str("");
- render_attributes(w, it, true);
+ render_attributes_in_pre(w, it, "");
write!(
w,
"{}enum {}{}{}",
@@ -1023,7 +1027,7 @@ fn item_primitive(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::Constant) {
w.write_str("");
- render_attributes(w, it, false);
+ render_attributes_in_code(w, it);
write!(
w,
@@ -1059,7 +1063,7 @@ fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::
fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Struct) {
wrap_into_docblock(w, |w| {
w.write_str("");
- render_attributes(w, it, true);
+ render_attributes_in_code(w, it);
render_struct(w, it, Some(&s.generics), s.struct_type, &s.fields, "", true, cx);
w.write_str("
")
});
@@ -1108,7 +1112,7 @@ fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Static) {
w.write_str("");
- render_attributes(w, it, false);
+ render_attributes_in_code(w, it);
write!(
w,
"{vis}static {mutability}{name}: {typ}
",
@@ -1122,7 +1126,7 @@ fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::St
fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) {
w.write_str("extern {\n");
- render_attributes(w, it, false);
+ render_attributes_in_code(w, it);
write!(
w,
" {}type {};\n}}
",
@@ -1295,10 +1299,8 @@ fn render_union(
}
write!(w, " {{\n{}", tab);
- let count_fields = fields
- .iter()
- .filter(|f| matches!(clean::StructFieldItem(..), *f.kind))
- .count();
+ let count_fields =
+ fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
let toggle = should_hide_fields(count_fields);
if toggle {
toggle_open(w, "fields");
@@ -1356,10 +1358,8 @@ fn render_struct(
)
}
w.write_str(" {");
- let count_fields = fields
- .iter()
- .filter(|f| matches!(clean::StructFieldItem(..) = *f.kind))
- .count();
+ let count_fields =
+ fields.iter().filter(|f| matches!(*f.kind, clean::StructFieldItem(..))).count();
let has_visible_fields = count_fields > 0;
let toggle = should_hide_fields(count_fields);
if toggle {
diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 169b47d4f300a..8606bd0c3a8fd 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -1,4 +1,3 @@
-// ignore-tidy-filelength
// Local js definitions:
/* global addClass, getSettingValue, hasClass */
/* global onEach, onEachLazy, hasOwnProperty, removeClass, updateLocalStorage */
@@ -2252,6 +2251,9 @@ function defocusSearchBar() {
if (hasClass(innerToggle, "will-expand")) {
updateLocalStorage("rustdoc-collapse", "false");
removeClass(innerToggle, "will-expand");
+ onEachLazy(document.getElementsByTagName("details"), function(e) {
+ e.open = true;
+ });
onEveryMatchingChild(innerToggle, "inner", function(e) {
e.innerHTML = labelForToggleButton(false);
});
@@ -2264,6 +2266,9 @@ function defocusSearchBar() {
} else {
updateLocalStorage("rustdoc-collapse", "true");
addClass(innerToggle, "will-expand");
+ onEachLazy(document.getElementsByTagName("details"), function(e) {
+ e.open = false;
+ });
onEveryMatchingChild(innerToggle, "inner", function(e) {
var parent = e.parentNode;
var superParent = null;
@@ -2505,6 +2510,7 @@ function defocusSearchBar() {
var toggle = createSimpleToggle(false);
var hideMethodDocs = getSettingValue("auto-hide-method-docs") === "true";
var hideImplementors = getSettingValue("auto-collapse-implementors") !== "false";
+ let hideLargeItemContents = getSettingValue("auto-hide-large-items") !== "false";
var func = function(e) {
var next = e.nextElementSibling;
@@ -2551,6 +2557,14 @@ function defocusSearchBar() {
onEachLazy(document.getElementsByClassName("associatedconstant"), func);
onEachLazy(document.getElementsByClassName("impl"), funcImpl);
var impl_call = function() {};
+ // Large items are hidden by default in the HTML. If the setting overrides that, show 'em.
+ if (!hideLargeItemContents) {
+ onEachLazy(document.getElementsByTagName("details"), function (e) {
+ if (hasClass(e, "type-contents-toggle")) {
+ e.open = true;
+ }
+ });
+ }
if (hideMethodDocs === true) {
impl_call = function(e, newToggle) {
if (e.id.match(/^impl(?:-\d+)?$/) === null) {
@@ -2639,14 +2653,6 @@ function defocusSearchBar() {
}
});
}
- } else if (hasClass(e, "type-contents-toggle")) {
- let text = e.getAttribute("data-toggle-text");
- let hideItemContents = getSettingValue("auto-hide-large-items") !== "false";
- let tog = createToggle(toggle, `Show ${text}`, null, "", !hideItemContents);
- e.parentNode.insertBefore(tog, e);
- if (hideItemContents) {
- collapseDocs(e.previousSibling.childNodes[0], "toggle");
- }
}
if (e.parentNode.id === "main") {
var otherMessage = "";
@@ -2680,7 +2686,7 @@ function defocusSearchBar() {
otherMessage,
fontSize,
extraClass,
- false),
+ true),
e);
if (hasClass(e, "non-exhaustive") === true) {
collapseDocs(e.previousSibling.childNodes[0], "toggle");
@@ -2699,38 +2705,6 @@ function defocusSearchBar() {
}
}());
- function createToggleWrapper(tog) {
- var span = document.createElement("span");
- span.className = "toggle-label";
- span.style.display = "none";
- span.innerHTML = " Expand attributes";
- tog.appendChild(span);
-
- var wrapper = document.createElement("div");
- wrapper.className = "toggle-wrapper toggle-attributes";
- wrapper.appendChild(tog);
- return wrapper;
- }
-
- (function() {
- // To avoid checking on "rustdoc-item-attributes" value on every loop...
- var itemAttributesFunc = function() {};
- if (getSettingValue("auto-hide-attributes") !== "false") {
- itemAttributesFunc = function(x) {
- collapseDocs(x.previousSibling.childNodes[0], "toggle");
- };
- }
- var attributesToggle = createToggleWrapper(createSimpleToggle(false));
- onEachLazy(main.getElementsByClassName("attributes"), function(i_e) {
- var attr_tog = attributesToggle.cloneNode(true);
- if (hasClass(i_e, "top-attr") === true) {
- addClass(attr_tog, "top-attr");
- }
- i_e.parentNode.insertBefore(attr_tog, i_e);
- itemAttributesFunc(i_e);
- });
- }());
-
(function() {
// To avoid checking on "rustdoc-line-numbers" value on every loop...
var lineNumbersFunc = function() {};
diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css
index 0c9383449a56f..26ed623f7ade3 100644
--- a/src/librustdoc/html/static/rustdoc.css
+++ b/src/librustdoc/html/static/rustdoc.css
@@ -955,10 +955,6 @@ a.test-arrow:hover{
position: absolute;
left: -23px;
top: 0;
-
- /* The click event for this is defined on the document,
- so bubbling does not work. See https://github.com/rust-lang/rust/issues/83332 */
- z-index: 10;
}
h3 > .collapse-toggle, h4 > .collapse-toggle {
@@ -1043,11 +1039,6 @@ h3 > .collapse-toggle, h4 > .collapse-toggle {
margin-top: 3px;
}
-/* 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;
-}
-
.docblock > .section-header:first-child {
margin-left: 15px;
margin-top: 0;
@@ -1061,22 +1052,6 @@ h3 > .collapse-toggle, h4 > .collapse-toggle {
display: block;
}
-.attributes {
- display: block;
- margin-top: 0px !important;
- margin-right: 0px;
- margin-bottom: 0px !important;
- margin-left: 30px;
-}
-.toggle-attributes.collapsed {
- margin-bottom: 0;
-}
-.impl-items > .toggle-attributes {
- margin-left: 20px;
-}
-.impl-items .attributes {
- font-weight: 500;
-}
:target > code {
opacity: 1;
@@ -1754,16 +1729,56 @@ div.name.expand::before {
top: 2px;
}
-/* This part is to fix the "Expand attributes" part in the type declaration. */
-.type-decl > pre > .toggle-wrapper.toggle-attributes.top-attr {
- margin-left: 0 !important;
+/* The hideme class is used on summary tags that contain a span with
+ placeholder text shown only when the toggle is closed. For instance,
+ "Expand description" or "Show methods". */
+details > summary.hideme {
+ cursor: pointer;
+}
+
+details > summary::-webkit-details-marker {
+ display: none;
+}
+
+details > summary.hideme > span {
+ margin-left: 9px;
+ color: #999;
}
-.type-decl > pre > .docblock.attributes.top-attr {
- margin-left: 1.8em !important;
+
+details > summary::before {
+ content: "[+]";
+ font-weight: 300;
+ font-size: 0.8em;
+ color: #999;
+ letter-spacing: 1px;
+}
+
+details > summary.hideme::before {
+ position: relative;
}
-.type-decl > pre .toggle-attributes {
- margin-left: 2.2em;
+
+details > summary:not(.hideme)::before {
+ float: left;
}
-.type-decl > pre > .docblock.attributes {
- margin-left: 4em;
+
+/* When a "hideme" summary is open and the "Expand description" or "Show
+ methods" text is hidden, we want the [-] toggle that remains to not
+ affect the layout of the items to its right. To do that, we use
+ absolute positioning. Note that we also set position: relative
+ on the parent to make this work properly. */
+details[open] > summary.hideme {
+ position: absolute;
+}
+
+details[open] {
+ position: relative;
+}
+
+details[open] > summary.hideme > span {
+ display: none;
+}
+
+details[open] > summary::before {
+ content: "[−]";
+ display: inline;
}
diff --git a/src/librustdoc/html/static/storage.js b/src/librustdoc/html/static/storage.js
index b8b6fcbaf3adc..222c2a9b85217 100644
--- a/src/librustdoc/html/static/storage.js
+++ b/src/librustdoc/html/static/storage.js
@@ -1,6 +1,5 @@
// From rust:
/* global resourcesSuffix */
-
var darkThemes = ["dark", "ayu"];
var currentTheme = document.getElementById("themeStyle");
var mainTheme = document.getElementById("mainThemeStyle");
diff --git a/src/librustdoc/html/static/themes/ayu.css b/src/librustdoc/html/static/themes/ayu.css
index a66675330bd4b..7374aee71f8f8 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):not(.collapse-toggle),
+.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),
.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 9427d813634fa..88ac3252bb4b2 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):not(.collapse-toggle),
+.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),
.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 441a00e0d7cb0..9bc21102aaae6 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):not(.collapse-toggle),
+.docblock:not(.type-decl) a:not(.srclink):not(.test-arrow),
.docblock-short a:not(.srclink):not(.test-arrow), .item-info a,
#help a {
color: #3873AD;