mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-21 13:49:34 +01:00
rustdoc search: allow queries to end in an empty path segment
fixes https://github.com/rust-lang/rust/issues/129707 this can be used to show all items in a module, or all associated items for a type. currently sufferes slightly due to case insensitivity, so `Option::` will also show items in the `option::` module. it disables the checking of the last path element, otherwise only items with short names will be shown
This commit is contained in:
parent
ce40196577
commit
cd46ff6c05
@ -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;
|
||||
|
@ -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: [],
|
||||
|
6
tests/rustdoc-js-std/path-end-empty.js
Normal file
6
tests/rustdoc-js-std/path-end-empty.js
Normal file
@ -0,0 +1,6 @@
|
||||
const EXPECTED = {
|
||||
'query': 'Option::',
|
||||
'others': [
|
||||
{ 'path': 'std::option::Option', 'name': 'get_or_insert_default' },
|
||||
],
|
||||
}
|
Loading…
Reference in New Issue
Block a user