diff options
| author | Guillaume Gomez <guillaume.gomez@huawei.com> | 2022-02-09 20:56:37 +0100 |
|---|---|---|
| committer | Guillaume Gomez <guillaume.gomez@huawei.com> | 2022-04-18 20:59:08 +0200 |
| commit | 49297337b46eabef906a41f2c438bdd569b9227d (patch) | |
| tree | a2b2c802aa310585fb1c3fcde8e3ecd5f65c6558 | |
| parent | 99d552092c7a0c154b98c8d5120b1e3ad729cfcd (diff) | |
| download | rust-49297337b46eabef906a41f2c438bdd569b9227d.tar.gz rust-49297337b46eabef906a41f2c438bdd569b9227d.zip | |
Simplify parser syntax
| -rw-r--r-- | src/librustdoc/html/static/js/search.js | 80 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-errors.js | 23 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-filter.js | 3 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-generics.js | 46 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-in_args.js | 44 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-invalid.js | 32 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-literal.js | 1 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-paths.js | 3 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-quote.js | 19 | ||||
| -rw-r--r-- | src/test/rustdoc-js-std/parser-returned.js | 2 | ||||
| -rw-r--r-- | src/tools/rustdoc-js/tester.js | 2 |
11 files changed, 50 insertions, 205 deletions
diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js index 861bf1a42dd..65a1dfe269e 100644 --- a/src/librustdoc/html/static/js/search.js +++ b/src/librustdoc/html/static/js/search.js @@ -129,17 +129,21 @@ window.initSearch = function(rawSearchIndex) { } function isSpecialStartCharacter(c) { - return "(<\"".indexOf(c) !== -1; + return "<\"".indexOf(c) !== -1; } function isEndCharacter(c) { - return "),>-".indexOf(c) !== -1; + return ",>-".indexOf(c) !== -1; } function isStopCharacter(c) { return isWhitespace(c) || isEndCharacter(c); } + function isErrorCharacter(c) { + return "()".indexOf(c) !== -1; + } + function itemTypeFromName(typename) { for (var i = 0, len = itemTypes.length; i < len; ++i) { if (itemTypes[i] === typename) { @@ -267,7 +271,9 @@ window.initSearch = function(rawSearchIndex) { } else { while (parserState.pos < parserState.length) { var c = parserState.userQuery[parserState.pos]; - if (isStopCharacter(c) || isSpecialStartCharacter(c)) { + if (isErrorCharacter(c)) { + throw new Error(`Unexpected \`${c}\``); + } else if (isStopCharacter(c) || isSpecialStartCharacter(c)) { break; } // If we allow paths ("str::string" for example). @@ -285,6 +291,9 @@ window.initSearch = function(rawSearchIndex) { if (parserState.pos < parserState.length && parserState.userQuery[parserState.pos] === "<") { + if (isInGenerics) { + throw new Error("Unexpected `<` after `<`"); + } parserState.pos += 1; getItemsBefore(query, parserState, generics, ">"); } @@ -317,12 +326,10 @@ window.initSearch = function(rawSearchIndex) { continue; } else if (c === ":" && isPathStart(parserState)) { throw new Error("Unexpected `::`: paths cannot start with `::`"); - } else if (c === "(" || c === ":" || isEndCharacter(c)) { + } else if (c === ":" || isEndCharacter(c)) { var extra = ""; if (limit === ">") { extra = "`<`"; - } else if (limit === ")") { - extra = "`(`"; } else if (limit === "") { extra = "`->`"; } @@ -356,8 +363,6 @@ window.initSearch = function(rawSearchIndex) { } else if (c === "-" && isReturnArrow(parserState)) { break; } - } else if (c == "(") { - break; } else if (c === ":" && parserState.typeFilter === null && !isPathStart(parserState)) @@ -391,11 +396,7 @@ window.initSearch = function(rawSearchIndex) { } while (parserState.pos < parserState.length) { c = parserState.userQuery[parserState.pos]; - if (query.args.length === 0 && c === "(") { - parserState.pos += 1; - // Check for function/method arguments. - getItemsBefore(query, parserState, query.args, ")"); - } else if (isReturnArrow(parserState)) { + if (isReturnArrow(parserState)) { parserState.pos += 2; // Get returned elements. getItemsBefore(query, parserState, query.returned, ""); @@ -419,7 +420,6 @@ window.initSearch = function(rawSearchIndex) { userQuery: userQuery.toLowerCase(), typeFilter: NO_TYPE_FILTER, elems: [], - args: [], returned: [], // Total number of "top" elements (does not include generics). foundElems: 0, @@ -466,19 +466,19 @@ window.initSearch = function(rawSearchIndex) { * * The supported syntax by this parser is as follow: * - * ident = *1(ALPHA / DIGIT) - * path = ident *WS *(DOUBLE-COLON *WS ident) - * arg = path *WS [generics] + * ident = *(ALPHA / DIGIT) + * path = ident *(DOUBLE-COLON ident) + * arg = path [generics] + * arg-without-generic = path * nonempty-arg-list = arg *WS *(COMMA *WS arg) - * generics = OPEN-ANGLE-BRACKET *WS nonempty-arg-list *WS CLOSE-ANGLE-BRACKET - * function-args = OPEN-PAREN *WS [nonempty-arg-list] *WS END-PAREN - * return-args = RETURN-ARROW *WS function-args + * 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 + * 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 - * function-search = path *WS function-args *WS [return-args] * - * query = *WS (exact-search / type-search / function-search / return-args) *WS + * query = *WS (exact-search / type-search / return-args) *WS * * type-filter = ( * "mod" / @@ -510,8 +510,6 @@ window.initSearch = function(rawSearchIndex) { * * OPEN-ANGLE-BRACKET = "<" * CLOSE-ANGLE-BRACKET = ">" - * OPEN-PAREN = "(" - * END-PAREN = ")" * COLON = ":" * DOUBLE-COLON = "::" * QUOTE = %x22 @@ -554,7 +552,7 @@ window.initSearch = function(rawSearchIndex) { // case. query.literalSearch = parserState.totalElems > 1; } - query.foundElems = query.elems.length + query.args.length + query.returned.length; + 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, []); @@ -743,6 +741,11 @@ window.initSearch = function(rawSearchIndex) { function checkGenerics(row, elem, defaultLev) { if (row.length <= GENERICS_DATA || row[GENERICS_DATA].length === 0) { return elem.generics.length === 0 ? defaultLev : MAX_LEV_DISTANCE + 1; + } else if (row[GENERICS_DATA].length > 0 && row[GENERICS_DATA][0][NAME] === "") { + if (row.length > GENERICS_DATA) { + return checkGenerics(row[GENERICS_DATA][0], elem, defaultLev); + } + return elem.generics.length === 0 ? defaultLev : MAX_LEV_DISTANCE + 1; } // The names match, but we need to be sure that all generics kinda // match as well. @@ -751,7 +754,15 @@ window.initSearch = function(rawSearchIndex) { var elems = {}; for (var x = 0, length = row[GENERICS_DATA].length; x < length; ++x) { elem_name = row[GENERICS_DATA][x][NAME]; - if (!elems[elem_name]) { + if (elem_name === "") { + // Pure generic, needs to check into it. + if (checkGenerics( + row[GENERICS_DATA][x], elem, MAX_LEV_DISTANCE + 1) !== 0) { + return MAX_LEV_DISTANCE + 1; + } + continue; + } + if (elems[elem_name] === undefined) { elems[elem_name] = 0; } elems[elem_name] += 1; @@ -1216,9 +1227,6 @@ window.initSearch = function(rawSearchIndex) { if (!checkArgs(parsedQuery.elems, findArg)) { return; } - if (!checkArgs(parsedQuery.args, findArg)) { - return; - } if (!checkArgs(parsedQuery.returned, checkReturned)) { return; } @@ -1231,7 +1239,7 @@ window.initSearch = function(rawSearchIndex) { } function innerRunQuery() { - var elem, i, nSearchWords, in_args, in_returned, row; + var elem, i, nSearchWords, in_returned, row; if (parsedQuery.foundElems === 1) { if (parsedQuery.elems.length === 1) { @@ -1241,14 +1249,6 @@ window.initSearch = function(rawSearchIndex) { // returned). handleSingleArg(searchIndex[i], i, elem); } - } else if (parsedQuery.args.length === 1) { - // We received one argument to check, so looking into args. - elem = parsedQuery.args[0]; - for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) { - row = searchIndex[i]; - in_args = findArg(row, elem, parsedQuery.typeFilter); - addIntoResults(results_in_args, row.id, i, -1, in_args); - } } else if (parsedQuery.returned.length === 1) { // We received one returned argument to check, so looking into returned values. elem = parsedQuery.returned[0]; @@ -1262,9 +1262,7 @@ window.initSearch = function(rawSearchIndex) { var container = results_others; // In the special case where only a "returned" information is available, we want to // put the information into the "results_returned" dict. - if (parsedQuery.returned.length !== 0 && parsedQuery.args.length === 0 && - parsedQuery.elems.length === 0) - { + if (parsedQuery.returned.length !== 0 && parsedQuery.elems.length === 0) { container = results_returned; } for (i = 0, nSearchWords = searchWords.length; i < nSearchWords; ++i) { diff --git a/src/test/rustdoc-js-std/parser-errors.js b/src/test/rustdoc-js-std/parser-errors.js index 369b8c89a66..7d00b7fed59 100644 --- a/src/test/rustdoc-js-std/parser-errors.js +++ b/src/test/rustdoc-js-std/parser-errors.js @@ -19,7 +19,6 @@ const QUERY = [ const PARSED = [ { - args: [], elems: [], foundElems: 0, original: "<\"P\">", @@ -29,7 +28,6 @@ const PARSED = [ error: "`\"` cannot be used in generics", }, { - args: [], elems: [], foundElems: 0, original: "\"P\" \"P\"", @@ -39,7 +37,6 @@ const PARSED = [ error: "Cannot have more than one literal search element", }, { - args: [], elems: [], foundElems: 0, original: "P \"P\"", @@ -49,7 +46,6 @@ const PARSED = [ error: "Cannot use literal search when there is more than one element", }, { - args: [], elems: [], foundElems: 0, original: "\"p\" p", @@ -59,7 +55,6 @@ const PARSED = [ error: "You cannot have more than one element if you use quotes", }, { - args: [], elems: [], foundElems: 0, original: "\"const\": p", @@ -69,7 +64,6 @@ const PARSED = [ error: "You cannot use quotes on type filter", }, { - args: [], elems: [], foundElems: 0, original: "<:a>", @@ -79,7 +73,6 @@ const PARSED = [ error: "Unexpected `:` after `<`", }, { - args: [], elems: [], foundElems: 0, original: "<::a>", @@ -89,17 +82,15 @@ const PARSED = [ error: "Unexpected `::`: paths cannot start with `::`", }, { - args: [], elems: [], foundElems: 0, original: "((a))", returned: [], typeFilter: -1, userQuery: "((a))", - error: "Unexpected `(` after `(`", + error: "Unexpected `(`", }, { - args: [], elems: [], foundElems: 0, original: "->,a", @@ -109,17 +100,15 @@ const PARSED = [ error: "Unexpected `,` after `->`", }, { - args: [], elems: [], foundElems: 0, original: "(p -> p", returned: [], typeFilter: -1, userQuery: "(p -> p", - error: "Unexpected `-` after `(`", + error: "Unexpected `(`", }, { - args: [], elems: [], foundElems: 0, original: "::a::b", @@ -129,7 +118,6 @@ const PARSED = [ error: "Paths cannot start with `::`", }, { - args: [], elems: [], foundElems: 0, original: "a::::b", @@ -139,7 +127,6 @@ const PARSED = [ error: "Unexpected `::::`", }, { - args: [], elems: [], foundElems: 0, original: "a::b::", @@ -149,7 +136,6 @@ const PARSED = [ error: "Paths cannot end with `::`", }, { - args: [], elems: [], foundElems: 0, original: ":a", @@ -159,7 +145,6 @@ const PARSED = [ error: "Expected type filter before `:`", }, { - args: [], elems: [], foundElems: 0, original: "a b:", @@ -169,17 +154,15 @@ const PARSED = [ error: "Unexpected `:`", }, { - args: [], elems: [], foundElems: 0, original: "a (b:", returned: [], typeFilter: -1, userQuery: "a (b:", - error: "Unexpected `:` after `(`", + error: "Unexpected `(`", }, { - args: [], elems: [], foundElems: 0, original: "{:", diff --git a/src/test/rustdoc-js-std/parser-filter.js b/src/test/rustdoc-js-std/parser-filter.js index 2b474849318..e5a87a415ac 100644 --- a/src/test/rustdoc-js-std/parser-filter.js +++ b/src/test/rustdoc-js-std/parser-filter.js @@ -2,7 +2,6 @@ const QUERY = ['fn:foo', 'enum : foo', 'macro<f>:foo']; const PARSED = [ { - args: [], elems: [{ name: "foo", fullPath: ["foo"], @@ -18,7 +17,6 @@ const PARSED = [ error: null, }, { - args: [], elems: [{ name: "foo", fullPath: ["foo"], @@ -34,7 +32,6 @@ const PARSED = [ error: null, }, { - args: [], elems: [], foundElems: 0, original: "macro<f>:foo", diff --git a/src/test/rustdoc-js-std/parser-generics.js b/src/test/rustdoc-js-std/parser-generics.js index d0a0a904353..cf8d99ef22a 100644 --- a/src/test/rustdoc-js-std/parser-generics.js +++ b/src/test/rustdoc-js-std/parser-generics.js @@ -2,7 +2,6 @@ const QUERY = ['<P>', 'A<B<C<D>, E>', 'p<> u8']; const PARSED = [ { - args: [], elems: [{ name: "", fullPath: [""], @@ -26,54 +25,15 @@ const PARSED = [ error: null, }, { - args: [], - elems: [{ - name: "a", - fullPath: ["a"], - pathWithoutLast: [], - pathLast: "a", - generics: [ - { - name: "b", - fullPath: ["b"], - pathWithoutLast: [], - pathLast: "b", - generics: [ - { - name: "c", - fullPath: ["c"], - pathWithoutLast: [], - pathLast: "c", - generics: [ - { - name: "d", - fullPath: ["d"], - pathWithoutLast: [], - pathLast: "d", - generics: [], - }, - ], - }, - { - name: "e", - fullPath: ["e"], - pathWithoutLast: [], - pathLast: "e", - generics: [], - }, - ], - }, - ], - }], - foundElems: 1, + elems: [], + foundElems: 0, original: 'A<B<C<D>, E>', returned: [], typeFilter: -1, userQuery: 'a<b<c<d>, e>', - error: null, + error: 'Unexpected `<` after `<`', }, { - args: [], elems: [ { name: "p", diff --git a/src/test/rustdoc-js-std/parser-in_args.js b/src/test/rustdoc-js-std/parser-in_args.js deleted file mode 100644 index e74e423ceed..00000000000 --- a/src/test/rustdoc-js-std/parser-in_args.js +++ /dev/null @@ -1,44 +0,0 @@ -const QUERY = ['(whatever)', '(<P>)']; - -const PARSED = [ - { - args: [{ - name: "whatever", - fullPath: ["whatever"], - pathWithoutLast: [], - pathLast: "whatever", - generics: [], - }], - elems: [], - foundElems: 1, - original: "(whatever)", - returned: [], - typeFilter: -1, - userQuery: "(whatever)", - error: null, - }, - { - args: [{ - name: "", - fullPath: [""], - pathWithoutLast: [], - pathLast: "", - generics: [ - { - name: "p", - fullPath: ["p"], - pathWithoutLast: [], - pathLast: "p", - generics: [], - }, - ], - }], - elems: [], - foundElems: 1, - original: "(<P>)", - returned: [], - typeFilter: -1, - userQuery: "(<p>)", - error: null, - }, -]; diff --git a/src/test/rustdoc-js-std/parser-invalid.js b/src/test/rustdoc-js-std/parser-invalid.js index 024372ef8d5..87ebe21c49b 100644 --- a/src/test/rustdoc-js-std/parser-invalid.js +++ b/src/test/rustdoc-js-std/parser-invalid.js @@ -5,7 +5,6 @@ const QUERY = ['a b', 'a b', 'a,b(c)']; const PARSED = [ { - args: [], elems: [ { name: "a", @@ -30,7 +29,6 @@ const PARSED = [ error: null, }, { - args: [], elems: [ { name: "a", @@ -55,36 +53,12 @@ const PARSED = [ error: null, }, { - args: [ - { - name: "c", - fullPath: ["c"], - pathWithoutLast: [], - pathLast: "c", - generics: [], - }, - ], - elems: [ - { - name: "a", - fullPath: ["a"], - pathWithoutLast: [], - pathLast: "a", - generics: [], - }, - { - name: "b", - fullPath: ["b"], - pathWithoutLast: [], - pathLast: "b", - generics: [], - }, - ], - foundElems: 3, + elems: [], + foundElems: 0, original: "a,b(c)", returned: [], typeFilter: -1, userQuery: "a,b(c)", - error: null, + error: "Unexpected `(`", }, ]; diff --git a/src/test/rustdoc-js-std/parser-literal.js b/src/test/rustdoc-js-std/parser-literal.js index f8c73672922..87b3baff1e2 100644 --- a/src/test/rustdoc-js-std/parser-literal.js +++ b/src/test/rustdoc-js-std/parser-literal.js @@ -2,7 +2,6 @@ const QUERY = ['R<P>']; const PARSED = [ { - args: [], elems: [{ name: "r", fullPath: ["r"], diff --git a/src/test/rustdoc-js-std/parser-paths.js b/src/test/rustdoc-js-std/parser-paths.js index 12b7f922b14..c8c7f21b9bd 100644 --- a/src/test/rustdoc-js-std/parser-paths.js +++ b/src/test/rustdoc-js-std/parser-paths.js @@ -2,7 +2,6 @@ const QUERY = ['A::B', 'A::B,C', 'A::B<f>,C']; const PARSED = [ { - args: [], elems: [{ name: "a::b", fullPath: ["a", "b"], @@ -18,7 +17,6 @@ const PARSED = [ error: null, }, { - args: [], elems: [ { name: "a::b", @@ -43,7 +41,6 @@ const PARSED = [ error: null, }, { - args: [], elems: [ { name: "a::b", diff --git a/src/test/rustdoc-js-std/parser-quote.js b/src/test/rustdoc-js-std/parser-quote.js index 07af9249172..e8b1c9a7719 100644 --- a/src/test/rustdoc-js-std/parser-quote.js +++ b/src/test/rustdoc-js-std/parser-quote.js @@ -1,8 +1,7 @@ -const QUERY = ['-> "p"', '("p")']; +const QUERY = ['-> "p"']; const PARSED = [ { - args: [], elems: [], foundElems: 1, original: "-> \"p\"", @@ -17,20 +16,4 @@ const PARSED = [ userQuery: "-> \"p\"", error: null, }, - { - args: [{ - name: "p", - fullPath: ["p"], - pathWithoutLast: [], - pathLast: "p", - generics: [], - }], - elems: [], - foundElems: 1, - original: "(\"p\")", - returned: [], - typeFilter: -1, - userQuery: "(\"p\")", - error: null, - }, ]; diff --git a/src/test/rustdoc-js-std/parser-returned.js b/src/test/rustdoc-js-std/parser-returned.js index face0a7461d..db64b03c0b3 100644 --- a/src/test/rustdoc-js-std/parser-returned.js +++ b/src/test/rustdoc-js-std/parser-returned.js @@ -2,7 +2,6 @@ const QUERY = ['-> <P>', '-> P']; const PARSED = [ { - args: [], elems: [], foundElems: 1, original: "-> <P>", @@ -26,7 +25,6 @@ const PARSED = [ error: null, }, { - args: [], elems: [], foundElems: 1, original: "-> P", diff --git a/src/tools/rustdoc-js/tester.js b/src/tools/rustdoc-js/tester.js index 934f35f2c41..afd878423c0 100644 --- a/src/tools/rustdoc-js/tester.js +++ b/src/tools/rustdoc-js/tester.js @@ -274,7 +274,7 @@ function loadSearchJsAndIndex(searchJs, searchIndex, storageJs, crate) { "isWhitespace", "isSpecialStartCharacter", "isStopCharacter", "parseInput", "getItemsBefore", "getNextElem", "createQueryElement", "isReturnArrow", "isPathStart", "getStringElem", "newParsedQuery", - "itemTypeFromName", "isEndCharacter"]; + "itemTypeFromName", "isEndCharacter", "isErrorCharacter"]; const functions = ["hasOwnPropertyRustdoc", "onEach"]; ALIASES = {}; |
