Skip to content

Commit

Permalink
Rollup merge of #96430 - GuillaumeGomez:search-exclamation, r=notriddle
Browse files Browse the repository at this point in the history
Fix handling of `!` in rustdoc search

Fixes #96399.

I also updated the eBNF.

cc `@jsha`
r? `@notriddle`
  • Loading branch information
Dylan-DPC authored Apr 27, 2022
2 parents 875b22f + 4ea1499 commit c0ed53c
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 3 deletions.
15 changes: 13 additions & 2 deletions src/librustdoc/html/static/js/search.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) ||
Expand All @@ -329,6 +339,7 @@ window.initSearch = function(rawSearchIndex) {
}
// Skip current ":".
parserState.pos += 1;
foundExclamation = false;
} else {
throw new Error(`Unexpected \`${c}\``);
}
Expand Down Expand Up @@ -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
Expand Down
20 changes: 20 additions & 0 deletions src/test/rustdoc-js-std/parser-errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ const QUERY = [
"a,:",
" a<> :",
"mod : :",
"a!a",
"a!!",
];

const PARSED = [
Expand Down Expand Up @@ -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 changes: 93 additions & 0 deletions src/test/rustdoc-js-std/parser-ident.js
Original file line number Diff line number Diff line change
@@ -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,
},
];
23 changes: 22 additions & 1 deletion src/test/rustdoc-js-std/parser-returned.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
const QUERY = ['-> F<P>', '-> P', '->,a', 'aaaaa->a'];
const QUERY = [
"-> F<P>",
"-> P",
"->,a",
"aaaaa->a",
"-> !",
];

const PARSED = [
{
Expand Down Expand Up @@ -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,
},
];

0 comments on commit c0ed53c

Please sign in to comment.