diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index 6d118ae5784..c1a021e9f8d 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -692,8 +692,6 @@ function createQueryElement(query, parserState, name, generics, isInGenerics) {
const quadcolon = /::\s*::/.exec(path);
if (path.startsWith("::")) {
throw ["Paths cannot start with ", "::"];
- } else if (path.endsWith("::")) {
- throw ["Paths cannot end with ", "::"];
} else if (quadcolon !== null) {
throw ["Unexpected ", quadcolon[0]];
}
@@ -3974,18 +3972,19 @@ class DocSearch {
if (parsedQuery.foundElems === 1 && !parsedQuery.hasReturnArrow) {
const elem = parsedQuery.elems[0];
- for (const id of this.nameTrie.search(elem.normalizedPathLast, this.tailTable)) {
+ // use arrow functions to preserve `this`.
+ const handleNameSearch = id => {
const row = this.searchIndex[id];
if (!typePassesFilter(elem.typeFilter, row.ty) ||
(filterCrates !== null && row.crate !== filterCrates)) {
- continue;
+ return;
}
let pathDist = 0;
if (elem.fullPath.length > 1) {
pathDist = checkPath(elem.pathWithoutLast, row);
if (pathDist === null) {
- continue;
+ return;
}
}
@@ -4008,9 +4007,20 @@ class DocSearch {
maxEditDistance,
);
}
+ };
+ if (elem.normalizedPathLast !== "") {
+ const last = elem.normalizedPathLast;
+ for (const id of this.nameTrie.search(last, this.tailTable)) {
+ handleNameSearch(id);
+ }
}
const length = this.searchIndex.length;
+
for (let i = 0, nSearchIndex = length; i < nSearchIndex; ++i) {
+ // queries that end in :: bypass the trie
+ if (elem.normalizedPathLast === "") {
+ handleNameSearch(i);
+ }
const row = this.searchIndex[i];
if (filterCrates !== null && row.crate !== filterCrates) {
continue;
diff --git a/tests/rustdoc-js-std/parser-errors.js b/tests/rustdoc-js-std/parser-errors.js
index 068298e7236..8bffef61c8f 100644
--- a/tests/rustdoc-js-std/parser-errors.js
+++ b/tests/rustdoc-js-std/parser-errors.js
@@ -143,14 +143,6 @@ const PARSED = [
returned: [],
error: "Unexpected `:: ::`",
},
- {
- query: "a::b::",
- elems: [],
- foundElems: 0,
- userQuery: "a::b::",
- returned: [],
- error: "Paths cannot end with `::`",
- },
{
query: ":a",
elems: [],
diff --git a/tests/rustdoc-js-std/path-end-empty.js b/tests/rustdoc-js-std/path-end-empty.js
new file mode 100644
index 00000000000..6e853c61b4d
--- /dev/null
+++ b/tests/rustdoc-js-std/path-end-empty.js
@@ -0,0 +1,6 @@
+const EXPECTED = {
+ 'query': 'Option::',
+ 'others': [
+ { 'path': 'std::option::Option', 'name': 'get_or_insert_default' },
+ ],
+}