`, there is no name but it remains valid.
if (pathSegments.length === 0) {
pathSegments = [""];
@@ -272,7 +264,6 @@ window.initSearch = function(rawSearchIndex) {
start += 1;
getStringElem(query, parserState, isInGenerics);
end = parserState.pos - 1;
- skipWhitespaces(parserState);
} else {
while (parserState.pos < parserState.length) {
var c = parserState.userQuery[parserState.pos];
@@ -289,7 +280,6 @@ window.initSearch = function(rawSearchIndex) {
}
parserState.pos += 1;
end = parserState.pos;
- skipWhitespaces(parserState);
}
}
if (parserState.pos < parserState.length &&
@@ -317,22 +307,36 @@ window.initSearch = function(rawSearchIndex) {
* character.
*/
function getItemsBefore(query, parserState, elems, limit) {
+ var turns = 0;
while (parserState.pos < parserState.length) {
var c = parserState.userQuery[parserState.pos];
if (c === limit) {
break;
- } else if (c === '(' || c === ":") {
- // Something weird is going on in here. Ignoring it!
+ } else if (c === "," && limit !== "" && turns > 0) {
parserState.pos += 1;
continue;
+ } else if (c === ":" && isPathStart(parserState)) {
+ throw new Error("Unexpected `::`: paths cannot start with `::`");
+ } else if (c === "(" || c === ":" || isEndCharacter(c)) {
+ var extra = "";
+ if (limit === ">") {
+ extra = "`<`";
+ } else if (limit === ")") {
+ extra = "`(`";
+ } else if (limit === "") {
+ extra = "`->`";
+ }
+ throw new Error("Unexpected `" + c + "` after " + extra);
}
var posBefore = parserState.pos;
getNextElem(query, parserState, elems, limit === ">");
+ turns += 1;
if (posBefore === parserState.pos) {
parserState.pos += 1;
}
}
- // We skip the "limit".
+ // We are either at the end of the string or on the "limit" character, let's move forward
+ // in any case.
parserState.pos += 1;
}
@@ -356,9 +360,13 @@ window.initSearch = function(rawSearchIndex) {
break;
} else if (c === ":" &&
parserState.typeFilter === null &&
- !isPathStart(parserState) &&
- query.elems.length === 1)
+ !isPathStart(parserState))
{
+ if (query.elems.length === 0) {
+ throw new Error("Expected type filter before `:`");
+ } else if (query.elems.length !== 1 || parserState.totalElems !== 1) {
+ throw new Error("Unexpected `:`");
+ }
if (query.literalSearch) {
throw new Error("You cannot use quotes on type filter");
}
@@ -531,6 +539,10 @@ window.initSearch = function(rawSearchIndex) {
try {
parseInput(query, parserState);
+ if (parserState.typeFilter !== null) {
+ var typeFilter = parserState.typeFilter.replace(/^const$/, "constant");
+ query.typeFilter = itemTypeFromName(typeFilter);
+ }
} catch (err) {
query = newParsedQuery(userQuery);
query.error = err.message;
@@ -548,10 +560,6 @@ window.initSearch = function(rawSearchIndex) {
createQueryElement(query, parserState, query.elems, userQuery, []);
query.foundElems += 1;
}
- if (parserState.typeFilter !== null) {
- var typeFilter = parserState.typeFilter.replace(/^const$/, "constant");
- query.typeFilter = itemTypeFromName(typeFilter);
- }
return query;
}
@@ -582,9 +590,6 @@ window.initSearch = function(rawSearchIndex) {
* @return {ResultsTable}
*/
function execQuery(parsedQuery, searchWords, filterCrates) {
- if (parsedQuery.error !== null) {
- createQueryResults([], [], [], parsedQuery);
- }
var results_others = {}, results_in_args = {}, results_returned = {};
function transformResults(results) {
@@ -1267,7 +1272,10 @@ window.initSearch = function(rawSearchIndex) {
}
}
}
- innerRunQuery();
+
+ if (parsedQuery.error === null) {
+ innerRunQuery();
+ }
var ret = createQueryResults(
sortResults(results_in_args, true),
@@ -1275,6 +1283,10 @@ window.initSearch = function(rawSearchIndex) {
sortResults(results_others, false),
parsedQuery);
handleAliases(ret, parsedQuery.original.replace(/"/g, ""), filterCrates);
+ if (parsedQuery.error !== null && ret.others.length !== 0) {
+ // It means some doc aliases were found so let's "remove" the error!
+ ret.query.error = null;
+ }
return ret;
}
@@ -1413,7 +1425,7 @@ window.initSearch = function(rawSearchIndex) {
var output = document.createElement("div");
var length = 0;
- if (array.length > 0 && query.error === null) {
+ if (array.length > 0) {
output.className = "search-results " + extraClass;
array.forEach(function(item) {
@@ -1466,10 +1478,7 @@ window.initSearch = function(rawSearchIndex) {
link.appendChild(wrapper);
output.appendChild(link);
});
- } else if (query.error !== null) {
- output.className = "search-failed" + extraClass;
- output.innerHTML = "Syntax error: " + query.error;
- } else {
+ } else if (query.error === null) {
output.className = "search-failed" + extraClass;
output.innerHTML = "No results :( ', 'A, E>', 'p<> u8'];
+const QUERY = [' ', 'A, E>', 'p<> u8'];
const PARSED = [
{
@@ -66,10 +66,10 @@ const PARSED = [
],
}],
foundElems: 1,
- original: 'A, E>',
+ original: 'A, E>',
returned: [],
typeFilter: -1,
- userQuery: 'a, e>',
+ userQuery: 'a, e>',
error: null,
},
{
diff --git a/src/test/rustdoc-js-std/parser-invalid.js b/src/test/rustdoc-js-std/parser-invalid.js
index 5e7be3c73b0..024372ef8d5 100644
--- a/src/test/rustdoc-js-std/parser-invalid.js
+++ b/src/test/rustdoc-js-std/parser-invalid.js
@@ -1,83 +1,57 @@
// This test is mostly to check that the parser still kinda outputs something
// (and doesn't enter an infinite loop!) even though the query is completely
// invalid.
-const QUERY = ['-> (p2)', '(p -> p2', 'a b', 'a,b(c)'];
+const QUERY = ['a b', 'a b', 'a,b(c)'];
const PARSED = [
{
args: [],
- elems: [],
- foundElems: 2,
- original: "-> (p2)",
- returned: [
+ elems: [
{
- name: "",
- fullPath: [""],
+ name: "a",
+ fullPath: ["a"],
pathWithoutLast: [],
- pathLast: "",
- generics: [
- {
- name: "p",
- fullPath: ["p"],
- pathWithoutLast: [],
- pathLast: "p",
- generics: [],
- },
- ],
+ pathLast: "a",
+ generics: [],
},
{
- name: "p2",
- fullPath: ["p2"],
+ name: "b",
+ fullPath: ["b"],
pathWithoutLast: [],
- pathLast: "p2",
+ pathLast: "b",
generics: [],
},
],
- typeFilter: -1,
- userQuery: "-> (p2)",
- error: null,
- },
- {
- args: [
- {
- name: "p",
- fullPath: ["p"],
- pathWithoutLast: [],
- pathLast: "p",
- generics: [],
- },
- {
- name: "p2",
- fullPath: ["p2"],
- pathWithoutLast: [],
- pathLast: "p2",
- generics: [],
- },
- ],
- elems: [],
foundElems: 2,
- original: "(p -> p2",
+ original: "a b",
returned: [],
typeFilter: -1,
- userQuery: "(p -> p2",
+ userQuery: "a b",
error: null,
},
{
args: [],
elems: [
{
- name: "a b",
- fullPath: ["a b"],
+ name: "a",
+ fullPath: ["a"],
pathWithoutLast: [],
- pathLast: "a b",
+ pathLast: "a",
+ generics: [],
+ },
+ {
+ name: "b",
+ fullPath: ["b"],
+ pathWithoutLast: [],
+ pathLast: "b",
generics: [],
},
],
- foundElems: 1,
- original: "a b",
+ foundElems: 2,
+ original: "a b",
returned: [],
typeFilter: -1,
- userQuery: "a b",
+ userQuery: "a b",
error: null,
},
{
diff --git a/src/test/rustdoc-js-std/parser-paths.js b/src/test/rustdoc-js-std/parser-paths.js
index 1bd3bb61dc9..12b7f922b14 100644
--- a/src/test/rustdoc-js-std/parser-paths.js
+++ b/src/test/rustdoc-js-std/parser-paths.js
@@ -1,4 +1,4 @@
-const QUERY = ['A::B', '::A::B', 'A::B::,C', 'A::B::
" +
"Try on `;
}
+
var typeFilter = "";
if (results.query.typeFilter !== NO_TYPE_FILTER) {
- typeFilter = " (type: " + escape(results.query.typeFilter) + ")";
+ typeFilter = " (type: " + escape(itemTypes[results.query.typeFilter]) + ")";
}
var output = `Results for ${escape(results.query.userQuery)}` +
- `${typeFilter}
in ${crates} Query parser error: "${results.query.error}".
`;
+ }
+ output += `