summaryrefslogtreecommitdiffstats
path: root/src/librustdoc/html/static
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-06-07 05:48:48 +0000
commitef24de24a82fe681581cc130f342363c47c0969a (patch)
tree0d494f7e1a38b95c92426f58fe6eaa877303a86c /src/librustdoc/html/static
parentReleasing progress-linux version 1.74.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-ef24de24a82fe681581cc130f342363c47c0969a.tar.xz
rustc-ef24de24a82fe681581cc130f342363c47c0969a.zip
Merging upstream version 1.75.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/librustdoc/html/static')
-rw-r--r--src/librustdoc/html/static/css/rustdoc.css87
-rw-r--r--src/librustdoc/html/static/js/main.js281
-rw-r--r--src/librustdoc/html/static/js/search.js21
3 files changed, 364 insertions, 25 deletions
diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css
index 47f9e6502..9efdcd601 100644
--- a/src/librustdoc/html/static/css/rustdoc.css
+++ b/src/librustdoc/html/static/css/rustdoc.css
@@ -461,19 +461,9 @@ img {
display: none !important;
}
-.sidebar .logo-container {
- margin-top: 10px;
- margin-bottom: 10px;
- text-align: center;
-}
-
-.version {
- overflow-wrap: break-word;
-}
-
.logo-container > img {
- height: 100px;
- width: 100px;
+ height: 48px;
+ width: 48px;
}
ul.block, .block li {
@@ -502,6 +492,7 @@ ul.block, .block li {
}
.sidebar-elems,
+.sidebar > .version,
.sidebar > h2 {
padding-left: 24px;
}
@@ -510,6 +501,8 @@ ul.block, .block li {
color: var(--sidebar-link-color);
}
.sidebar .current,
+.sidebar .current a,
+.sidebar-crate a.logo-container:hover + h2 a,
.sidebar a:hover:not(.logo-container) {
background-color: var(--sidebar-current-link-background-color);
}
@@ -524,6 +517,75 @@ ul.block, .block li {
overflow: hidden;
}
+.sidebar-crate {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ /* there's a 10px padding at the top of <main>, and a 4px margin at the
+ top of the search form. To line them up, add them. */
+ margin: 14px 32px 1rem;
+ row-gap: 10px;
+ column-gap: 32px;
+ flex-wrap: wrap;
+}
+
+.sidebar-crate h2 {
+ flex-grow: 1;
+ /* This setup with the margins and row-gap is designed to make flex-wrap
+ work the way we want. If they're in the side-by-side lockup, there
+ should be a 16px margin to the left of the logo (visually the same as
+ the 24px one on everything else, which are not giant circles) and 8px
+ between it and the crate's name and version. When they're line wrapped,
+ the logo needs to have the same margin on both sides of itself (to
+ center properly) and the crate name and version need 24px on their
+ left margin. */
+ margin: 0 -8px;
+ /* To align this with the search bar, it should not be centered, even when
+ the logo is. */
+ align-self: start;
+}
+
+.sidebar-crate .logo-container {
+ /* The logo is expected to have 8px "slop" along its edges, so we can optically
+ center it. */
+ margin: 0 -16px 0 -16px;
+ text-align: center;
+}
+
+.sidebar-crate h2 a {
+ display: block;
+ margin: 0 calc(-24px + 0.25rem) 0 -0.5rem;
+ /* Align the sidebar crate link with the search bar, which have different
+ font sizes.
+
+ | | font-size | line-height | total line-height | padding-y | total |
+ |:-------|----------:|------------:|------------------:|----------:|-------------:|
+ | crate | 1.375rem | 1.25 | 1.72rem | x | 2x+1.72rem |
+ | search | 1rem | 1.15 | 1.15rem | 8px | 1.15rem+16px |
+
+ 2x + 1.72rem = 1.15rem + 16px
+ 2x = 1.15rem + 16px - 1.72rem
+ 2x = 16px - 0.57rem
+ x = ( 16px - 0.57rem ) / 2
+ */
+ padding: calc( ( 16px - 0.57rem ) / 2 ) 0.25rem;
+ padding-left: 0.5rem;
+}
+
+.sidebar-crate h2 .version {
+ display: block;
+ font-weight: normal;
+ font-size: 1rem;
+ overflow-wrap: break-word;
+ /* opposite of the link padding, cut in half again */
+ margin-top: calc( ( -16px + 0.57rem ) / 2 );
+}
+
+.sidebar-crate + .version {
+ margin-top: -1rem;
+ margin-bottom: 1rem;
+}
+
.mobile-topbar {
display: none;
}
@@ -1045,6 +1107,7 @@ so that we can apply CSS-filters to change the arrow color in themes */
white-space: pre-wrap;
border-radius: 3px;
display: inline;
+ vertical-align: baseline;
}
.stab.portability > code {
diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index eb256455b..7c052606a 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -51,9 +51,14 @@ function setMobileTopbar() {
// but with the current code it's hard to get the right information in the right place.
const mobileTopbar = document.querySelector(".mobile-topbar");
const locationTitle = document.querySelector(".sidebar h2.location");
- if (mobileTopbar && locationTitle) {
+ if (mobileTopbar) {
const mobileTitle = document.createElement("h2");
- mobileTitle.innerHTML = locationTitle.innerHTML;
+ mobileTitle.className = "location";
+ if (hasClass(document.body, "crate")) {
+ mobileTitle.innerText = `Crate ${window.currentCrate}`;
+ } else if (locationTitle) {
+ mobileTitle.innerHTML = locationTitle.innerHTML;
+ }
mobileTopbar.appendChild(mobileTitle);
}
}
@@ -354,6 +359,34 @@ function preLoadCss(cssUrl) {
expandSection(pageId);
}
}
+ if (savedHash.startsWith("impl-")) {
+ // impl-disambiguated links, used by the search engine
+ // format: impl-X[-for-Y]/method.WHATEVER
+ // turn this into method.WHATEVER[-NUMBER]
+ const splitAt = savedHash.indexOf("/");
+ if (splitAt !== -1) {
+ const implId = savedHash.slice(0, splitAt);
+ const assocId = savedHash.slice(splitAt + 1);
+ const implElem = document.getElementById(implId);
+ if (implElem && implElem.parentElement.tagName === "SUMMARY" &&
+ implElem.parentElement.parentElement.tagName === "DETAILS") {
+ onEachLazy(implElem.parentElement.parentElement.querySelectorAll(
+ `[id^="${assocId}"]`),
+ item => {
+ const numbered = /([^-]+)-([0-9]+)/.exec(item.id);
+ if (item.id === assocId || (numbered && numbered[1] === assocId)) {
+ openParentDetails(item);
+ item.scrollIntoView();
+ // Let the section expand itself before trying to highlight
+ setTimeout(() => {
+ window.location.replace("#" + item.id);
+ }, 0);
+ }
+ }
+ );
+ }
+ }
+ }
}
function onHashChange(ev) {
@@ -452,22 +485,27 @@ function preLoadCss(cssUrl) {
return;
}
+ const modpath = hasClass(document.body, "mod") ? "../" : "";
+
const h3 = document.createElement("h3");
- h3.innerHTML = `<a href="index.html#${id}">${longty}</a>`;
+ h3.innerHTML = `<a href="${modpath}index.html#${id}">${longty}</a>`;
const ul = document.createElement("ul");
ul.className = "block " + shortty;
for (const name of filtered) {
let path;
if (shortty === "mod") {
- path = name + "/index.html";
+ path = `${modpath}${name}/index.html`;
} else {
- path = shortty + "." + name + ".html";
+ path = `${modpath}${shortty}.${name}.html`;
+ }
+ let current_page = document.location.href.toString();
+ if (current_page.endsWith("/")) {
+ current_page += "index.html";
}
- const current_page = document.location.href.split("/").pop();
const link = document.createElement("a");
link.href = path;
- if (path === current_page) {
+ if (link.href === current_page) {
link.className = "current";
}
link.textContent = name;
@@ -480,23 +518,38 @@ function preLoadCss(cssUrl) {
}
if (sidebar) {
+ // keep this synchronized with ItemSection::ALL in html/render/mod.rs
+ // Re-exports aren't shown here, because they don't have child pages
+ //block("reexport", "reexports", "Re-exports");
block("primitive", "primitives", "Primitive Types");
block("mod", "modules", "Modules");
block("macro", "macros", "Macros");
block("struct", "structs", "Structs");
block("enum", "enums", "Enums");
- block("union", "unions", "Unions");
block("constant", "constants", "Constants");
block("static", "static", "Statics");
block("trait", "traits", "Traits");
block("fn", "functions", "Functions");
block("type", "types", "Type Aliases");
+ block("union", "unions", "Unions");
+ // No point, because these items don't appear in modules
+ //block("impl", "impls", "Implementations");
+ //block("tymethod", "tymethods", "Type Methods");
+ //block("method", "methods", "Methods");
+ //block("structfield", "fields", "Fields");
+ //block("variant", "variants", "Variants");
+ //block("associatedtype", "associated-types", "Associated Types");
+ //block("associatedconstant", "associated-consts", "Associated Constants");
block("foreigntype", "foreign-types", "Foreign Types");
block("keyword", "keywords", "Keywords");
+ block("opaque", "opaque-types", "Opaque Types");
+ block("attr", "attributes", "Attribute Macros");
+ block("derive", "derives", "Derive Macros");
block("traitalias", "trait-aliases", "Trait Aliases");
}
}
+ // <https://github.com/search?q=repo%3Arust-lang%2Frust+[RUSTDOCIMPL]+trait.impl&type=code>
window.register_implementors = imp => {
const implementors = document.getElementById("implementors-list");
const synthetic_implementors = document.getElementById("synthetic-implementors-list");
@@ -563,7 +616,7 @@ function preLoadCss(cssUrl) {
onEachLazy(code.getElementsByTagName("a"), elem => {
const href = elem.getAttribute("href");
- if (href && !/^(?:[a-z+]+:)?\/\//.test(href)) {
+ if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) {
elem.setAttribute("href", window.rootPath + href);
}
});
@@ -587,6 +640,216 @@ function preLoadCss(cssUrl) {
window.register_implementors(window.pending_implementors);
}
+ /**
+ * <https://github.com/search?q=repo%3Arust-lang%2Frust+[RUSTDOCIMPL]+type.impl&type=code>
+ *
+ * [RUSTDOCIMPL] type.impl
+ *
+ * This code inlines implementations into the type alias docs at runtime. It's done at
+ * runtime because some crates have many type aliases and many methods, and we don't want
+ * to generate *O*`(types*methods)` HTML text. The data inside is mostly HTML fragments,
+ * wrapped in JSON.
+ *
+ * - It only includes docs generated for the current crate. This function accepts an
+ * object mapping crate names to the set of impls.
+ *
+ * - It filters down to the set of applicable impls. The Rust type checker is used to
+ * tag each HTML blob with the set of type aliases that can actually use it, so the
+ * JS only needs to consult the attached list of type aliases.
+ *
+ * - It renames the ID attributes, to avoid conflicting IDs in the resulting DOM.
+ *
+ * - It adds the necessary items to the sidebar. If it's an inherent impl, that means
+ * adding methods, associated types, and associated constants. If it's a trait impl,
+ * that means adding it to the trait impl sidebar list.
+ *
+ * - It adds the HTML block itself. If it's an inherent impl, it goes after the type
+ * alias's own inherent impls. If it's a trait impl, it goes in the Trait
+ * Implementations section.
+ *
+ * - After processing all of the impls, it sorts the sidebar items by name.
+ *
+ * @param {{[cratename: string]: Array<Array<string|0>>}} impl
+ */
+ window.register_type_impls = imp => {
+ if (!imp || !imp[window.currentCrate]) {
+ return;
+ }
+ window.pending_type_impls = null;
+ const idMap = new Map();
+
+ let implementations = document.getElementById("implementations-list");
+ let trait_implementations = document.getElementById("trait-implementations-list");
+ let trait_implementations_header = document.getElementById("trait-implementations");
+
+ // We want to include the current type alias's impls, and no others.
+ const script = document.querySelector("script[data-self-path]");
+ const selfPath = script ? script.getAttribute("data-self-path") : null;
+
+ // These sidebar blocks need filled in, too.
+ const mainContent = document.querySelector("#main-content");
+ const sidebarSection = document.querySelector(".sidebar section");
+ let methods = document.querySelector(".sidebar .block.method");
+ let associatedTypes = document.querySelector(".sidebar .block.associatedtype");
+ let associatedConstants = document.querySelector(".sidebar .block.associatedconstant");
+ let sidebarTraitList = document.querySelector(".sidebar .block.trait-implementation");
+
+ for (const impList of imp[window.currentCrate]) {
+ const types = impList.slice(2);
+ const text = impList[0];
+ const isTrait = impList[1] !== 0;
+ const traitName = impList[1];
+ if (types.indexOf(selfPath) === -1) {
+ continue;
+ }
+ let outputList = isTrait ? trait_implementations : implementations;
+ if (outputList === null) {
+ const outputListName = isTrait ? "Trait Implementations" : "Implementations";
+ const outputListId = isTrait ?
+ "trait-implementations-list" :
+ "implementations-list";
+ const outputListHeaderId = isTrait ? "trait-implementations" : "implementations";
+ const outputListHeader = document.createElement("h2");
+ outputListHeader.id = outputListHeaderId;
+ outputListHeader.innerText = outputListName;
+ outputList = document.createElement("div");
+ outputList.id = outputListId;
+ if (isTrait) {
+ const link = document.createElement("a");
+ link.href = `#${outputListHeaderId}`;
+ link.innerText = "Trait Implementations";
+ const h = document.createElement("h3");
+ h.appendChild(link);
+ trait_implementations = outputList;
+ trait_implementations_header = outputListHeader;
+ sidebarSection.appendChild(h);
+ sidebarTraitList = document.createElement("ul");
+ sidebarTraitList.className = "block trait-implementation";
+ sidebarSection.appendChild(sidebarTraitList);
+ mainContent.appendChild(outputListHeader);
+ mainContent.appendChild(outputList);
+ } else {
+ implementations = outputList;
+ if (trait_implementations) {
+ mainContent.insertBefore(outputListHeader, trait_implementations_header);
+ mainContent.insertBefore(outputList, trait_implementations_header);
+ } else {
+ const mainContent = document.querySelector("#main-content");
+ mainContent.appendChild(outputListHeader);
+ mainContent.appendChild(outputList);
+ }
+ }
+ }
+ const template = document.createElement("template");
+ template.innerHTML = text;
+
+ onEachLazy(template.content.querySelectorAll("a"), elem => {
+ const href = elem.getAttribute("href");
+
+ if (href && !href.startsWith("#") && !/^(?:[a-z+]+:)?\/\//.test(href)) {
+ elem.setAttribute("href", window.rootPath + href);
+ }
+ });
+ onEachLazy(template.content.querySelectorAll("[id]"), el => {
+ let i = 0;
+ if (idMap.has(el.id)) {
+ i = idMap.get(el.id);
+ } else if (document.getElementById(el.id)) {
+ i = 1;
+ while (document.getElementById(`${el.id}-${2 * i}`)) {
+ i = 2 * i;
+ }
+ while (document.getElementById(`${el.id}-${i}`)) {
+ i += 1;
+ }
+ }
+ if (i !== 0) {
+ const oldHref = `#${el.id}`;
+ const newHref = `#${el.id}-${i}`;
+ el.id = `${el.id}-${i}`;
+ onEachLazy(template.content.querySelectorAll("a[href]"), link => {
+ if (link.getAttribute("href") === oldHref) {
+ link.href = newHref;
+ }
+ });
+ }
+ idMap.set(el.id, i + 1);
+ });
+ const templateAssocItems = template.content.querySelectorAll("section.tymethod, " +
+ "section.method, section.associatedtype, section.associatedconstant");
+ if (isTrait) {
+ const li = document.createElement("li");
+ const a = document.createElement("a");
+ a.href = `#${template.content.querySelector(".impl").id}`;
+ a.textContent = traitName;
+ li.appendChild(a);
+ sidebarTraitList.append(li);
+ } else {
+ onEachLazy(templateAssocItems, item => {
+ let block = hasClass(item, "associatedtype") ? associatedTypes : (
+ hasClass(item, "associatedconstant") ? associatedConstants : (
+ methods));
+ if (!block) {
+ const blockTitle = hasClass(item, "associatedtype") ? "Associated Types" : (
+ hasClass(item, "associatedconstant") ? "Associated Constants" : (
+ "Methods"));
+ const blockClass = hasClass(item, "associatedtype") ? "associatedtype" : (
+ hasClass(item, "associatedconstant") ? "associatedconstant" : (
+ "method"));
+ const blockHeader = document.createElement("h3");
+ const blockLink = document.createElement("a");
+ blockLink.href = "#implementations";
+ blockLink.innerText = blockTitle;
+ blockHeader.appendChild(blockLink);
+ block = document.createElement("ul");
+ block.className = `block ${blockClass}`;
+ const insertionReference = methods || sidebarTraitList;
+ if (insertionReference) {
+ const insertionReferenceH = insertionReference.previousElementSibling;
+ sidebarSection.insertBefore(blockHeader, insertionReferenceH);
+ sidebarSection.insertBefore(block, insertionReferenceH);
+ } else {
+ sidebarSection.appendChild(blockHeader);
+ sidebarSection.appendChild(block);
+ }
+ if (hasClass(item, "associatedtype")) {
+ associatedTypes = block;
+ } else if (hasClass(item, "associatedconstant")) {
+ associatedConstants = block;
+ } else {
+ methods = block;
+ }
+ }
+ const li = document.createElement("li");
+ const a = document.createElement("a");
+ a.innerText = item.id.split("-")[0].split(".")[1];
+ a.href = `#${item.id}`;
+ li.appendChild(a);
+ block.appendChild(li);
+ });
+ }
+ outputList.appendChild(template.content);
+ }
+
+ for (const list of [methods, associatedTypes, associatedConstants, sidebarTraitList]) {
+ if (!list) {
+ continue;
+ }
+ const newChildren = Array.prototype.slice.call(list.children);
+ newChildren.sort((a, b) => {
+ const aI = a.innerText;
+ const bI = b.innerText;
+ return aI < bI ? -1 :
+ aI > bI ? 1 :
+ 0;
+ });
+ list.replaceChildren(...newChildren);
+ }
+ };
+ if (window.pending_type_impls) {
+ window.register_type_impls(window.pending_type_impls);
+ }
+
function addSidebarCrates() {
if (!window.ALL_CRATES) {
return;
diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index 2f0cae0a4..48c9a53a2 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -1555,7 +1555,7 @@ function initSearch(rawSearchIndex) {
return false;
}
}
- } else if (fnType.id !== null) {
+ } else {
if (queryElem.id === typeNameIdOfArrayOrSlice &&
(fnType.id === typeNameIdOfSlice || fnType.id === typeNameIdOfArray)
) {
@@ -1752,6 +1752,7 @@ function initSearch(rawSearchIndex) {
type: item.type,
is_alias: true,
deprecated: item.deprecated,
+ implDisambiguator: item.implDisambiguator,
};
}
@@ -2218,7 +2219,7 @@ function initSearch(rawSearchIndex) {
href = ROOT_PATH + name + "/index.html";
} else if (item.parent !== undefined) {
const myparent = item.parent;
- let anchor = "#" + type + "." + name;
+ let anchor = type + "." + name;
const parentType = itemTypes[myparent.ty];
let pageType = parentType;
let pageName = myparent.name;
@@ -2232,16 +2233,19 @@ function initSearch(rawSearchIndex) {
const enumName = item.path.substr(enumNameIdx + 2);
path = item.path.substr(0, enumNameIdx);
displayPath = path + "::" + enumName + "::" + myparent.name + "::";
- anchor = "#variant." + myparent.name + ".field." + name;
+ anchor = "variant." + myparent.name + ".field." + name;
pageType = "enum";
pageName = enumName;
} else {
displayPath = path + "::" + myparent.name + "::";
}
+ if (item.implDisambiguator !== null) {
+ anchor = item.implDisambiguator + "/" + anchor;
+ }
href = ROOT_PATH + path.replace(/::/g, "/") +
"/" + pageType +
"." + pageName +
- ".html" + anchor;
+ ".html#" + anchor;
} else {
displayPath = item.path + "::";
href = ROOT_PATH + item.path.replace(/::/g, "/") +
@@ -2727,6 +2731,10 @@ ${item.displayPath}<span class="${type}">${name}</span>\
* Types are also represented as arrays; the first item is an index into the `p`
* array, while the second is a list of types representing any generic parameters.
*
+ * b[i] contains an item's impl disambiguator. This is only present if an item
+ * is defined in an impl block and, the impl block's type has more than one associated
+ * item with the same name.
+ *
* `a` defines aliases with an Array of pairs: [name, offset], where `offset`
* points into the n/t/d/q/i/f arrays.
*
@@ -2746,6 +2754,7 @@ ${item.displayPath}<span class="${type}">${name}</span>\
* i: Array<Number>,
* f: Array<RawFunctionSearchType>,
* p: Array<Object>,
+ * b: Array<[Number, String]>,
* c: Array<Number>
* }}
*/
@@ -2766,6 +2775,7 @@ ${item.displayPath}<span class="${type}">${name}</span>\
id: id,
normalizedName: crate.indexOf("_") === -1 ? crate : crate.replace(/_/g, ""),
deprecated: null,
+ implDisambiguator: null,
};
id += 1;
searchIndex.push(crateRow);
@@ -2789,6 +2799,8 @@ ${item.displayPath}<span class="${type}">${name}</span>\
const itemFunctionSearchTypes = crateCorpus.f;
// an array of (Number) indices for the deprecated items
const deprecatedItems = new Set(crateCorpus.c);
+ // an array of (Number) indices for the deprecated items
+ const implDisambiguator = new Map(crateCorpus.b);
// an array of [(Number) item type,
// (String) name]
const paths = crateCorpus.p;
@@ -2849,6 +2861,7 @@ ${item.displayPath}<span class="${type}">${name}</span>\
id: id,
normalizedName: word.indexOf("_") === -1 ? word : word.replace(/_/g, ""),
deprecated: deprecatedItems.has(i),
+ implDisambiguator: implDisambiguator.has(i) ? implDisambiguator.get(i) : null,
};
id += 1;
searchIndex.push(row);