diff --git a/src/librustdoc/html/static/main.js b/src/librustdoc/html/static/main.js
index 0f9e7001c159b..a77161bf1a991 100644
--- a/src/librustdoc/html/static/main.js
+++ b/src/librustdoc/html/static/main.js
@@ -296,9 +296,9 @@
document.onkeydown = handleShortcut;
document.onclick = function(ev) {
if (hasClass(ev.target, 'collapse-toggle')) {
- collapseDocs(ev.target);
+ collapseDocs(ev.target, "toggle");
} else if (hasClass(ev.target.parentNode, 'collapse-toggle')) {
- collapseDocs(ev.target.parentNode);
+ collapseDocs(ev.target.parentNode, "toggle");
} else if (ev.target.tagName === 'SPAN' && hasClass(ev.target.parentNode, 'line-numbers')) {
var prev_id = 0;
@@ -1618,19 +1618,8 @@
e.innerHTML = labelForToggleButton(false);
});
toggle.title = "collapse all docs";
- onEach(document.getElementsByClassName("docblock"), function(e) {
- e.style.display = 'block';
- });
- onEach(document.getElementsByClassName("toggle-label"), function(e) {
- e.style.display = 'none';
- });
- onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
- removeClass(e, "collapsed");
- });
onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
- onEveryMatchingChild(e, "inner", function(i_e) {
- i_e.innerHTML = labelForToggleButton(false);
- });
+ collapseDocs(e, "show");
});
} else {
addClass(toggle, "will-expand");
@@ -1638,54 +1627,115 @@
e.innerHTML = labelForToggleButton(true);
});
toggle.title = "expand all docs";
- onEach(document.getElementsByClassName("docblock"), function(e) {
- e.style.display = 'none';
- });
- onEach(document.getElementsByClassName("toggle-label"), function(e) {
- e.style.display = 'inline-block';
- });
- onEach(document.getElementsByClassName("toggle-wrapper"), function(e) {
- addClass(e, "collapsed");
- });
+
onEach(document.getElementsByClassName("collapse-toggle"), function(e) {
- onEveryMatchingChild(e, "inner", function(i_e) {
- i_e.innerHTML = labelForToggleButton(true);
- });
+ collapseDocs(e, "hide");
});
}
}
- function collapseDocs(toggle) {
+ function collapseDocs(toggle, mode) {
if (!toggle || !toggle.parentNode) {
return;
}
- var relatedDoc = toggle.parentNode.nextElementSibling;
- if (hasClass(relatedDoc, "stability")) {
- relatedDoc = relatedDoc.nextElementSibling;
- }
- if (hasClass(relatedDoc, "docblock")) {
- if (!isHidden(relatedDoc)) {
- relatedDoc.style.display = 'none';
- onEach(toggle.childNodes, function(e) {
- if (hasClass(e, 'toggle-label')) {
+
+ function adjustToggle(arg) {
+ return function(e) {
+ if (hasClass(e, 'toggle-label')) {
+ if (arg) {
e.style.display = 'inline-block';
- }
- if (hasClass(e, 'inner')) {
- e.innerHTML = labelForToggleButton(true);
- }
- });
- addClass(toggle.parentNode, 'collapsed');
- } else {
- relatedDoc.style.display = 'block';
- removeClass(toggle.parentNode, 'collapsed');
- onEach(toggle.childNodes, function(e) {
- if (hasClass(e, 'toggle-label')) {
+ } else {
e.style.display = 'none';
}
- if (hasClass(e, 'inner')) {
- e.innerHTML = labelForToggleButton(false);
+ }
+ if (hasClass(e, 'inner')) {
+ e.innerHTML = labelForToggleButton(arg);
+ }
+ };
+ };
+
+ if (!hasClass(toggle.parentNode, "impl")) {
+ var relatedDoc = toggle.parentNode.nextElementSibling;
+ if (hasClass(relatedDoc, "stability")) {
+ relatedDoc = relatedDoc.nextElementSibling;
+ }
+ if (hasClass(relatedDoc, "docblock")) {
+ var action = mode;
+ if (action == "toggle") {
+ if(hasClass(relatedDoc, "hidden-by-usual-hider")) {
+ action="show";
+ } else {
+ action="hide";
+ }
+ }
+ if (action == "hide") {
+ addClass(relatedDoc, "hidden-by-usual-hider");
+ onEach(toggle.childNodes, adjustToggle(true));
+ addClass(toggle.parentNode, 'collapsed');
+ } else if (action == "show") {
+ removeClass(relatedDoc, "hidden-by-usual-hider");
+ removeClass(toggle.parentNode, 'collapsed');
+ onEach(toggle.childNodes, adjustToggle(false));
+ }
+ }
+ } else {
+ // we are collapsing the impl block
+ function implHider(addOrRemove) {
+ return function(n) {
+ if(hasClass(n, "method")) {
+ if (addOrRemove) {
+ addClass(n, "hidden-by-impl-hider");
+ } else {
+ removeClass(n, "hidden-by-impl-hider");
+ }
+ var ns = n.nextElementSibling;
+ while(true) {
+ if (ns && (
+ hasClass(ns, "docblock") ||
+ hasClass(ns, "stability") ||
+ false
+ )) {
+ if (addOrRemove) {
+ addClass(ns, "hidden-by-impl-hider");
+ } else {
+ removeClass(ns, "hidden-by-impl-hider");
+ }
+ ns = ns.nextElementSibling;
+ continue;
+ }
+ break;
+ }
}
- });
+ }
+ }
+
+ var relatedDoc = toggle.parentNode;
+
+ while (!hasClass(relatedDoc, "impl-items")) {
+ relatedDoc = relatedDoc.nextElementSibling;
+ }
+
+ if (!relatedDoc) return;
+
+ // Hide all functions, but not associated types/consts
+
+ var action = mode;
+ if (action == "toggle") {
+ if(hasClass(relatedDoc, "fns-now-collapsed")) {
+ action="show";
+ } else {
+ action="hide";
+ }
+ }
+
+ if(action == "show") {
+ removeClass(relatedDoc, "fns-now-collapsed");
+ onEach(toggle.childNodes, adjustToggle(false));
+ onEach(relatedDoc.childNodes, implHider(false));
+ } else if (action == "hide") {
+ addClass(relatedDoc, "fns-now-collapsed");
+ onEach(toggle.childNodes, adjustToggle(true));
+ onEach(relatedDoc.childNodes, implHider(true));
}
}
}
@@ -1714,8 +1764,12 @@
hasClass(next.nextElementSibling, 'docblock'))) {
insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
}
+ if (hasClass(e, 'impl')) {
+ insertAfter(toggle.cloneNode(true), e.childNodes[e.childNodes.length - 1]);
+ }
}
onEach(document.getElementsByClassName('method'), func);
+ onEach(document.getElementsByClassName('impl'), func);
onEach(document.getElementsByClassName('impl-items'), function(e) {
onEach(e.getElementsByClassName('associatedconstant'), func);
});
@@ -1803,7 +1857,7 @@
onEach(document.getElementById('main').getElementsByTagName('pre'), function(e) {
onEach(e.getElementsByClassName('attributes'), function(i_e) {
i_e.parentNode.insertBefore(createToggleWrapper(), i_e);
- collapseDocs(i_e.previousSibling.childNodes[0]);
+ collapseDocs(i_e.previousSibling.childNodes[0], "toggle");
});
});
diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css
index 4c6bcab72b7c9..d8cb9681d04b4 100644
--- a/src/librustdoc/html/static/themes/dark.css
+++ b/src/librustdoc/html/static/themes/dark.css
@@ -386,3 +386,8 @@ kbd {
background: #353535;
}
}
+
+.hidden-by-impl-hider,
+.hidden-by-usual-hider {
+ display: none;
+}
diff --git a/src/librustdoc/html/static/themes/main.css b/src/librustdoc/html/static/themes/main.css
index e0764640e9165..8713f83ecb93b 100644
--- a/src/librustdoc/html/static/themes/main.css
+++ b/src/librustdoc/html/static/themes/main.css
@@ -383,3 +383,8 @@ kbd {
background: #fff;
}
}
+
+.hidden-by-impl-hider,
+.hidden-by-usual-hider {
+ display: none;
+}