From 8e29ed43d9943b2cf705e3511e54ba01d2feaa93 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Wed, 23 Mar 2022 17:26:32 +0100 Subject: [PATCH] Add isIdentCharacter function to ensure that unexpected characters are handled correctly --- src/librustdoc/html/static/js/search.js | 39 ++++++++++++++++++------ src/test/rustdoc-js-std/parser-errors.js | 18 ++++++++--- src/tools/rustdoc-js/tester.js | 3 +- 3 files changed, 45 insertions(+), 15 deletions(-) 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 = {};