`, there is no name but it remains valid. - if (pathSegments.length === 0) { - pathSegments = [""]; + // In case we only have something like `
`, there is no name.
+ if (pathSegments.length === 0 || (pathSegments.length === 1 && pathSegments[0] === "")) {
+ throw new Error("Found generics without a path");
}
- elems.push({
+ parserState.totalElems += 1;
+ return {
name: name,
fullPath: pathSegments,
pathWithoutLast: pathSegments.slice(0, pathSegments.length - 1),
pathLast: pathSegments[pathSegments.length - 1],
generics: generics,
- });
- parserState.totalElems += 1;
+ };
}
/**
@@ -300,12 +303,14 @@ window.initSearch = function(rawSearchIndex) {
if (start >= end && generics.length === 0) {
return;
}
- createQueryElement(
- query,
- parserState,
- elems,
- parserState.userQuery.slice(start, end),
- generics);
+ elems.push(
+ createQueryElement(
+ query,
+ parserState,
+ parserState.userQuery.slice(start, end),
+ generics
+ )
+ );
}
/**
@@ -372,8 +377,11 @@ window.initSearch = function(rawSearchIndex) {
if (c === "," || c === " ") {
parserState.pos += 1;
continue;
- } else if (c === "-" && isReturnArrow(parserState)) {
- break;
+ } else if (c === "-" || c === ">") {
+ if (isReturnArrow(parserState)) {
+ break;
+ }
+ throw new Error(`Unexpected \`${c}\` (did you mean \`->\`?)`);
}
} else if (c === ":" &&
parserState.typeFilter === null &&
@@ -424,6 +432,7 @@ window.initSearch = function(rawSearchIndex) {
* Takes the user search input and returns an empty `ParsedQuery`.
*
* @param {string} userQuery
+ *
* @return {ParsedQuery}
*/
function newParsedQuery(userQuery) {
@@ -445,6 +454,7 @@ window.initSearch = function(rawSearchIndex) {
*
* @param {string} search - The current search being performed.
* @param {string|null} filterCrates - The current filtering crate (if any).
+ *
* @return {string}
*/
function buildUrl(search, filterCrates) {
@@ -478,17 +488,20 @@ 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
- * nonempty-arg-list = arg *WS *(COMMA *WS arg)
- * nonempty-arg-list-without-generics = arg-without-generic *WS *(COMMA *WS arg-without-generic)
- * generics = OPEN-ANGLE-BRACKET *WS nonempty-arg-list-without-generics *WS CLOSE-ANGLE-BRACKET
+ * type-sep = COMMA/WS *(COMMA/WS)
+ * nonempty-arg-list = arg *(type-sep arg) *(COMMA/WS)
+ * nonempty-arg-list-without-generics = arg-without-generic *(type-sep arg-without-generic)
+ * *(COMMA/WS)
+ * generics = OPEN-ANGLE-BRACKET *WS [ nonempty-arg-list-without-generics ] *WS
+ * CLOSE-ANGLE-BRACKET
* return-args = RETURN-ARROW *WS nonempty-arg-list
*
* exact-search = [type-filter *WS COLON] *WS QUOTE ident QUOTE *WS [generics]
- * type-search = [type-filter *WS COLON] *WS path *WS generics
+ * type-search = [type-filter *WS COLON] *WS path *WS nonempty-arg-list
*
* query = *WS (exact-search / type-search / return-args) *WS
*
@@ -533,6 +546,7 @@ window.initSearch = function(rawSearchIndex) {
* WS = %x09 / " "
*
* @param {string} val - The user query
+ *
* @return {ParsedQuery} - The parsed query
*/
function parseQuery(userQuery) {
@@ -567,7 +581,7 @@ window.initSearch = function(rawSearchIndex) {
query.foundElems = query.elems.length + query.returned.length;
if (query.foundElems === 0 && parserState.length !== 0) {
// In this case, we'll simply keep whatever was entered by the user...
- createQueryElement(query, parserState, query.elems, userQuery, []);
+ query.elems.push(createQueryElement(query, parserState, userQuery, []));
query.foundElems += 1;
}
return query;
@@ -580,6 +594,7 @@ window.initSearch = function(rawSearchIndex) {
* @param {Array ',
+ '-> ',
'<"P">',
'"P" "P"',
'P "P"',
@@ -16,9 +18,29 @@ const QUERY = [
"a b:",
"a (b:",
"{:",
+ "a-bb",
+ "a>bb",
];
const PARSED = [
+ {
+ elems: [],
+ foundElems: 0,
+ original: " ",
+ returned: [],
+ typeFilter: -1,
+ userQuery: " ",
+ error: "Found generics without a path",
+ },
+ {
+ elems: [],
+ foundElems: 0,
+ original: "-> ",
+ returned: [],
+ typeFilter: -1,
+ userQuery: "-> ",
+ error: "Found generics without a path",
+ },
{
elems: [],
foundElems: 0,
@@ -172,4 +194,22 @@ const PARSED = [
userQuery: "{:",
error: "Unknown type filter `{`",
},
+ {
+ elems: [],
+ foundElems: 0,
+ original: "a-bb",
+ returned: [],
+ typeFilter: -1,
+ userQuery: "a-bb",
+ error: "Unexpected `-` (did you mean `->`?)",
+ },
+ {
+ elems: [],
+ foundElems: 0,
+ original: "a>bb",
+ returned: [],
+ typeFilter: -1,
+ userQuery: "a>bb",
+ error: "Unexpected `>` (did you mean `->`?)",
+ },
];
diff --git a/src/test/rustdoc-js-std/parser-generics.js b/src/test/rustdoc-js-std/parser-generics.js
index cf8d99ef22a4..cc92f2333d2a 100644
--- a/src/test/rustdoc-js-std/parser-generics.js
+++ b/src/test/rustdoc-js-std/parser-generics.js
@@ -1,29 +1,6 @@
-const QUERY = [' ', 'A, E>', 'p<> u8'];
+const QUERY = ['A, E>', 'p<> u8'];
const PARSED = [
- {
- elems: [{
- name: "",
- fullPath: [""],
- pathWithoutLast: [],
- pathLast: "",
- generics: [
- {
- name: "p",
- fullPath: ["p"],
- pathWithoutLast: [],
- pathLast: "p",
- generics: [],
- },
- ],
- }],
- foundElems: 1,
- original: " ",
- returned: [],
- typeFilter: -1,
- userQuery: " ",
- error: null,
- },
{
elems: [],
foundElems: 0,
diff --git a/src/test/rustdoc-js-std/parser-returned.js b/src/test/rustdoc-js-std/parser-returned.js
index db64b03c0b3a..8910275c91e3 100644
--- a/src/test/rustdoc-js-std/parser-returned.js
+++ b/src/test/rustdoc-js-std/parser-returned.js
@@ -1,15 +1,15 @@
-const QUERY = ['-> ', '-> P'];
+const QUERY = ['-> F ', '-> P'];
const PARSED = [
{
elems: [],
foundElems: 1,
- original: "-> ",
+ original: "-> F ",
returned: [{
- name: "",
- fullPath: [""],
+ name: "f",
+ fullPath: ["f"],
pathWithoutLast: [],
- pathLast: "",
+ pathLast: "f",
generics: [
{
name: "p",
@@ -21,7 +21,7 @@ const PARSED = [
],
}],
typeFilter: -1,
- userQuery: "-> ",
+ userQuery: "-> f ",
error: null,
},
{
diff --git a/src/test/rustdoc-js-std/parser-invalid.js b/src/test/rustdoc-js-std/parser-weird-queries.js
similarity index 100%
rename from src/test/rustdoc-js-std/parser-invalid.js
rename to src/test/rustdoc-js-std/parser-weird-queries.js