Rollup merge of #96430 - GuillaumeGomez:search-exclamation, r=notriddle

Fix handling of `!` in rustdoc search

Fixes #96399.

I also updated the eBNF.

cc `@jsha`
r? `@notriddle`
This commit is contained in:
Dylan DPC 2022-04-27 02:47:12 +02:00 committed by GitHub
commit c0ed53c0da
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 148 additions and 3 deletions

View File

@ -310,10 +310,20 @@ window.initSearch = function(rawSearchIndex) {
*/
function getIdentEndPosition(parserState) {
let end = parserState.pos;
let foundExclamation = false;
while (parserState.pos < parserState.length) {
const c = parserState.userQuery[parserState.pos];
if (!isIdentCharacter(c)) {
if (isErrorCharacter(c)) {
if (c === "!") {
if (foundExclamation) {
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;
} else if (isErrorCharacter(c)) {
throw new Error(`Unexpected \`${c}\``);
} else if (
isStopCharacter(c) ||
@ -329,6 +339,7 @@ window.initSearch = function(rawSearchIndex) {
}
// Skip current ":".
parserState.pos += 1;
foundExclamation = false;
} else {
throw new Error(`Unexpected \`${c}\``);
}
@ -591,7 +602,7 @@ window.initSearch = function(rawSearchIndex) {
*
* The supported syntax by this parser is as follow:
*
* ident = *(ALPHA / DIGIT / "_")
* ident = *(ALPHA / DIGIT / "_") [!]
* path = ident *(DOUBLE-COLON ident)
* arg = path [generics]
* arg-without-generic = path

View File

@ -35,6 +35,8 @@ const QUERY = [
"a,:",
" a<> :",
"mod : :",
"a!a",
"a!!",
];
const PARSED = [
@ -362,4 +364,22 @@ const PARSED = [
userQuery: "mod : :",
error: 'Unexpected `:`',
},
{
elems: [],
foundElems: 0,
original: "a!a",
returned: [],
typeFilter: -1,
userQuery: "a!a",
error: '`!` can only be at the end of an ident',
},
{
elems: [],
foundElems: 0,
original: "a!!",
returned: [],
typeFilter: -1,
userQuery: "a!!",
error: 'Cannot have more than one `!` in an ident',
},
];

View File

@ -0,0 +1,93 @@
const QUERY = [
"R<!>",
"!",
"a!",
"a!::b",
"a!::b!",
];
const PARSED = [
{
elems: [{
name: "r",
fullPath: ["r"],
pathWithoutLast: [],
pathLast: "r",
generics: [
{
name: "!",
fullPath: ["!"],
pathWithoutLast: [],
pathLast: "!",
generics: [],
},
],
}],
foundElems: 1,
original: "R<!>",
returned: [],
typeFilter: -1,
userQuery: "r<!>",
error: null,
},
{
elems: [{
name: "!",
fullPath: ["!"],
pathWithoutLast: [],
pathLast: "!",
generics: [],
}],
foundElems: 1,
original: "!",
returned: [],
typeFilter: -1,
userQuery: "!",
error: null,
},
{
elems: [{
name: "a!",
fullPath: ["a!"],
pathWithoutLast: [],
pathLast: "a!",
generics: [],
}],
foundElems: 1,
original: "a!",
returned: [],
typeFilter: -1,
userQuery: "a!",
error: null,
},
{
elems: [{
name: "a!::b",
fullPath: ["a!", "b"],
pathWithoutLast: ["a!"],
pathLast: "b",
generics: [],
}],
foundElems: 1,
original: "a!::b",
returned: [],
typeFilter: -1,
userQuery: "a!::b",
error: null,
},
{
elems: [{
name: "a!::b!",
fullPath: ["a!", "b!"],
pathWithoutLast: ["a!"],
pathLast: "b!",
generics: [],
}],
foundElems: 1,
original: "a!::b!",
returned: [],
typeFilter: -1,
userQuery: "a!::b!",
error: null,
},
];

View File

@ -1,4 +1,10 @@
const QUERY = ['-> F<P>', '-> P', '->,a', 'aaaaa->a'];
const QUERY = [
"-> F<P>",
"-> P",
"->,a",
"aaaaa->a",
"-> !",
];
const PARSED = [
{
@ -75,4 +81,19 @@ const PARSED = [
userQuery: "aaaaa->a",
error: null,
},
{
elems: [],
foundElems: 1,
original: "-> !",
returned: [{
name: "!",
fullPath: ["!"],
pathWithoutLast: [],
pathLast: "!",
generics: [],
}],
typeFilter: -1,
userQuery: "-> !",
error: null,
},
];