diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index 421e8f31e970..8beb0768dcf7 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -211,6 +211,21 @@ window.initSearch = function(rawSearchIndex) {
return parserState.userQuery.slice(parserState.pos, parserState.pos + 2) == '->';
}
+ /**
+ * Returns `true` if the given `c` character is valid for an ident.
+ *
+ * @param {string} c
+ *
+ * @return {boolean}
+ */
+ function isIdentCharacter(c) {
+ return (
+ c === '_' ||
+ (c >= '0' && c <= '9') ||
+ (c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z'));
+ }
+
/**
* @param {ParsedQuery} query
* @param {ParserState} parserState
@@ -274,18 +289,22 @@ window.initSearch = function(rawSearchIndex) {
} else {
while (parserState.pos < parserState.length) {
var c = parserState.userQuery[parserState.pos];
- if (isErrorCharacter(c)) {
- throw new Error(`Unexpected \`${c}\``);
- } else if (isStopCharacter(c) || isSpecialStartCharacter(c)) {
- break;
- }
- // If we allow paths ("str::string" for example).
- else if (c === ":") {
- if (!isPathStart(parserState)) {
+ if (!isIdentCharacter(c)) {
+ if (isErrorCharacter(c)) {
+ throw new Error(`Unexpected \`${c}\``);
+ } else if (isStopCharacter(c) || isSpecialStartCharacter(c)) {
break;
}
- // Skip current ":".
- parserState.pos += 1;
+ // If we allow paths ("str::string" for example).
+ else if (c === ":") {
+ if (!isPathStart(parserState)) {
+ break;
+ }
+ // Skip current ":".
+ parserState.pos += 1;
+ } else {
+ throw new Error(`Unexpected \`${c}\``);
+ }
}
parserState.pos += 1;
end = parserState.pos;
diff --git a/src/test/rustdoc-js-std/parser-errors.js b/src/test/rustdoc-js-std/parser-errors.js
index 080f82b41eca..ae5145e83223 100644
--- a/src/test/rustdoc-js-std/parser-errors.js
+++ b/src/test/rustdoc-js-std/parser-errors.js
@@ -17,9 +17,10 @@ const QUERY = [
":a",
"a b:",
"a (b:",
- "{:",
+ "_:",
"a-bb",
"a>bb",
+ "ab'",
];
const PARSED = [
@@ -188,11 +189,11 @@ const PARSED = [
{
elems: [],
foundElems: 0,
- original: "{:",
+ original: "_:",
returned: [],
typeFilter: -1,
- userQuery: "{:",
- error: "Unknown type filter `{`",
+ userQuery: "_:",
+ error: "Unknown type filter `_`",
},
{
elems: [],
@@ -212,4 +213,13 @@ const PARSED = [
userQuery: "a>bb",
error: "Unexpected `>` (did you mean `->`?)",
},
+ {
+ elems: [],
+ foundElems: 0,
+ original: "ab'",
+ returned: [],
+ typeFilter: -1,
+ userQuery: "ab'",
+ error: "Unexpected `'`",
+ },
];
diff --git a/src/tools/rustdoc-js/tester.js b/src/tools/rustdoc-js/tester.js
index afd878423c0a..d52090898927 100644
--- a/src/tools/rustdoc-js/tester.js
+++ b/src/tools/rustdoc-js/tester.js
@@ -274,7 +274,8 @@ function loadSearchJsAndIndex(searchJs, searchIndex, storageJs, crate) {
"isWhitespace", "isSpecialStartCharacter", "isStopCharacter",
"parseInput", "getItemsBefore", "getNextElem", "createQueryElement",
"isReturnArrow", "isPathStart", "getStringElem", "newParsedQuery",
- "itemTypeFromName", "isEndCharacter", "isErrorCharacter"];
+ "itemTypeFromName", "isEndCharacter", "isErrorCharacter",
+ "isIdentCharacter"];
const functions = ["hasOwnPropertyRustdoc", "onEach"];
ALIASES = {};