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:
commit
c0ed53c0da
@ -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
|
||||
|
@ -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',
|
||||
},
|
||||
];
|
||||
|
93
src/test/rustdoc-js-std/parser-ident.js
Normal file
93
src/test/rustdoc-js-std/parser-ident.js
Normal 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,
|
||||
},
|
||||
];
|
@ -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,
|
||||
},
|
||||
];
|
||||
|
Loading…
x
Reference in New Issue
Block a user