Rollup merge of #108143 - notriddle:notriddle/filter-exclamation-macro, r=GuillaumeGomez
rustdoc: search by macro when query ends with `!`
Related to #96399
Note: the `never` type alias is tested in [`/tests/rustdoc-js-std/alias-3.js`](08ad401633/tests/rustdoc-js-std/alias-3.js
)
## Before

## After

This commit is contained in:
commit
f03e5345aa
7 changed files with 137 additions and 25 deletions
|
@ -300,20 +300,21 @@ function initSearch(rawSearchIndex) {
|
|||
* @return {integer}
|
||||
*/
|
||||
function getIdentEndPosition(parserState) {
|
||||
const start = parserState.pos;
|
||||
let end = parserState.pos;
|
||||
let foundExclamation = false;
|
||||
let foundExclamation = -1;
|
||||
while (parserState.pos < parserState.length) {
|
||||
const c = parserState.userQuery[parserState.pos];
|
||||
if (!isIdentCharacter(c)) {
|
||||
if (c === "!") {
|
||||
if (foundExclamation) {
|
||||
if (foundExclamation !== -1) {
|
||||
throw new Error("Cannot have more than one `!` in an ident");
|
||||
} else if (parserState.pos + 1 < parserState.length &&
|
||||
isIdentCharacter(parserState.userQuery[parserState.pos + 1])
|
||||
) {
|
||||
throw new Error("`!` can only be at the end of an ident");
|
||||
}
|
||||
foundExclamation = true;
|
||||
foundExclamation = parserState.pos;
|
||||
} else if (isErrorCharacter(c)) {
|
||||
throw new Error(`Unexpected \`${c}\``);
|
||||
} else if (
|
||||
|
@ -326,9 +327,18 @@ function initSearch(rawSearchIndex) {
|
|||
if (!isPathStart(parserState)) {
|
||||
break;
|
||||
}
|
||||
if (foundExclamation !== -1) {
|
||||
if (start <= (end - 2)) {
|
||||
throw new Error("Cannot have associated items in macros");
|
||||
} else {
|
||||
// if start == end - 1, we got the never type
|
||||
// while the never type has no associated macros, we still
|
||||
// can parse a path like that
|
||||
foundExclamation = -1;
|
||||
}
|
||||
}
|
||||
// Skip current ":".
|
||||
parserState.pos += 1;
|
||||
foundExclamation = false;
|
||||
} else {
|
||||
throw new Error(`Unexpected \`${c}\``);
|
||||
}
|
||||
|
@ -336,6 +346,16 @@ function initSearch(rawSearchIndex) {
|
|||
parserState.pos += 1;
|
||||
end = parserState.pos;
|
||||
}
|
||||
// if start == end - 1, we got the never type
|
||||
if (foundExclamation !== -1 && start <= (end - 2)) {
|
||||
if (parserState.typeFilter === null) {
|
||||
parserState.typeFilter = "macro";
|
||||
} else if (parserState.typeFilter !== "macro") {
|
||||
throw new Error("Invalid search type: macro `!` and " +
|
||||
`\`${parserState.typeFilter}\` both specified`);
|
||||
}
|
||||
end = foundExclamation;
|
||||
}
|
||||
return end;
|
||||
}
|
||||
|
||||
|
@ -589,8 +609,8 @@ function initSearch(rawSearchIndex) {
|
|||
*
|
||||
* The supported syntax by this parser is as follow:
|
||||
*
|
||||
* ident = *(ALPHA / DIGIT / "_") [!]
|
||||
* path = ident *(DOUBLE-COLON ident)
|
||||
* ident = *(ALPHA / DIGIT / "_")
|
||||
* path = ident *(DOUBLE-COLON ident) [!]
|
||||
* arg = path [generics]
|
||||
* arg-without-generic = path
|
||||
* type-sep = COMMA/WS *(COMMA/WS)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue