about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDylan DPC <99973273+Dylan-DPC@users.noreply.github.com>2023-03-04 15:24:38 +0530
committerGitHub <noreply@github.com>2023-03-04 15:24:38 +0530
commit2fc4935cdbb53df78fa902c61d3cf722d077adec (patch)
tree2f73baf1b602a2e81a8d31a8ec54abc407c634ad
parent832dab3798cb25512cc6ed43f105a40f6a3db4eb (diff)
parent823671589f3de683d6d2f46fa6c0259d08f6cda5 (diff)
downloadrust-2fc4935cdbb53df78fa902c61d3cf722d077adec.tar.gz
rust-2fc4935cdbb53df78fa902c61d3cf722d077adec.zip
Rollup merge of #108656 - GuillaumeGomez:rustdoc-search-unclosed-generic, r=notriddle
Rustdoc search: Emit an error for unclosed generic

Now, search like `a<` will error as it should (and as written in the eBNF).

r? `@notriddle`
-rw-r--r--src/librustdoc/html/static/js/search.js14
-rw-r--r--tests/rustdoc-js-std/parser-errors.js10
2 files changed, 23 insertions, 1 deletions
diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index 5a46729156d..b98bced4126 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -469,6 +469,15 @@ function initSearch(rawSearchIndex) {
             }
             const posBefore = parserState.pos;
             getNextElem(query, parserState, elems, endChar === ">");
+            if (endChar !== "") {
+                if (parserState.pos >= parserState.length) {
+                    throw ["Unclosed ", "<"];
+                }
+                const c2 = parserState.userQuery[parserState.pos];
+                if (!isSeparatorCharacter(c2) && c2 !== endChar) {
+                    throw ["Expected ", endChar, ", found ", c2];
+                }
+            }
             // This case can be encountered if `getNextElem` encountered a "stop character" right
             // from the start. For example if you have `,,` or `<>`. In this case, we simply move up
             // the current position to continue the parsing.
@@ -477,7 +486,10 @@ function initSearch(rawSearchIndex) {
             }
             foundStopChar = false;
         }
-        // We are either at the end of the string or on the `endChar`` character, let's move forward
+        if (parserState.pos >= parserState.length && endChar !== "") {
+            throw ["Unclosed ", "<"];
+        }
+        // We are either at the end of the string or on the `endChar` character, let's move forward
         // in any case.
         parserState.pos += 1;
     }
diff --git a/tests/rustdoc-js-std/parser-errors.js b/tests/rustdoc-js-std/parser-errors.js
index 6c5a7770283..98c6f27ca61 100644
--- a/tests/rustdoc-js-std/parser-errors.js
+++ b/tests/rustdoc-js-std/parser-errors.js
@@ -39,6 +39,7 @@ const QUERY = [
     "a!!",
     "mod:a!",
     "a!::a",
+    "a<",
 ];
 
 const PARSED = [
@@ -402,4 +403,13 @@ const PARSED = [
         userQuery: "a!::a",
         error: 'Cannot have associated items in macros',
     },
+    {
+        elems: [],
+        foundElems: 0,
+        original: "a<",
+        returned: [],
+        typeFilter: -1,
+        userQuery: "a<",
+        error: "Unclosed `<`",
+    },
 ];