diff --git a/src/librustdoc/html/static/js/rustdoc.d.ts b/src/librustdoc/html/static/js/rustdoc.d.ts
index 4b43c00730d47..e94c6beabea39 100644
--- a/src/librustdoc/html/static/js/rustdoc.d.ts
+++ b/src/librustdoc/html/static/js/rustdoc.d.ts
@@ -4,6 +4,10 @@
/* eslint-disable */
declare global {
+ /** Map from crate name to directory structure, for source view */
+ declare var srcIndex: Map;
+ /** Defined and documented in `main.js` */
+ declare function nonnull(x: T|null, msg: string|undefined);
interface Window {
/** Make the current theme easy to find */
currentTheme: HTMLLinkElement|null;
@@ -40,6 +44,23 @@ declare global {
* or if this is a docs page, this function does nothing.
*/
rustdocShowSourceSidebar: function(),
+ /**
+ * Close the sidebar in source code view
+ */
+ rustdocCloseSourceSidebar?: function(),
+ /**
+ * Shows the sidebar in source code view
+ */
+ rustdocShowSourceSidebar?: function(),
+ /**
+ * Toggles the sidebar in source code view
+ */
+ rustdocToggleSrcSidebar?: function(),
+ /**
+ * create's the sidebar in source code view.
+ * called in generated `src-files.js`.
+ */
+ createSrcSidebar?: function(),
/**
* Set up event listeners for a scraped source example.
*/
@@ -438,4 +459,12 @@ declare namespace rustdoc {
type TypeImpls = {
[cratename: string]: Array>
}
+
+ /**
+ * Directory structure for source code view,
+ * defined in generated `src-files.js`.
+ *
+ * is a tuple of (filename, subdirs, filenames).
+ */
+ type Dir = [string, rustdoc.Dir[], string[]]
}
diff --git a/src/librustdoc/html/static/js/src-script.js b/src/librustdoc/html/static/js/src-script.js
index fc27241334bfe..b9ab6e85603bc 100644
--- a/src/librustdoc/html/static/js/src-script.js
+++ b/src/librustdoc/html/static/js/src-script.js
@@ -3,10 +3,8 @@
// Local js definitions:
/* global addClass, onEachLazy, removeClass, browserSupportsHistoryApi */
-/* global updateLocalStorage, getVar */
+/* global updateLocalStorage, getVar, nonnull */
-// Eventually fix this.
-// @ts-nocheck
"use strict";
@@ -29,6 +27,14 @@ function closeSidebarIfMobile() {
}
}
+/**
+ * @param {rustdoc.Dir} elem
+ * @param {HTMLElement} parent
+ * @param {string} fullPath
+ * @param {boolean} hasFoundFile
+ *
+ * @returns {boolean} - new value for hasFoundFile
+ */
function createDirEntry(elem, parent, fullPath, hasFoundFile) {
const dirEntry = document.createElement("details");
const summary = document.createElement("summary");
@@ -95,7 +101,7 @@ window.rustdocToggleSrcSidebar = () => {
// This function is called from "src-files.js", generated in `html/render/write_shared.rs`.
// eslint-disable-next-line no-unused-vars
function createSrcSidebar() {
- const container = document.querySelector("nav.sidebar");
+ const container = nonnull(document.querySelector("nav.sidebar"));
const sidebar = document.createElement("div");
sidebar.id = "src-sidebar";
@@ -111,6 +117,7 @@ function createSrcSidebar() {
// Focus on the current file in the source files sidebar.
const selected_elem = sidebar.getElementsByClassName("selected")[0];
if (typeof selected_elem !== "undefined") {
+ // @ts-expect-error
selected_elem.focus();
}
}
@@ -130,11 +137,12 @@ function highlightSrcLines() {
to = from;
from = tmp;
}
- let elem = document.getElementById(from);
+ const from_s = "" + from;
+ let elem = document.getElementById(from_s);
if (!elem) {
return;
}
- const x = document.getElementById(from);
+ const x = document.getElementById(from_s);
if (x) {
x.scrollIntoView();
}
@@ -142,7 +150,7 @@ function highlightSrcLines() {
removeClass(e, "line-highlighted");
});
for (let i = from; i <= to; ++i) {
- elem = document.getElementById(i);
+ elem = document.getElementById("" + i);
if (!elem) {
break;
}
@@ -153,11 +161,12 @@ function highlightSrcLines() {
const handleSrcHighlight = (function() {
let prev_line_id = 0;
+ /** @type {function(string): void} */
const set_fragment = name => {
const x = window.scrollX,
y = window.scrollY;
if (browserSupportsHistoryApi()) {
- history.replaceState(null, null, "#" + name);
+ history.replaceState(null, "", "#" + name);
highlightSrcLines();
} else {
location.replace("#" + name);
@@ -166,6 +175,7 @@ const handleSrcHighlight = (function() {
window.scrollTo(x, y);
};
+ // @ts-expect-error
return ev => {
let cur_line_id = parseInt(ev.target.id, 10);
// This event handler is attached to the entire line number column, but it should only
@@ -191,7 +201,7 @@ const handleSrcHighlight = (function() {
} else {
prev_line_id = cur_line_id;
- set_fragment(cur_line_id);
+ set_fragment("" + cur_line_id);
}
};
}());
diff --git a/src/librustdoc/html/static/js/storage.js b/src/librustdoc/html/static/js/storage.js
index 425b915b5f94e..748d2ef33c32c 100644
--- a/src/librustdoc/html/static/js/storage.js
+++ b/src/librustdoc/html/static/js/storage.js
@@ -21,6 +21,28 @@ const settingsDataset = (function() {
return settingsElement && settingsElement.dataset ? settingsElement.dataset : null;
})();
+/**
+ * Assert that the passed value is nonnull, then return it.
+ *
+ * Takes an optional error message argument.
+ *
+ * Must be defined in this file, as it is loaded before all others.
+ *
+ * @template T
+ * @param {T|null} x
+ * @param {string=} msg
+ * @returns T
+ */
+// used in other files, not yet used in this one.
+// eslint-disable-next-line no-unused-vars
+function nonnull(x, msg) {
+ if (x === null) {
+ throw (msg || "unexpected null value!");
+ } else {
+ return x;
+ }
+}
+
/**
* Get a configuration value. If it's not set, get the default.
*