diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index 90592335d5dd..cc9dc0adbca4 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -1,3 +1,6 @@
+/* eslint-env es6 */
+/* eslint no-var: "error" */
+/* eslint prefer-const: "error" */
// Local js definitions:
/* global addClass, getSettingValue, hasClass, searchState */
/* global onEach, onEachLazy, removeClass */
@@ -11,7 +14,7 @@ if (!String.prototype.startsWith) {
}
if (!String.prototype.endsWith) {
String.prototype.endsWith = function(suffix, length) {
- var l = length || this.length;
+ const l = length || this.length;
return this.indexOf(suffix, l - suffix.length) !== -1;
};
}
@@ -40,7 +43,7 @@ if (!DOMTokenList.prototype.remove) {
// Get a value from the rustdoc-vars div, which is used to convey data from
// Rust to the JS. If there is no such element, return null.
function getVar(name) {
- var el = document.getElementById("rustdoc-vars");
+ const el = document.getElementById("rustdoc-vars");
if (el) {
return el.attributes["data-" + name].value;
} else {
@@ -59,7 +62,7 @@ function resourcePath(basename, extension) {
window.currentCrate = getVar("current-crate");
window.searchJS = resourcePath("search", ".js");
window.searchIndexJS = resourcePath("search-index", ".js");
- var sidebarVars = document.getElementById("sidebar-vars");
+ const sidebarVars = document.getElementById("sidebar-vars");
if (sidebarVars) {
window.sidebarCurrent = {
name: sidebarVars.attributes["data-name"].value,
@@ -68,8 +71,8 @@ function resourcePath(basename, extension) {
};
// FIXME: It would be nicer to generate this text content directly in HTML,
// but with the current code it's hard to get the right information in the right place.
- var mobileLocationTitle = document.querySelector(".mobile-topbar h2.location");
- var locationTitle = document.querySelector(".sidebar h2.location");
+ const mobileLocationTitle = document.querySelector(".mobile-topbar h2.location");
+ const locationTitle = document.querySelector(".sidebar h2.location");
if (mobileLocationTitle && locationTitle) {
mobileLocationTitle.innerHTML = locationTitle.innerHTML;
}
@@ -91,16 +94,16 @@ function getVirtualKey(ev) {
return ev.key;
}
- var c = ev.charCode || ev.keyCode;
+ const c = ev.charCode || ev.keyCode;
if (c == 27) {
return "Escape";
}
return String.fromCharCode(c);
}
-var THEME_PICKER_ELEMENT_ID = "theme-picker";
-var THEMES_ELEMENT_ID = "theme-choices";
-var MAIN_ID = "main-content";
+const THEME_PICKER_ELEMENT_ID = "theme-picker";
+const THEMES_ELEMENT_ID = "theme-choices";
+const MAIN_ID = "main-content";
function getThemesElement() {
return document.getElementById(THEMES_ELEMENT_ID);
@@ -116,8 +119,8 @@ function getNakedUrl() {
}
function showThemeButtonState() {
- var themePicker = getThemePickerElement();
- var themeChoices = getThemesElement();
+ const themePicker = getThemePickerElement();
+ const themeChoices = getThemesElement();
themeChoices.style.display = "block";
themePicker.style.borderBottomRightRadius = "0";
@@ -125,8 +128,8 @@ function showThemeButtonState() {
}
function hideThemeButtonState() {
- var themePicker = getThemePickerElement();
- var themeChoices = getThemesElement();
+ const themePicker = getThemePickerElement();
+ const themeChoices = getThemesElement();
themeChoices.style.display = "none";
themePicker.style.borderBottomRightRadius = "3px";
@@ -138,9 +141,9 @@ function hideThemeButtonState() {
if (!document.location.href.startsWith("file:///")) {
return;
}
- var themeChoices = getThemesElement();
- var themePicker = getThemePickerElement();
- var availableThemes = getVar("themes").split(",");
+ const themeChoices = getThemesElement();
+ const themePicker = getThemePickerElement();
+ const availableThemes = getVar("themes").split(",");
removeClass(themeChoices.parentElement, "hidden");
@@ -153,8 +156,8 @@ function hideThemeButtonState() {
}
function handleThemeButtonsBlur(e) {
- var active = document.activeElement;
- var related = e.relatedTarget;
+ const active = document.activeElement;
+ const related = e.relatedTarget;
if (active.id !== THEME_PICKER_ELEMENT_ID &&
(!active.parentNode || active.parentNode.id !== THEMES_ELEMENT_ID) &&
@@ -168,7 +171,7 @@ function hideThemeButtonState() {
themePicker.onclick = switchThemeButtonState;
themePicker.onblur = handleThemeButtonsBlur;
availableThemes.forEach(function(item) {
- var but = document.createElement("button");
+ const but = document.createElement("button");
but.textContent = item;
but.onclick = function() {
switchTheme(window.currentTheme, window.mainTheme, item, true);
@@ -236,10 +239,10 @@ function hideThemeButtonState() {
}
},
getQueryStringParams: function() {
- var params = {};
+ const params = {};
window.location.search.substring(1).split("&").
map(function(s) {
- var pair = s.split("=");
+ const pair = s.split("=");
params[decodeURIComponent(pair[0])] =
typeof pair[1] === "undefined" ? null : decodeURIComponent(pair[1]);
});
@@ -249,17 +252,17 @@ function hideThemeButtonState() {
return window.history && typeof window.history.pushState === "function";
},
setup: function() {
- var search_input = searchState.input;
+ const search_input = searchState.input;
if (!searchState.input) {
return;
}
function loadScript(url) {
- var script = document.createElement('script');
+ const script = document.createElement('script');
script.src = url;
document.head.append(script);
}
- var searchLoaded = false;
+ let searchLoaded = false;
function loadSearch() {
if (!searchLoaded) {
searchLoaded = true;
@@ -278,9 +281,9 @@ function hideThemeButtonState() {
loadSearch();
}
- var params = searchState.getQueryStringParams();
+ const params = searchState.getQueryStringParams();
if (params.search !== undefined) {
- var search = searchState.outputElement();
+ const search = searchState.outputElement();
search.innerHTML = "
" +
searchState.loadingText + "
";
searchState.showResults(search);
@@ -291,7 +294,7 @@ function hideThemeButtonState() {
function getPageId() {
if (window.location.hash) {
- var tmp = window.location.hash.replace(/^#/, "");
+ const tmp = window.location.hash.replace(/^#/, "");
if (tmp.length > 0) {
return tmp;
}
@@ -299,18 +302,18 @@ function hideThemeButtonState() {
return null;
}
- var toggleAllDocsId = "toggle-all-docs";
- var main = document.getElementById(MAIN_ID);
- var savedHash = "";
+ const toggleAllDocsId = "toggle-all-docs";
+ const main = document.getElementById(MAIN_ID);
+ let savedHash = "";
function handleHashes(ev) {
- var elem;
- var search = searchState.outputElement();
+ let elem;
+ const search = searchState.outputElement();
if (ev !== null && search && !hasClass(search, "hidden") && ev.newURL) {
// This block occurs when clicking on an element in the navbar while
// in a search.
searchState.hideResults(search);
- var hash = ev.newURL.slice(ev.newURL.indexOf("#") + 1);
+ const hash = ev.newURL.slice(ev.newURL.indexOf("#") + 1);
if (searchState.browserSupportsHistoryApi()) {
// `window.location.search`` contains all the query parameters, not just `search`.
history.replaceState(null, "",
@@ -333,7 +336,7 @@ function hideThemeButtonState() {
function onHashChange(ev) {
// If we're in mobile mode, we should hide the sidebar in any case.
- var sidebar = document.getElementsByClassName("sidebar")[0];
+ const sidebar = document.getElementsByClassName("sidebar")[0];
removeClass(sidebar, "shown");
handleHashes(ev);
}
@@ -386,8 +389,8 @@ function hideThemeButtonState() {
}
function handleEscape(ev) {
- var help = getHelpElement(false);
- var search = searchState.outputElement();
+ const help = getHelpElement(false);
+ const search = searchState.outputElement();
if (help && !hasClass(help, "hidden")) {
displayHelp(false, ev, help);
} else if (search && !hasClass(search, "hidden")) {
@@ -399,13 +402,15 @@ function hideThemeButtonState() {
hideThemeButtonState();
}
- var disableShortcuts = getSettingValue("disable-shortcuts") === "true";
+ const disableShortcuts = getSettingValue("disable-shortcuts") === "true";
function handleShortcut(ev) {
// Don't interfere with browser shortcuts
if (ev.ctrlKey || ev.altKey || ev.metaKey || disableShortcuts) {
return;
}
+ let themePicker;
+
if (document.activeElement.tagName === "INPUT") {
switch (getVirtualKey(ev)) {
case "Escape":
@@ -439,7 +444,7 @@ function hideThemeButtonState() {
case "T":
displayHelp(false, ev);
ev.preventDefault();
- var themePicker = getThemePickerElement();
+ themePicker = getThemePickerElement();
themePicker.click();
themePicker.focus();
break;
@@ -453,8 +458,8 @@ function hideThemeButtonState() {
}
function handleThemeKeyDown(ev) {
- var active = document.activeElement;
- var themes = getThemesElement();
+ const active = document.activeElement;
+ const themes = getThemesElement();
switch (getVirtualKey(ev)) {
case "ArrowUp":
ev.preventDefault();
@@ -500,23 +505,21 @@ function hideThemeButtonState() {
document.addEventListener("keydown", handleShortcut);
(function() {
- var x = document.getElementsByClassName("version-selector");
+ const x = document.getElementsByClassName("version-selector");
if (x.length > 0) {
x[0].onchange = function() {
- var i, match,
- url = document.location.href,
- stripped = "",
- len = window.rootPath.match(/\.\.\//g).length + 1;
+ let url = document.location.href, stripped = "";
+ const len = window.rootPath.match(/\.\.\//g).length + 1;
- for (i = 0; i < len; ++i) {
- match = url.match(/\/[^/]*$/);
+ for (let i = 0; i < len; ++i) {
+ const match = url.match(/\/[^/]*$/);
if (i < len - 1) {
stripped = match[0] + stripped;
}
url = url.substring(0, url.length - match[0].length);
}
- var selectedVersion = document.getElementsByClassName("version-selector")[0].value;
+ const selectedVersion = document.getElementsByClassName("version-selector")[0].value;
url += "/" + selectedVersion + stripped;
document.location.href = url;
@@ -526,9 +529,9 @@ function hideThemeButtonState() {
// delayed sidebar rendering.
window.initSidebarItems = function(items) {
- var sidebar = document.getElementsByClassName("sidebar-elems")[0];
- var others;
- var current = window.sidebarCurrent;
+ const sidebar = document.getElementsByClassName("sidebar-elems")[0];
+ let others;
+ const current = window.sidebarCurrent;
function addSidebarCrates(crates) {
if (!hasClass(document.body, "crate")) {
@@ -536,23 +539,23 @@ function hideThemeButtonState() {
return;
}
// Draw a convenient sidebar of known crates if we have a listing
- var div = document.createElement("div");
+ const div = document.createElement("div");
div.className = "block crate";
div.innerHTML = "Crates
";
- var ul = document.createElement("ul");
+ const ul = document.createElement("ul");
div.appendChild(ul);
- for (var i = 0; i < crates.length; ++i) {
- var klass = "crate";
- if (window.rootPath !== "./" && crates[i] === window.currentCrate) {
+ for (const crate of crates) {
+ let klass = "crate";
+ if (window.rootPath !== "./" && crate === window.currentCrate) {
klass += " current";
}
- var link = document.createElement("a");
- link.href = window.rootPath + crates[i] + "/index.html";
+ const link = document.createElement("a");
+ link.href = window.rootPath + crate + "/index.html";
link.className = klass;
- link.textContent = crates[i];
+ link.textContent = crate;
- var li = document.createElement("li");
+ const li = document.createElement("li");
li.appendChild(link);
ul.appendChild(li);
}
@@ -568,39 +571,38 @@ function hideThemeButtonState() {
* "Modules", or "Macros".
*/
function block(shortty, id, longty) {
- var filtered = items[shortty];
+ const filtered = items[shortty];
if (!filtered) {
return;
}
- var div = document.createElement("div");
+ const div = document.createElement("div");
div.className = "block " + shortty;
- var h3 = document.createElement("h3");
+ const h3 = document.createElement("h3");
h3.innerHTML = `${longty}`;
div.appendChild(h3);
- var ul = document.createElement("ul");
+ const ul = document.createElement("ul");
- for (var i = 0, len = filtered.length; i < len; ++i) {
- var item = filtered[i];
- var name = item[0];
- var desc = item[1]; // can be null
+ for (const item of filtered) {
+ const name = item[0];
+ const desc = item[1]; // can be null
- var klass = shortty;
+ let klass = shortty;
if (name === current.name && shortty === current.ty) {
klass += " current";
}
- var path;
+ let path;
if (shortty === "mod") {
path = name + "/index.html";
} else {
path = shortty + "." + name + ".html";
}
- var link = document.createElement("a");
+ const link = document.createElement("a");
link.href = current.relpath + path;
link.title = desc;
link.className = klass;
link.textContent = name;
- var li = document.createElement("li");
+ const li = document.createElement("li");
li.appendChild(link);
ul.appendChild(li);
}
@@ -613,7 +615,7 @@ function hideThemeButtonState() {
others.className = "others";
sidebar.appendChild(others);
- var isModule = hasClass(document.body, "mod");
+ const isModule = hasClass(document.body, "mod");
if (!isModule) {
block("primitive", "primitives", "Primitive Types");
block("mod", "modules", "Modules");
@@ -638,8 +640,9 @@ function hideThemeButtonState() {
};
window.register_implementors = function(imp) {
- var implementors = document.getElementById("implementors-list");
- var synthetic_implementors = document.getElementById("synthetic-implementors-list");
+ const implementors = document.getElementById("implementors-list");
+ const synthetic_implementors = document.getElementById("synthetic-implementors-list");
+ const inlined_types = new Set();
if (synthetic_implementors) {
// This `inlined_types` variable is used to avoid having the same implementation
@@ -647,9 +650,8 @@ function hideThemeButtonState() {
//
// By the way, this is only used by and useful for traits implemented automatically
// (like "Send" and "Sync").
- var inlined_types = new Set();
onEachLazy(synthetic_implementors.getElementsByClassName("impl"), function(el) {
- var aliases = el.getAttribute("data-aliases");
+ const aliases = el.getAttribute("data-aliases");
if (!aliases) {
return;
}
@@ -659,48 +661,48 @@ function hideThemeButtonState() {
});
}
- var currentNbImpls = implementors.getElementsByClassName("impl").length;
- var traitName = document.querySelector("h1.fqn > .in-band > .trait").textContent;
- var baseIdName = "impl-" + traitName + "-";
- var libs = Object.getOwnPropertyNames(imp);
- for (var i = 0, llength = libs.length; i < llength; ++i) {
- if (libs[i] === window.currentCrate) { continue; }
- var structs = imp[libs[i]];
+ let currentNbImpls = implementors.getElementsByClassName("impl").length;
+ const traitName = document.querySelector("h1.fqn > .in-band > .trait").textContent;
+ const baseIdName = "impl-" + traitName + "-";
+ const libs = Object.getOwnPropertyNames(imp);
+ for (const lib of libs) {
+ if (lib === window.currentCrate) {
+ continue;
+ }
+ const structs = imp[lib];
struct_loop:
- for (var j = 0, slength = structs.length; j < slength; ++j) {
- var struct = structs[j];
-
- var list = struct.synthetic ? synthetic_implementors : implementors;
+ for (const struct of structs) {
+ const list = struct.synthetic ? synthetic_implementors : implementors;
if (struct.synthetic) {
- for (var k = 0, stlength = struct.types.length; k < stlength; k++) {
- if (inlined_types.has(struct.types[k])) {
+ for (const struct_type of struct.types) {
+ if (inlined_types.has(struct_type)) {
continue struct_loop;
}
- inlined_types.add(struct.types[k]);
+ inlined_types.add(struct_type);
}
}
- var code = document.createElement("h3");
+ const code = document.createElement("h3");
code.innerHTML = struct.text;
addClass(code, "code-header");
addClass(code, "in-band");
onEachLazy(code.getElementsByTagName("a"), function(elem) {
- var href = elem.getAttribute("href");
+ const href = elem.getAttribute("href");
if (href && href.indexOf("http") !== 0) {
elem.setAttribute("href", window.rootPath + href);
}
});
- var currentId = baseIdName + currentNbImpls;
- var anchor = document.createElement("a");
+ const currentId = baseIdName + currentNbImpls;
+ const anchor = document.createElement("a");
anchor.href = "#" + currentId;
addClass(anchor, "anchor");
- var display = document.createElement("div");
+ const display = document.createElement("div");
display.id = currentId;
addClass(display, "impl");
display.appendChild(anchor);
@@ -725,11 +727,11 @@ function hideThemeButtonState() {
}
function toggleAllDocs() {
- var innerToggle = document.getElementById(toggleAllDocsId);
+ const innerToggle = document.getElementById(toggleAllDocsId);
if (!innerToggle) {
return;
}
- var sectionIsCollapsed = false;
+ let sectionIsCollapsed = false;
if (hasClass(innerToggle, "will-expand")) {
removeClass(innerToggle, "will-expand");
onEachLazy(document.getElementsByClassName("rustdoc-toggle"), function(e) {
@@ -759,17 +761,17 @@ function hideThemeButtonState() {
}
(function() {
- var toggles = document.getElementById(toggleAllDocsId);
+ const toggles = document.getElementById(toggleAllDocsId);
if (toggles) {
toggles.onclick = toggleAllDocs;
}
- var hideMethodDocs = getSettingValue("auto-hide-method-docs") === "true";
- var hideImplementations = getSettingValue("auto-hide-trait-implementations") === "true";
- var hideLargeItemContents = getSettingValue("auto-hide-large-items") !== "false";
+ const hideMethodDocs = getSettingValue("auto-hide-method-docs") === "true";
+ const hideImplementations = getSettingValue("auto-hide-trait-implementations") === "true";
+ const hideLargeItemContents = getSettingValue("auto-hide-large-items") !== "false";
function setImplementorsTogglesOpen(id, open) {
- var list = document.getElementById(id);
+ const list = document.getElementById(id);
if (list !== null) {
onEachLazy(list.getElementsByClassName("implementors-toggle"), function(e) {
e.open = open;
@@ -792,7 +794,7 @@ function hideThemeButtonState() {
});
- var pageId = getPageId();
+ const pageId = getPageId();
if (pageId !== null) {
expandSection(pageId);
}
@@ -800,15 +802,15 @@ function hideThemeButtonState() {
(function() {
// To avoid checking on "rustdoc-line-numbers" value on every loop...
- var lineNumbersFunc = function() {};
+ let lineNumbersFunc = function() {};
if (getSettingValue("line-numbers") === "true") {
lineNumbersFunc = function(x) {
- var count = x.textContent.split("\n").length;
- var elems = [];
- for (var i = 0; i < count; ++i) {
+ const count = x.textContent.split("\n").length;
+ const elems = [];
+ for (let i = 0; i < count; ++i) {
elems.push(i + 1);
}
- var node = document.createElement("pre");
+ const node = document.createElement("pre");
addClass(node, "line-number");
node.innerHTML = elems.join("\n");
x.parentNode.insertBefore(node, x);
@@ -835,12 +837,12 @@ function hideThemeButtonState() {
}());
function hideSidebar() {
- var sidebar = document.getElementsByClassName("sidebar")[0];
+ const sidebar = document.getElementsByClassName("sidebar")[0];
removeClass(sidebar, "shown");
}
function handleClick(id, f) {
- var elem = document.getElementById(id);
+ const elem = document.getElementById(id);
if (elem) {
elem.addEventListener("click", f);
}
@@ -879,10 +881,10 @@ function hideThemeButtonState() {
};
});
- var sidebar_menu_toggle = document.getElementsByClassName("sidebar-menu-toggle")[0];
+ const sidebar_menu_toggle = document.getElementsByClassName("sidebar-menu-toggle")[0];
if (sidebar_menu_toggle) {
sidebar_menu_toggle.addEventListener("click", function() {
- var sidebar = document.getElementsByClassName("sidebar")[0];
+ const sidebar = document.getElementsByClassName("sidebar")[0];
if (!hasClass(sidebar, "shown")) {
addClass(sidebar, "shown");
} else {
@@ -891,8 +893,8 @@ function hideThemeButtonState() {
});
}
- var buildHelperPopup = function() {
- var popup = document.createElement("aside");
+ let buildHelperPopup = function() {
+ const popup = document.createElement("aside");
addClass(popup, "hidden");
popup.id = "help";
@@ -903,13 +905,13 @@ function hideThemeButtonState() {
}
});
- var book_info = document.createElement("span");
+ const book_info = document.createElement("span");
book_info.className = "top";
book_info.innerHTML = "You can find more information in \
the rustdoc book.";
- var container = document.createElement("div");
- var shortcuts = [
+ const container = document.createElement("div");
+ const shortcuts = [
["?", "Show this help dialog"],
["S", "Focus the search field"],
["T", "Focus the theme picker menu"],
@@ -927,11 +929,11 @@ function hideThemeButtonState() {
})
.join("") + "" + x[1] + "";
}).join("");
- var div_shortcuts = document.createElement("div");
+ const div_shortcuts = document.createElement("div");
addClass(div_shortcuts, "shortcuts");
div_shortcuts.innerHTML = "Keyboard Shortcuts
" + shortcuts + "
";
- var infos = [
+ const infos = [
"Prefix searches with a type followed by a colon (e.g., fn:) to \
restrict the search to a given item kind.",
"Accepted kinds are: fn, mod, struct, \
@@ -947,7 +949,7 @@ function hideThemeButtonState() {
].map(function(x) {
return "" + x + "
";
}).join("");
- var div_infos = document.createElement("div");
+ const div_infos = document.createElement("div");
addClass(div_infos, "infos");
div_infos.innerHTML = "Search Tricks
" + infos;
@@ -955,9 +957,9 @@ function hideThemeButtonState() {
container.appendChild(div_shortcuts);
container.appendChild(div_infos);
- var rustdoc_version = document.createElement("span");
+ const rustdoc_version = document.createElement("span");
rustdoc_version.className = "bottom";
- var rustdoc_version_code = document.createElement("code");
+ const rustdoc_version_code = document.createElement("code");
rustdoc_version_code.innerText = "rustdoc " + getVar("rustdoc-version");
rustdoc_version.appendChild(rustdoc_version_code);
@@ -975,11 +977,11 @@ function hideThemeButtonState() {
}());
(function () {
- var reset_button_timeout = null;
+ let reset_button_timeout = null;
window.copy_path = function(but) {
- var parent = but.parentElement;
- var path = [];
+ const parent = but.parentElement;
+ const path = [];
onEach(parent.childNodes, function(child) {
if (child.tagName === 'A') {
@@ -987,7 +989,7 @@ function hideThemeButtonState() {
}
});
- var el = document.createElement('textarea');
+ const el = document.createElement('textarea');
el.value = path.join('::');
el.setAttribute('readonly', '');
// To not make it appear on the screen.
@@ -1002,7 +1004,7 @@ function hideThemeButtonState() {
// There is always one children, but multiple childNodes.
but.children[0].style.display = 'none';
- var tmp;
+ let tmp;
if (but.childNodes.length < 2) {
tmp = document.createTextNode('✓');
but.appendChild(tmp);