1
Fork 0

rustdoc: add support for type filters in arguments and generics

This makes sense, since the search index has the information in it,
and it's more useful for function signature searches since a
function signature search's item type is, by definition, some type
of function (there's more than one, but not very many).
This commit is contained in:
Michael Howell 2023-02-28 18:17:59 -07:00
parent 3ff4d56650
commit e600c0ba0e
15 changed files with 301 additions and 150 deletions

View file

@ -354,12 +354,15 @@ function initSearch(rawSearchIndex) {
if (isInGenerics) { if (isInGenerics) {
parserState.genericsElems += 1; parserState.genericsElems += 1;
} }
const typeFilter = parserState.typeFilter;
parserState.typeFilter = null;
return { return {
name: name, name: name,
fullPath: pathSegments, fullPath: pathSegments,
pathWithoutLast: pathSegments.slice(0, pathSegments.length - 1), pathWithoutLast: pathSegments.slice(0, pathSegments.length - 1),
pathLast: pathSegments[pathSegments.length - 1], pathLast: pathSegments[pathSegments.length - 1],
generics: generics, generics: generics,
typeFilter,
}; };
} }
@ -495,6 +498,11 @@ function initSearch(rawSearchIndex) {
*/ */
function getItemsBefore(query, parserState, elems, endChar) { function getItemsBefore(query, parserState, elems, endChar) {
let foundStopChar = true; let foundStopChar = true;
let start = parserState.pos;
// If this is a generic, keep the outer item's type filter around.
const oldTypeFilter = parserState.typeFilter;
parserState.typeFilter = null;
while (parserState.pos < parserState.length) { while (parserState.pos < parserState.length) {
const c = parserState.userQuery[parserState.pos]; const c = parserState.userQuery[parserState.pos];
@ -506,7 +514,25 @@ function initSearch(rawSearchIndex) {
continue; continue;
} else if (c === ":" && isPathStart(parserState)) { } else if (c === ":" && isPathStart(parserState)) {
throw ["Unexpected ", "::", ": paths cannot start with ", "::"]; throw ["Unexpected ", "::", ": paths cannot start with ", "::"];
} else if (c === ":" || isEndCharacter(c)) { } else if (c === ":") {
if (parserState.typeFilter !== null) {
throw ["Unexpected ", ":"];
}
if (elems.length === 0) {
throw ["Expected type filter before ", ":"];
} else if (query.literalSearch) {
throw ["You cannot use quotes on type filter"];
}
// The type filter doesn't count as an element since it's a modifier.
const typeFilterElem = elems.pop();
checkExtraTypeFilterCharacters(start, parserState);
parserState.typeFilter = typeFilterElem.name;
parserState.pos += 1;
parserState.totalElems -= 1;
query.literalSearch = false;
foundStopChar = true;
continue;
} else if (isEndCharacter(c)) {
let extra = ""; let extra = "";
if (endChar === ">") { if (endChar === ">") {
extra = "<"; extra = "<";
@ -540,16 +566,11 @@ function initSearch(rawSearchIndex) {
]; ];
} }
const posBefore = parserState.pos; const posBefore = parserState.pos;
start = parserState.pos;
getNextElem(query, parserState, elems, endChar === ">"); getNextElem(query, parserState, elems, endChar === ">");
if (endChar !== "") { if (endChar !== "" && parserState.pos >= parserState.length) {
if (parserState.pos >= parserState.length) {
throw ["Unclosed ", "<"]; 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 // 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 // from the start. For example if you have `,,` or `<>`. In this case, we simply move up
// the current position to continue the parsing. // the current position to continue the parsing.
@ -564,6 +585,8 @@ function initSearch(rawSearchIndex) {
// We are either at the end of the string or on the `endChar` character, let's move forward // We are either at the end of the string or on the `endChar` character, let's move forward
// in any case. // in any case.
parserState.pos += 1; parserState.pos += 1;
parserState.typeFilter = oldTypeFilter;
} }
/** /**
@ -572,10 +595,10 @@ function initSearch(rawSearchIndex) {
* *
* @param {ParserState} parserState * @param {ParserState} parserState
*/ */
function checkExtraTypeFilterCharacters(parserState) { function checkExtraTypeFilterCharacters(start, parserState) {
const query = parserState.userQuery; const query = parserState.userQuery;
for (let pos = 0; pos < parserState.pos; ++pos) { for (let pos = start; pos < parserState.pos; ++pos) {
if (!isIdentCharacter(query[pos]) && !isWhitespaceCharacter(query[pos])) { if (!isIdentCharacter(query[pos]) && !isWhitespaceCharacter(query[pos])) {
throw ["Unexpected ", query[pos], " in type filter"]; throw ["Unexpected ", query[pos], " in type filter"];
} }
@ -591,6 +614,7 @@ function initSearch(rawSearchIndex) {
*/ */
function parseInput(query, parserState) { function parseInput(query, parserState) {
let foundStopChar = true; let foundStopChar = true;
let start = parserState.pos;
while (parserState.pos < parserState.length) { while (parserState.pos < parserState.length) {
const c = parserState.userQuery[parserState.pos]; const c = parserState.userQuery[parserState.pos];
@ -612,16 +636,15 @@ function initSearch(rawSearchIndex) {
} }
if (query.elems.length === 0) { if (query.elems.length === 0) {
throw ["Expected type filter before ", ":"]; throw ["Expected type filter before ", ":"];
} else if (query.elems.length !== 1 || parserState.totalElems !== 1) {
throw ["Unexpected ", ":"];
} else if (query.literalSearch) { } else if (query.literalSearch) {
throw ["You cannot use quotes on type filter"]; throw ["You cannot use quotes on type filter"];
} }
checkExtraTypeFilterCharacters(parserState);
// The type filter doesn't count as an element since it's a modifier. // The type filter doesn't count as an element since it's a modifier.
parserState.typeFilter = query.elems.pop().name; const typeFilterElem = query.elems.pop();
checkExtraTypeFilterCharacters(start, parserState);
parserState.typeFilter = typeFilterElem.name;
parserState.pos += 1; parserState.pos += 1;
parserState.totalElems = 0; parserState.totalElems -= 1;
query.literalSearch = false; query.literalSearch = false;
foundStopChar = true; foundStopChar = true;
continue; continue;
@ -653,6 +676,7 @@ function initSearch(rawSearchIndex) {
]; ];
} }
const before = query.elems.length; const before = query.elems.length;
start = parserState.pos;
getNextElem(query, parserState, query.elems, false); getNextElem(query, parserState, query.elems, false);
if (query.elems.length === before) { if (query.elems.length === before) {
// Nothing was added, weird... Let's increase the position to not remain stuck. // Nothing was added, weird... Let's increase the position to not remain stuck.
@ -660,6 +684,9 @@ function initSearch(rawSearchIndex) {
} }
foundStopChar = false; foundStopChar = false;
} }
if (parserState.typeFilter !== null) {
throw ["Unexpected ", ":", " (expected path after type filter)"];
}
while (parserState.pos < parserState.length) { while (parserState.pos < parserState.length) {
if (isReturnArrow(parserState)) { if (isReturnArrow(parserState)) {
parserState.pos += 2; parserState.pos += 2;
@ -687,7 +714,6 @@ function initSearch(rawSearchIndex) {
return { return {
original: userQuery, original: userQuery,
userQuery: userQuery.toLowerCase(), userQuery: userQuery.toLowerCase(),
typeFilter: NO_TYPE_FILTER,
elems: [], elems: [],
returned: [], returned: [],
// Total number of "top" elements (does not include generics). // Total number of "top" elements (does not include generics).
@ -738,8 +764,8 @@ function initSearch(rawSearchIndex) {
* *
* ident = *(ALPHA / DIGIT / "_") * ident = *(ALPHA / DIGIT / "_")
* path = ident *(DOUBLE-COLON ident) [!] * path = ident *(DOUBLE-COLON ident) [!]
* arg = path [generics] * arg = [type-filter *WS COLON *WS] path [generics]
* arg-without-generic = path * arg-without-generic = [type-filter *WS COLON *WS] path
* type-sep = COMMA/WS *(COMMA/WS) * type-sep = COMMA/WS *(COMMA/WS)
* nonempty-arg-list = *(type-sep) arg *(type-sep arg) *(type-sep) * nonempty-arg-list = *(type-sep) arg *(type-sep arg) *(type-sep)
* nonempty-arg-list-without-generics = *(type-sep) arg-without-generic * nonempty-arg-list-without-generics = *(type-sep) arg-without-generic
@ -749,7 +775,7 @@ function initSearch(rawSearchIndex) {
* return-args = RETURN-ARROW *(type-sep) nonempty-arg-list * return-args = RETURN-ARROW *(type-sep) nonempty-arg-list
* *
* exact-search = [type-filter *WS COLON] [ RETURN-ARROW ] *WS QUOTE ident QUOTE [ generics ] * exact-search = [type-filter *WS COLON] [ RETURN-ARROW ] *WS QUOTE ident QUOTE [ generics ]
* type-search = [type-filter *WS COLON] [ nonempty-arg-list ] [ return-args ] * type-search = [ nonempty-arg-list ] [ return-args ]
* *
* query = *WS (exact-search / type-search) *WS * query = *WS (exact-search / type-search) *WS
* *
@ -798,6 +824,20 @@ function initSearch(rawSearchIndex) {
* @return {ParsedQuery} - The parsed query * @return {ParsedQuery} - The parsed query
*/ */
function parseQuery(userQuery) { function parseQuery(userQuery) {
function convertTypeFilterOnElem(elem) {
if (elem.typeFilter !== null) {
let typeFilter = elem.typeFilter;
if (typeFilter === "const") {
typeFilter = "constant";
}
elem.typeFilter = itemTypeFromName(typeFilter);
} else {
elem.typeFilter = NO_TYPE_FILTER;
}
for (const elem2 of elem.generics) {
convertTypeFilterOnElem(elem2);
}
}
userQuery = userQuery.trim(); userQuery = userQuery.trim();
const parserState = { const parserState = {
length: userQuery.length, length: userQuery.length,
@ -812,17 +852,15 @@ function initSearch(rawSearchIndex) {
try { try {
parseInput(query, parserState); parseInput(query, parserState);
if (parserState.typeFilter !== null) { for (const elem of query.elems) {
let typeFilter = parserState.typeFilter; convertTypeFilterOnElem(elem);
if (typeFilter === "const") {
typeFilter = "constant";
} }
query.typeFilter = itemTypeFromName(typeFilter); for (const elem of query.returned) {
convertTypeFilterOnElem(elem);
} }
} catch (err) { } catch (err) {
query = newParsedQuery(userQuery); query = newParsedQuery(userQuery);
query.error = err; query.error = err;
query.typeFilter = -1;
return query; return query;
} }
@ -1057,12 +1095,10 @@ function initSearch(rawSearchIndex) {
} }
// The names match, but we need to be sure that all generics kinda // The names match, but we need to be sure that all generics kinda
// match as well. // match as well.
let elem_name;
if (elem.generics.length > 0 && row.generics.length >= elem.generics.length) { if (elem.generics.length > 0 && row.generics.length >= elem.generics.length) {
const elems = Object.create(null); const elems = Object.create(null);
for (const entry of row.generics) { for (const entry of row.generics) {
elem_name = entry.name; if (entry.name === "") {
if (elem_name === "") {
// Pure generic, needs to check into it. // Pure generic, needs to check into it.
if (checkGenerics(entry, elem, maxEditDistance + 1, maxEditDistance) if (checkGenerics(entry, elem, maxEditDistance + 1, maxEditDistance)
!== 0) { !== 0) {
@ -1070,19 +1106,19 @@ function initSearch(rawSearchIndex) {
} }
continue; continue;
} }
if (elems[elem_name] === undefined) { if (elems[entry.name] === undefined) {
elems[elem_name] = 0; elems[entry.name] = [];
} }
elems[elem_name] += 1; elems[entry.name].push(entry.ty);
} }
// We need to find the type that matches the most to remove it in order // We need to find the type that matches the most to remove it in order
// to move forward. // to move forward.
for (const generic of elem.generics) { const handleGeneric = generic => {
let match = null; let match = null;
if (elems[generic.name]) { if (elems[generic.name]) {
match = generic.name; match = generic.name;
} else { } else {
for (elem_name in elems) { for (const elem_name in elems) {
if (!hasOwnPropertyRustdoc(elems, elem_name)) { if (!hasOwnPropertyRustdoc(elems, elem_name)) {
continue; continue;
} }
@ -1093,11 +1129,31 @@ function initSearch(rawSearchIndex) {
} }
} }
if (match === null) { if (match === null) {
return false;
}
const matchIdx = elems[match].findIndex(tmp_elem =>
typePassesFilter(generic.typeFilter, tmp_elem));
if (matchIdx === -1) {
return false;
}
elems[match].splice(matchIdx, 1);
if (elems[match].length === 0) {
delete elems[match];
}
return true;
};
// To do the right thing with type filters, we first process generics
// that have them, removing matching ones from the "bag," then do the
// ones with no type filter, which can match any entry regardless of its
// own type.
for (const generic of elem.generics) {
if (generic.typeFilter !== -1 && !handleGeneric(generic)) {
return maxEditDistance + 1; return maxEditDistance + 1;
} }
elems[match] -= 1; }
if (elems[match] === 0) { for (const generic of elem.generics) {
delete elems[match]; if (generic.typeFilter === -1 && !handleGeneric(generic)) {
return maxEditDistance + 1;
} }
} }
return 0; return 0;
@ -1145,14 +1201,20 @@ function initSearch(rawSearchIndex) {
return maxEditDistance + 1; return maxEditDistance + 1;
} }
let dist = editDistance(row.name, elem.name, maxEditDistance); let dist;
if (typePassesFilter(elem.typeFilter, row.ty)) {
dist = editDistance(row.name, elem.name, maxEditDistance);
} else {
dist = maxEditDistance + 1;
}
if (literalSearch) { if (literalSearch) {
if (dist !== 0) { if (dist !== 0) {
// The name didn't match, let's try to check if the generics do. // The name didn't match, let's try to check if the generics do.
if (elem.generics.length === 0) { if (elem.generics.length === 0) {
const checkGeneric = row.generics.length > 0; const checkGeneric = row.generics.length > 0;
if (checkGeneric && row.generics if (checkGeneric && row.generics
.findIndex(tmp_elem => tmp_elem.name === elem.name) !== -1) { .findIndex(tmp_elem => tmp_elem.name === elem.name &&
typePassesFilter(elem.typeFilter, tmp_elem.ty)) !== -1) {
return 0; return 0;
} }
} }
@ -1201,22 +1263,21 @@ function initSearch(rawSearchIndex) {
* *
* @param {Row} row * @param {Row} row
* @param {QueryElement} elem - The element from the parsed query. * @param {QueryElement} elem - The element from the parsed query.
* @param {integer} typeFilter * @param {integer} maxEditDistance
* @param {Array<integer>} skipPositions - Do not return one of these positions. * @param {Array<integer>} skipPositions - Do not return one of these positions.
* *
* @return {dist: integer, position: integer} - Returns an edit distance to the best match. * @return {dist: integer, position: integer} - Returns an edit distance to the best match.
* If there is no match, returns * If there is no match, returns
* `maxEditDistance + 1` and position: -1. * `maxEditDistance + 1` and position: -1.
*/ */
function findArg(row, elem, typeFilter, maxEditDistance, skipPositions) { function findArg(row, elem, maxEditDistance, skipPositions) {
let dist = maxEditDistance + 1; let dist = maxEditDistance + 1;
let position = -1; let position = -1;
if (row && row.type && row.type.inputs && row.type.inputs.length > 0) { if (row && row.type && row.type.inputs && row.type.inputs.length > 0) {
let i = 0; let i = 0;
for (const input of row.type.inputs) { for (const input of row.type.inputs) {
if (!typePassesFilter(typeFilter, input.ty) || if (skipPositions.indexOf(i) !== -1) {
skipPositions.indexOf(i) !== -1) {
i += 1; i += 1;
continue; continue;
} }
@ -1245,14 +1306,14 @@ function initSearch(rawSearchIndex) {
* *
* @param {Row} row * @param {Row} row
* @param {QueryElement} elem - The element from the parsed query. * @param {QueryElement} elem - The element from the parsed query.
* @param {integer} typeFilter * @param {integer} maxEditDistance
* @param {Array<integer>} skipPositions - Do not return one of these positions. * @param {Array<integer>} skipPositions - Do not return one of these positions.
* *
* @return {dist: integer, position: integer} - Returns an edit distance to the best match. * @return {dist: integer, position: integer} - Returns an edit distance to the best match.
* If there is no match, returns * If there is no match, returns
* `maxEditDistance + 1` and position: -1. * `maxEditDistance + 1` and position: -1.
*/ */
function checkReturned(row, elem, typeFilter, maxEditDistance, skipPositions) { function checkReturned(row, elem, maxEditDistance, skipPositions) {
let dist = maxEditDistance + 1; let dist = maxEditDistance + 1;
let position = -1; let position = -1;
@ -1260,8 +1321,7 @@ function initSearch(rawSearchIndex) {
const ret = row.type.output; const ret = row.type.output;
let i = 0; let i = 0;
for (const ret_ty of ret) { for (const ret_ty of ret) {
if (!typePassesFilter(typeFilter, ret_ty.ty) || if (skipPositions.indexOf(i) !== -1) {
skipPositions.indexOf(i) !== -1) {
i += 1; i += 1;
continue; continue;
} }
@ -1483,15 +1543,15 @@ function initSearch(rawSearchIndex) {
const fullId = row.id; const fullId = row.id;
const searchWord = searchWords[pos]; const searchWord = searchWords[pos];
const in_args = findArg(row, elem, parsedQuery.typeFilter, maxEditDistance, []); const in_args = findArg(row, elem, maxEditDistance, []);
const returned = checkReturned(row, elem, parsedQuery.typeFilter, maxEditDistance, []); const returned = checkReturned(row, elem, maxEditDistance, []);
// path_dist is 0 because no parent path information is currently stored // path_dist is 0 because no parent path information is currently stored
// in the search index // in the search index
addIntoResults(results_in_args, fullId, pos, -1, in_args.dist, 0, maxEditDistance); addIntoResults(results_in_args, fullId, pos, -1, in_args.dist, 0, maxEditDistance);
addIntoResults(results_returned, fullId, pos, -1, returned.dist, 0, maxEditDistance); addIntoResults(results_returned, fullId, pos, -1, returned.dist, 0, maxEditDistance);
if (!typePassesFilter(parsedQuery.typeFilter, row.ty)) { if (!typePassesFilter(elem.typeFilter, row.ty)) {
return; return;
} }
@ -1568,7 +1628,6 @@ function initSearch(rawSearchIndex) {
const { dist, position } = callback( const { dist, position } = callback(
row, row,
elem, elem,
NO_TYPE_FILTER,
maxEditDistance, maxEditDistance,
skipPositions skipPositions
); );
@ -1632,7 +1691,6 @@ function initSearch(rawSearchIndex) {
in_returned = checkReturned( in_returned = checkReturned(
row, row,
elem, elem,
parsedQuery.typeFilter,
maxEditDistance, maxEditDistance,
[] []
); );

View file

@ -79,11 +79,18 @@ function checkNeededFields(fullPath, expected, error_text, queryName, position)
"foundElems", "foundElems",
"original", "original",
"returned", "returned",
"typeFilter",
"userQuery", "userQuery",
"error", "error",
]; ];
} else if (fullPath.endsWith("elems") || fullPath.endsWith("generics")) { } else if (fullPath.endsWith("elems") || fullPath.endsWith("returned")) {
fieldsToCheck = [
"name",
"fullPath",
"pathWithoutLast",
"pathLast",
"generics",
];
} else if (fullPath.endsWith("generics")) {
fieldsToCheck = [ fieldsToCheck = [
"name", "name",
"fullPath", "fullPath",

View file

@ -17,6 +17,7 @@ const QUERY = [
"a b:", "a b:",
"a (b:", "a (b:",
"_:", "_:",
"_:a",
"a-bb", "a-bb",
"a>bb", "a>bb",
"ab'", "ab'",
@ -48,7 +49,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "<P>", original: "<P>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "<p>", userQuery: "<p>",
error: "Found generics without a path", error: "Found generics without a path",
}, },
@ -57,7 +57,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "-> <P>", original: "-> <P>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "-> <p>", userQuery: "-> <p>",
error: "Found generics without a path", error: "Found generics without a path",
}, },
@ -66,7 +65,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a<\"P\">", original: "a<\"P\">",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<\"p\">", userQuery: "a<\"p\">",
error: "Unexpected `\"` in generics", error: "Unexpected `\"` in generics",
}, },
@ -75,7 +73,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "\"P\" \"P\"", original: "\"P\" \"P\"",
returned: [], returned: [],
typeFilter: -1,
userQuery: "\"p\" \"p\"", userQuery: "\"p\" \"p\"",
error: "Cannot have more than one literal search element", error: "Cannot have more than one literal search element",
}, },
@ -84,7 +81,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "P \"P\"", original: "P \"P\"",
returned: [], returned: [],
typeFilter: -1,
userQuery: "p \"p\"", userQuery: "p \"p\"",
error: "Cannot use literal search when there is more than one element", error: "Cannot use literal search when there is more than one element",
}, },
@ -93,7 +89,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "\"p\" p", original: "\"p\" p",
returned: [], returned: [],
typeFilter: -1,
userQuery: "\"p\" p", userQuery: "\"p\" p",
error: "You cannot have more than one element if you use quotes", error: "You cannot have more than one element if you use quotes",
}, },
@ -102,7 +97,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "\"const\": p", original: "\"const\": p",
returned: [], returned: [],
typeFilter: -1,
userQuery: "\"const\": p", userQuery: "\"const\": p",
error: "You cannot use quotes on type filter", error: "You cannot use quotes on type filter",
}, },
@ -111,16 +105,14 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a<:a>", original: "a<:a>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<:a>", userQuery: "a<:a>",
error: "Unexpected `:` after `<`", error: "Expected type filter before `:`",
}, },
{ {
elems: [], elems: [],
foundElems: 0, foundElems: 0,
original: "a<::a>", original: "a<::a>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<::a>", userQuery: "a<::a>",
error: "Unexpected `::`: paths cannot start with `::`", error: "Unexpected `::`: paths cannot start with `::`",
}, },
@ -129,7 +121,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "((a))", original: "((a))",
returned: [], returned: [],
typeFilter: -1,
userQuery: "((a))", userQuery: "((a))",
error: "Unexpected `(`", error: "Unexpected `(`",
}, },
@ -138,7 +129,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "(p -> p", original: "(p -> p",
returned: [], returned: [],
typeFilter: -1,
userQuery: "(p -> p", userQuery: "(p -> p",
error: "Unexpected `(`", error: "Unexpected `(`",
}, },
@ -147,7 +137,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "::a::b", original: "::a::b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "::a::b", userQuery: "::a::b",
error: "Paths cannot start with `::`", error: "Paths cannot start with `::`",
}, },
@ -156,7 +145,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a::::b", original: "a::::b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a::::b", userQuery: "a::::b",
error: "Unexpected `::::`", error: "Unexpected `::::`",
}, },
@ -165,7 +153,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a::b::", original: "a::b::",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a::b::", userQuery: "a::b::",
error: "Paths cannot end with `::`", error: "Paths cannot end with `::`",
}, },
@ -174,7 +161,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: ":a", original: ":a",
returned: [], returned: [],
typeFilter: -1,
userQuery: ":a", userQuery: ":a",
error: "Expected type filter before `:`", error: "Expected type filter before `:`",
}, },
@ -183,16 +169,14 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a b:", original: "a b:",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a b:", userQuery: "a b:",
error: "Unexpected `:`", error: "Unexpected `:` (expected path after type filter)",
}, },
{ {
elems: [], elems: [],
foundElems: 0, foundElems: 0,
original: "a (b:", original: "a (b:",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a (b:", userQuery: "a (b:",
error: "Unexpected `(`", error: "Unexpected `(`",
}, },
@ -201,8 +185,15 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "_:", original: "_:",
returned: [], returned: [],
typeFilter: -1,
userQuery: "_:", userQuery: "_:",
error: "Unexpected `:` (expected path after type filter)",
},
{
elems: [],
foundElems: 0,
original: "_:a",
returned: [],
userQuery: "_:a",
error: "Unknown type filter `_`", error: "Unknown type filter `_`",
}, },
{ {
@ -210,7 +201,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a-bb", original: "a-bb",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a-bb", userQuery: "a-bb",
error: "Unexpected `-` (did you mean `->`?)", error: "Unexpected `-` (did you mean `->`?)",
}, },
@ -219,7 +209,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a>bb", original: "a>bb",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a>bb", userQuery: "a>bb",
error: "Unexpected `>` (did you mean `->`?)", error: "Unexpected `>` (did you mean `->`?)",
}, },
@ -228,7 +217,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "ab'", original: "ab'",
returned: [], returned: [],
typeFilter: -1,
userQuery: "ab'", userQuery: "ab'",
error: "Unexpected `'`", error: "Unexpected `'`",
}, },
@ -237,7 +225,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a->", original: "a->",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a->", userQuery: "a->",
error: "Expected at least one item after `->`", error: "Expected at least one item after `->`",
}, },
@ -246,7 +233,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '"p" <a>', original: '"p" <a>',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"p" <a>', userQuery: '"p" <a>',
error: "Found generics without a path", error: "Found generics without a path",
}, },
@ -255,7 +241,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '"p" a<a>', original: '"p" a<a>',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"p" a<a>', userQuery: '"p" a<a>',
error: "You cannot have more than one element if you use quotes", error: "You cannot have more than one element if you use quotes",
}, },
@ -264,7 +249,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'a,<', original: 'a,<',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a,<', userQuery: 'a,<',
error: 'Found generics without a path', error: 'Found generics without a path',
}, },
@ -273,7 +257,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'aaaaa<>b', original: 'aaaaa<>b',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'aaaaa<>b', userQuery: 'aaaaa<>b',
error: 'Expected `,`, ` `, `:` or `->`, found `b`', error: 'Expected `,`, ` `, `:` or `->`, found `b`',
}, },
@ -282,16 +265,14 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'fn:aaaaa<>b', original: 'fn:aaaaa<>b',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'fn:aaaaa<>b', userQuery: 'fn:aaaaa<>b',
error: 'Expected `,`, ` ` or `->`, found `b`', error: 'Expected `,`, ` `, `:` or `->`, found `b`',
}, },
{ {
elems: [], elems: [],
foundElems: 0, foundElems: 0,
original: '->a<>b', original: '->a<>b',
returned: [], returned: [],
typeFilter: -1,
userQuery: '->a<>b', userQuery: '->a<>b',
error: 'Expected `,` or ` `, found `b`', error: 'Expected `,` or ` `, found `b`',
}, },
@ -300,7 +281,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'a<->', original: 'a<->',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a<->', userQuery: 'a<->',
error: 'Unexpected `-` after `<`', error: 'Unexpected `-` after `<`',
}, },
@ -309,7 +289,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'a:: a', original: 'a:: a',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a:: a', userQuery: 'a:: a',
error: 'Paths cannot end with `::`', error: 'Paths cannot end with `::`',
}, },
@ -318,7 +297,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'a ::a', original: 'a ::a',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a ::a', userQuery: 'a ::a',
error: 'Paths cannot start with `::`', error: 'Paths cannot start with `::`',
}, },
@ -327,16 +305,14 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a<a>:", original: "a<a>:",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<a>:", userQuery: "a<a>:",
error: 'Unexpected `:`', error: 'Unexpected `<` in type filter',
}, },
{ {
elems: [], elems: [],
foundElems: 0, foundElems: 0,
original: "a<>:", original: "a<>:",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<>:", userQuery: "a<>:",
error: 'Unexpected `<` in type filter', error: 'Unexpected `<` in type filter',
}, },
@ -345,7 +321,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a,:", original: "a,:",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a,:", userQuery: "a,:",
error: 'Unexpected `,` in type filter', error: 'Unexpected `,` in type filter',
}, },
@ -354,7 +329,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a<> :", original: "a<> :",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<> :", userQuery: "a<> :",
error: 'Unexpected `<` in type filter', error: 'Unexpected `<` in type filter',
}, },
@ -363,7 +337,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "mod : :", original: "mod : :",
returned: [], returned: [],
typeFilter: -1,
userQuery: "mod : :", userQuery: "mod : :",
error: 'Unexpected `:`', error: 'Unexpected `:`',
}, },
@ -372,7 +345,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a!a", original: "a!a",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a!a", userQuery: "a!a",
error: 'Unexpected `!`: it can only be at the end of an ident', error: 'Unexpected `!`: it can only be at the end of an ident',
}, },
@ -381,7 +353,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a!!", original: "a!!",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a!!", userQuery: "a!!",
error: 'Cannot have more than one `!` in an ident', error: 'Cannot have more than one `!` in an ident',
}, },
@ -390,7 +361,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "mod:a!", original: "mod:a!",
returned: [], returned: [],
typeFilter: -1,
userQuery: "mod:a!", userQuery: "mod:a!",
error: 'Invalid search type: macro `!` and `mod` both specified', error: 'Invalid search type: macro `!` and `mod` both specified',
}, },
@ -399,7 +369,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a!::a", original: "a!::a",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a!::a", userQuery: "a!::a",
error: 'Cannot have associated items in macros', error: 'Cannot have associated items in macros',
}, },
@ -408,7 +377,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a<", original: "a<",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<", userQuery: "a<",
error: "Unclosed `<`", error: "Unclosed `<`",
}, },

View file

@ -1,4 +1,14 @@
const QUERY = ['fn:foo', 'enum : foo', 'macro<f>:foo', 'macro!', 'macro:mac!', 'a::mac!']; const QUERY = [
'fn:foo',
'enum : foo',
'macro<f>:foo',
'macro!',
'macro:mac!',
'a::mac!',
'-> fn:foo',
'-> fn:foo<fn:bar>',
'-> fn:foo<fn:bar, enum : baz::fuzz>',
];
const PARSED = [ const PARSED = [
{ {
@ -8,11 +18,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "foo", pathLast: "foo",
generics: [], generics: [],
typeFilter: 5,
}], }],
foundElems: 1, foundElems: 1,
original: "fn:foo", original: "fn:foo",
returned: [], returned: [],
typeFilter: 5,
userQuery: "fn:foo", userQuery: "fn:foo",
error: null, error: null,
}, },
@ -23,11 +33,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "foo", pathLast: "foo",
generics: [], generics: [],
typeFilter: 4,
}], }],
foundElems: 1, foundElems: 1,
original: "enum : foo", original: "enum : foo",
returned: [], returned: [],
typeFilter: 4,
userQuery: "enum : foo", userQuery: "enum : foo",
error: null, error: null,
}, },
@ -36,9 +46,8 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "macro<f>:foo", original: "macro<f>:foo",
returned: [], returned: [],
typeFilter: -1,
userQuery: "macro<f>:foo", userQuery: "macro<f>:foo",
error: "Unexpected `:`", error: "Unexpected `<` in type filter",
}, },
{ {
elems: [{ elems: [{
@ -47,11 +56,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "macro", pathLast: "macro",
generics: [], generics: [],
typeFilter: 14,
}], }],
foundElems: 1, foundElems: 1,
original: "macro!", original: "macro!",
returned: [], returned: [],
typeFilter: 14,
userQuery: "macro!", userQuery: "macro!",
error: null, error: null,
}, },
@ -62,11 +71,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "mac", pathLast: "mac",
generics: [], generics: [],
typeFilter: 14,
}], }],
foundElems: 1, foundElems: 1,
original: "macro:mac!", original: "macro:mac!",
returned: [], returned: [],
typeFilter: 14,
userQuery: "macro:mac!", userQuery: "macro:mac!",
error: null, error: null,
}, },
@ -77,12 +86,83 @@ const PARSED = [
pathWithoutLast: ["a"], pathWithoutLast: ["a"],
pathLast: "mac", pathLast: "mac",
generics: [], generics: [],
typeFilter: 14,
}], }],
foundElems: 1, foundElems: 1,
original: "a::mac!", original: "a::mac!",
returned: [], returned: [],
typeFilter: 14,
userQuery: "a::mac!", userQuery: "a::mac!",
error: null, error: null,
}, },
{
elems: [],
foundElems: 1,
original: "-> fn:foo",
returned: [{
name: "foo",
fullPath: ["foo"],
pathWithoutLast: [],
pathLast: "foo",
generics: [],
typeFilter: 5,
}],
userQuery: "-> fn:foo",
error: null,
},
{
elems: [],
foundElems: 1,
original: "-> fn:foo<fn:bar>",
returned: [{
name: "foo",
fullPath: ["foo"],
pathWithoutLast: [],
pathLast: "foo",
generics: [
{
name: "bar",
fullPath: ["bar"],
pathWithoutLast: [],
pathLast: "bar",
generics: [],
typeFilter: 5,
}
],
typeFilter: 5,
}],
userQuery: "-> fn:foo<fn:bar>",
error: null,
},
{
elems: [],
foundElems: 1,
original: "-> fn:foo<fn:bar, enum : baz::fuzz>",
returned: [{
name: "foo",
fullPath: ["foo"],
pathWithoutLast: [],
pathLast: "foo",
generics: [
{
name: "bar",
fullPath: ["bar"],
pathWithoutLast: [],
pathLast: "bar",
generics: [],
typeFilter: 5,
},
{
name: "baz::fuzz",
fullPath: ["baz", "fuzz"],
pathWithoutLast: ["baz"],
pathLast: "fuzz",
generics: [],
typeFilter: 4,
},
],
typeFilter: 5,
}],
userQuery: "-> fn:foo<fn:bar, enum : baz::fuzz>",
error: null,
},
]; ];

View file

@ -6,7 +6,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'A<B<C<D>, E>', original: 'A<B<C<D>, E>',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a<b<c<d>, e>', userQuery: 'a<b<c<d>, e>',
error: 'Unexpected `<` after `<`', error: 'Unexpected `<` after `<`',
}, },
@ -18,6 +17,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "p", pathLast: "p",
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: "u8", name: "u8",
@ -25,12 +25,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "u8", pathLast: "u8",
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "p<> u8", original: "p<> u8",
returned: [], returned: [],
typeFilter: -1,
userQuery: "p<> u8", userQuery: "p<> u8",
error: null, error: null,
}, },
@ -50,12 +50,12 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}, },
], ],
foundElems: 1, foundElems: 1,
original: '"p"<a>', original: '"p"<a>',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"p"<a>', userQuery: '"p"<a>',
error: null, error: null,
}, },

View file

@ -23,11 +23,11 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: "R<!>", original: "R<!>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "r<!>", userQuery: "r<!>",
error: null, error: null,
}, },
@ -38,11 +38,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "!", pathLast: "!",
generics: [], generics: [],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: "!", original: "!",
returned: [], returned: [],
typeFilter: -1,
userQuery: "!", userQuery: "!",
error: null, error: null,
}, },
@ -53,11 +53,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
typeFilter: 14,
}], }],
foundElems: 1, foundElems: 1,
original: "a!", original: "a!",
returned: [], returned: [],
typeFilter: 14,
userQuery: "a!", userQuery: "a!",
error: null, error: null,
}, },
@ -66,7 +66,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a!::b", original: "a!::b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a!::b", userQuery: "a!::b",
error: "Cannot have associated items in macros", error: "Cannot have associated items in macros",
}, },
@ -77,11 +76,11 @@ const PARSED = [
pathWithoutLast: ["!"], pathWithoutLast: ["!"],
pathLast: "b", pathLast: "b",
generics: [], generics: [],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: "!::b", original: "!::b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "!::b", userQuery: "!::b",
error: null, error: null,
}, },
@ -90,7 +89,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a!::b!", original: "a!::b!",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a!::b!", userQuery: "a!::b!",
error: "Cannot have associated items in macros", error: "Cannot have associated items in macros",
}, },

View file

@ -16,11 +16,11 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: "R<P>", original: "R<P>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "r<p>", userQuery: "r<p>",
error: null, error: null,
} }

View file

@ -8,11 +8,11 @@ const PARSED = [
pathWithoutLast: ["a"], pathWithoutLast: ["a"],
pathLast: "b", pathLast: "b",
generics: [], generics: [],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: "A::B", original: "A::B",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a::b", userQuery: "a::b",
error: null, error: null,
}, },
@ -24,6 +24,7 @@ const PARSED = [
pathWithoutLast: ["a"], pathWithoutLast: ["a"],
pathLast: "b", pathLast: "b",
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: "c", name: "c",
@ -31,12 +32,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "c", pathLast: "c",
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: 'A::B,C', original: 'A::B,C',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a::b,c', userQuery: 'a::b,c',
error: null, error: null,
}, },
@ -56,6 +57,7 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}, },
{ {
name: "c", name: "c",
@ -63,12 +65,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "c", pathLast: "c",
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: 'A::B<f>,C', original: 'A::B<f>,C',
returned: [], returned: [],
typeFilter: -1,
userQuery: 'a::b<f>,c', userQuery: 'a::b<f>,c',
error: null, error: null,
}, },
@ -79,11 +81,11 @@ const PARSED = [
pathWithoutLast: ["mod"], pathWithoutLast: ["mod"],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: "mod::a", original: "mod::a",
returned: [], returned: [],
typeFilter: -1,
userQuery: "mod::a", userQuery: "mod::a",
error: null, error: null,
}, },

View file

@ -19,8 +19,8 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "p", pathLast: "p",
generics: [], generics: [],
}],
typeFilter: -1, typeFilter: -1,
}],
userQuery: '-> "p"', userQuery: '-> "p"',
error: null, error: null,
}, },
@ -31,11 +31,11 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "p", pathLast: "p",
generics: [], generics: [],
typeFilter: -1,
}], }],
foundElems: 1, foundElems: 1,
original: '"p",', original: '"p",',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"p",', userQuery: '"p",',
error: null, error: null,
}, },
@ -44,7 +44,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '"p" -> a', original: '"p" -> a',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"p" -> a', userQuery: '"p" -> a',
error: "You cannot have more than one element if you use quotes", error: "You cannot have more than one element if you use quotes",
}, },
@ -53,7 +52,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '"a" -> "p"', original: '"a" -> "p"',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"a" -> "p"', userQuery: '"a" -> "p"',
error: "Cannot have more than one literal search element", error: "Cannot have more than one literal search element",
}, },
@ -62,7 +60,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '->"-"', original: '->"-"',
returned: [], returned: [],
typeFilter: -1,
userQuery: '->"-"', userQuery: '->"-"',
error: 'Unexpected `-` in a string element', error: 'Unexpected `-` in a string element',
}, },
@ -71,7 +68,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '"a', original: '"a',
returned: [], returned: [],
typeFilter: -1,
userQuery: '"a', userQuery: '"a',
error: 'Unclosed `"`', error: 'Unclosed `"`',
}, },
@ -80,7 +76,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: '""', original: '""',
returned: [], returned: [],
typeFilter: -1,
userQuery: '""', userQuery: '""',
error: 'Cannot have empty string element', error: 'Cannot have empty string element',
}, },

View file

@ -25,8 +25,8 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
}],
typeFilter: -1, typeFilter: -1,
}],
userQuery: "-> f<p>", userQuery: "-> f<p>",
error: null, error: null,
}, },
@ -40,8 +40,8 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "p", pathLast: "p",
generics: [], generics: [],
}],
typeFilter: -1, typeFilter: -1,
}],
userQuery: "-> p", userQuery: "-> p",
error: null, error: null,
}, },
@ -55,8 +55,8 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
}],
typeFilter: -1, typeFilter: -1,
}],
userQuery: "->,a", userQuery: "->,a",
error: null, error: null,
}, },
@ -67,6 +67,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "aaaaa", pathLast: "aaaaa",
generics: [], generics: [],
typeFilter: -1,
}], }],
foundElems: 2, foundElems: 2,
original: "aaaaa->a", original: "aaaaa->a",
@ -76,8 +77,8 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
}],
typeFilter: -1, typeFilter: -1,
}],
userQuery: "aaaaa->a", userQuery: "aaaaa->a",
error: null, error: null,
}, },
@ -91,8 +92,8 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "!", pathLast: "!",
generics: [], generics: [],
}],
typeFilter: -1, typeFilter: -1,
}],
userQuery: "-> !", userQuery: "-> !",
error: null, error: null,
}, },

View file

@ -19,6 +19,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'aaaaaa', pathLast: 'aaaaaa',
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: 'b', name: 'b',
@ -26,12 +27,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'b', pathLast: 'b',
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "aaaaaa b", original: "aaaaaa b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "aaaaaa b", userQuery: "aaaaaa b",
error: null, error: null,
}, },
@ -43,6 +44,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'a', pathLast: 'a',
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: 'b', name: 'b',
@ -50,12 +52,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'b', pathLast: 'b',
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "a b", original: "a b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a b", userQuery: "a b",
error: null, error: null,
}, },
@ -67,6 +69,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'a', pathLast: 'a',
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: 'b', name: 'b',
@ -74,12 +77,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'b', pathLast: 'b',
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "a,b", original: "a,b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a,b", userQuery: "a,b",
error: null, error: null,
}, },
@ -91,6 +94,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'a', pathLast: 'a',
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: 'b', name: 'b',
@ -98,12 +102,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: 'b', pathLast: 'b',
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "a\tb", original: "a\tb",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a\tb", userQuery: "a\tb",
error: null, error: null,
}, },
@ -130,12 +134,12 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}, },
], ],
foundElems: 1, foundElems: 1,
original: "a<b c>", original: "a<b c>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<b c>", userQuery: "a<b c>",
error: null, error: null,
}, },
@ -162,12 +166,12 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}, },
], ],
foundElems: 1, foundElems: 1,
original: "a<b,c>", original: "a<b,c>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<b,c>", userQuery: "a<b,c>",
error: null, error: null,
}, },
@ -194,12 +198,12 @@ const PARSED = [
generics: [], generics: [],
}, },
], ],
typeFilter: -1,
}, },
], ],
foundElems: 1, foundElems: 1,
original: "a<b\tc>", original: "a<b\tc>",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a<b\tc>", userQuery: "a<b\tc>",
error: null, error: null,
}, },

View file

@ -20,6 +20,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: "b", name: "b",
@ -27,12 +28,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "b", pathLast: "b",
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "a b", original: "a b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a b", userQuery: "a b",
error: null, error: null,
}, },
@ -44,6 +45,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: "b", name: "b",
@ -51,12 +53,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "b", pathLast: "b",
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "a b", original: "a b",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a b", userQuery: "a b",
error: null, error: null,
}, },
@ -65,7 +67,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: "a,b(c)", original: "a,b(c)",
returned: [], returned: [],
typeFilter: -1,
userQuery: "a,b(c)", userQuery: "a,b(c)",
error: "Unexpected `(`", error: "Unexpected `(`",
}, },
@ -77,6 +78,7 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "aaa", pathLast: "aaa",
generics: [], generics: [],
typeFilter: -1,
}, },
{ {
name: "a", name: "a",
@ -84,12 +86,12 @@ const PARSED = [
pathWithoutLast: [], pathWithoutLast: [],
pathLast: "a", pathLast: "a",
generics: [], generics: [],
typeFilter: -1,
}, },
], ],
foundElems: 2, foundElems: 2,
original: "aaa,a", original: "aaa,a",
returned: [], returned: [],
typeFilter: -1,
userQuery: "aaa,a", userQuery: "aaa,a",
error: null, error: null,
}, },
@ -98,7 +100,6 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: ",,,,", original: ",,,,",
returned: [], returned: [],
typeFilter: -1,
userQuery: ",,,,", userQuery: ",,,,",
error: null, error: null,
}, },
@ -107,17 +108,15 @@ const PARSED = [
foundElems: 0, foundElems: 0,
original: 'mod :', original: 'mod :',
returned: [], returned: [],
typeFilter: 0,
userQuery: 'mod :', userQuery: 'mod :',
error: null, error: "Unexpected `:` (expected path after type filter)",
}, },
{ {
elems: [], elems: [],
foundElems: 0, foundElems: 0,
original: 'mod\t:', original: 'mod\t:',
returned: [], returned: [],
typeFilter: 0,
userQuery: 'mod\t:', userQuery: 'mod\t:',
error: null, error: "Unexpected `:` (expected path after type filter)",
}, },
]; ];

View file

@ -5,6 +5,8 @@ const QUERY = [
'Aaaaaaa -> bool', 'Aaaaaaa -> bool',
'Aaaaaaa -> usize', 'Aaaaaaa -> usize',
'Read -> u64', 'Read -> u64',
'trait:Read -> u64',
'struct:Read -> u64',
'bool -> u64', 'bool -> u64',
'Ddddddd -> u64', 'Ddddddd -> u64',
'-> Ddddddd' '-> Ddddddd'
@ -36,6 +38,17 @@ const EXPECTED = [
{ 'path': 'generics_impl::Ddddddd', 'name': 'ggggggg' }, { 'path': 'generics_impl::Ddddddd', 'name': 'ggggggg' },
], ],
}, },
{
// trait:Read -> u64
'others': [
{ 'path': 'generics_impl::Ddddddd', 'name': 'eeeeeee' },
{ 'path': 'generics_impl::Ddddddd', 'name': 'ggggggg' },
],
},
{
// struct:Read -> u64
'others': [],
},
{ {
// bool -> u64 // bool -> u64
'others': [ 'others': [

View file

@ -2,6 +2,8 @@
const QUERY = [ const QUERY = [
'R<P>', 'R<P>',
'R<struct:P>',
'R<enum:P>',
'"P"', '"P"',
'P', 'P',
'ExtraCreditStructMulti<ExtraCreditInnerMulti, ExtraCreditInnerMulti>', 'ExtraCreditStructMulti<ExtraCreditInnerMulti, ExtraCreditInnerMulti>',
@ -20,6 +22,20 @@ const EXPECTED = [
{ 'path': 'generics', 'name': 'alpha' }, { 'path': 'generics', 'name': 'alpha' },
], ],
}, },
{
// R<struct:P>
'returned': [
{ 'path': 'generics', 'name': 'alef' },
],
'in_args': [
{ 'path': 'generics', 'name': 'alpha' },
],
},
{
// R<enum:P>
'returned': [],
'in_args': [],
},
{ {
// "P" // "P"
'others': [ 'others': [

View file

@ -3,6 +3,8 @@
const QUERY = [ const QUERY = [
"i32", "i32",
"str", "str",
"primitive:str",
"struct:str",
"TotoIsSomewhere", "TotoIsSomewhere",
]; ];
@ -17,6 +19,14 @@ const EXPECTED = [
{ 'path': 'primitive', 'name': 'foo' }, { 'path': 'primitive', 'name': 'foo' },
], ],
}, },
{
'returned': [
{ 'path': 'primitive', 'name': 'foo' },
],
},
{
'returned': [],
},
{ {
'others': [], 'others': [],
'in_args': [], 'in_args': [],