@@ -129,17 +129,21 @@ window.initSearch = function(rawSearchIndex) {
129129 }
130130
131131 function isSpecialStartCharacter ( c ) {
132- return "( <\"" . indexOf ( c ) !== - 1 ;
132+ return "<\"" . indexOf ( c ) !== - 1 ;
133133 }
134134
135135 function isEndCharacter ( c ) {
136- return ") ,>-" . indexOf ( c ) !== - 1 ;
136+ return ",>-" . indexOf ( c ) !== - 1 ;
137137 }
138138
139139 function isStopCharacter ( c ) {
140140 return isWhitespace ( c ) || isEndCharacter ( c ) ;
141141 }
142142
143+ function isErrorCharacter ( c ) {
144+ return "()" . indexOf ( c ) !== - 1 ;
145+ }
146+
143147 function itemTypeFromName ( typename ) {
144148 for ( var i = 0 , len = itemTypes . length ; i < len ; ++ i ) {
145149 if ( itemTypes [ i ] === typename ) {
@@ -267,7 +271,9 @@ window.initSearch = function(rawSearchIndex) {
267271 } else {
268272 while ( parserState . pos < parserState . length ) {
269273 var c = parserState . userQuery [ parserState . pos ] ;
270- if ( isStopCharacter ( c ) || isSpecialStartCharacter ( c ) ) {
274+ if ( isErrorCharacter ( c ) ) {
275+ throw new Error ( `Unexpected \`${ c } \`` ) ;
276+ } else if ( isStopCharacter ( c ) || isSpecialStartCharacter ( c ) ) {
271277 break ;
272278 }
273279 // If we allow paths ("str::string" for example).
@@ -285,6 +291,9 @@ window.initSearch = function(rawSearchIndex) {
285291 if ( parserState . pos < parserState . length &&
286292 parserState . userQuery [ parserState . pos ] === "<" )
287293 {
294+ if ( isInGenerics ) {
295+ throw new Error ( "Unexpected `<` after `<`" ) ;
296+ }
288297 parserState . pos += 1 ;
289298 getItemsBefore ( query , parserState , generics , ">" ) ;
290299 }
@@ -317,12 +326,10 @@ window.initSearch = function(rawSearchIndex) {
317326 continue ;
318327 } else if ( c === ":" && isPathStart ( parserState ) ) {
319328 throw new Error ( "Unexpected `::`: paths cannot start with `::`" ) ;
320- } else if ( c === "(" || c === " :" || isEndCharacter ( c ) ) {
329+ } else if ( c === ":" || isEndCharacter ( c ) ) {
321330 var extra = "" ;
322331 if ( limit === ">" ) {
323332 extra = "`<`" ;
324- } else if ( limit === ")" ) {
325- extra = "`(`" ;
326333 } else if ( limit === "" ) {
327334 extra = "`->`" ;
328335 }
@@ -356,8 +363,6 @@ window.initSearch = function(rawSearchIndex) {
356363 } else if ( c === "-" && isReturnArrow ( parserState ) ) {
357364 break ;
358365 }
359- } else if ( c == "(" ) {
360- break ;
361366 } else if ( c === ":" &&
362367 parserState . typeFilter === null &&
363368 ! isPathStart ( parserState ) )
@@ -391,11 +396,7 @@ window.initSearch = function(rawSearchIndex) {
391396 }
392397 while ( parserState . pos < parserState . length ) {
393398 c = parserState . userQuery [ parserState . pos ] ;
394- if ( query . args . length === 0 && c === "(" ) {
395- parserState . pos += 1 ;
396- // Check for function/method arguments.
397- getItemsBefore ( query , parserState , query . args , ")" ) ;
398- } else if ( isReturnArrow ( parserState ) ) {
399+ if ( isReturnArrow ( parserState ) ) {
399400 parserState . pos += 2 ;
400401 // Get returned elements.
401402 getItemsBefore ( query , parserState , query . returned , "" ) ;
@@ -419,7 +420,6 @@ window.initSearch = function(rawSearchIndex) {
419420 userQuery : userQuery . toLowerCase ( ) ,
420421 typeFilter : NO_TYPE_FILTER ,
421422 elems : [ ] ,
422- args : [ ] ,
423423 returned : [ ] ,
424424 // Total number of "top" elements (does not include generics).
425425 foundElems : 0 ,
@@ -466,19 +466,19 @@ window.initSearch = function(rawSearchIndex) {
466466 *
467467 * The supported syntax by this parser is as follow:
468468 *
469- * ident = *1(ALPHA / DIGIT)
470- * path = ident *WS *(DOUBLE-COLON *WS ident)
471- * arg = path *WS [generics]
469+ * ident = *(ALPHA / DIGIT)
470+ * path = ident *(DOUBLE-COLON ident)
471+ * arg = path [generics]
472+ * arg-without-generic = path
472473 * nonempty-arg-list = arg *WS *(COMMA *WS arg)
473- * generics = OPEN-ANGLE-BRACKET *WS nonempty-arg-list *WS CLOSE-ANGLE-BRACKET
474- * function-args = OPEN-PAREN *WS [ nonempty-arg-list] *WS END-PAREN
475- * return-args = RETURN-ARROW *WS function-args
474+ * nonempty-arg-list-without- generics = arg-without-generic *WS *(COMMA *WS arg-without-generic)
475+ * generics = OPEN-ANGLE-BRACKET *WS nonempty-arg-list-without-generics *WS CLOSE-ANGLE-BRACKET
476+ * return-args = RETURN-ARROW *WS nonempty-arg-list
476477 *
477478 * exact-search = [type-filter *WS COLON] *WS QUOTE ident QUOTE *WS [generics]
478479 * type-search = [type-filter *WS COLON] *WS path *WS generics
479- * function-search = path *WS function-args *WS [return-args]
480480 *
481- * query = *WS (exact-search / type-search / function-search / return-args) *WS
481+ * query = *WS (exact-search / type-search / return-args) *WS
482482 *
483483 * type-filter = (
484484 * "mod" /
@@ -510,8 +510,6 @@ window.initSearch = function(rawSearchIndex) {
510510 *
511511 * OPEN-ANGLE-BRACKET = "<"
512512 * CLOSE-ANGLE-BRACKET = ">"
513- * OPEN-PAREN = "("
514- * END-PAREN = ")"
515513 * COLON = ":"
516514 * DOUBLE-COLON = "::"
517515 * QUOTE = %x22
@@ -554,7 +552,7 @@ window.initSearch = function(rawSearchIndex) {
554552 // case.
555553 query . literalSearch = parserState . totalElems > 1 ;
556554 }
557- query . foundElems = query . elems . length + query . args . length + query . returned . length ;
555+ query . foundElems = query . elems . length + query . returned . length ;
558556 if ( query . foundElems === 0 && parserState . length !== 0 ) {
559557 // In this case, we'll simply keep whatever was entered by the user...
560558 createQueryElement ( query , parserState , query . elems , userQuery , [ ] ) ;
@@ -743,6 +741,11 @@ window.initSearch = function(rawSearchIndex) {
743741 function checkGenerics ( row , elem , defaultLev ) {
744742 if ( row . length <= GENERICS_DATA || row [ GENERICS_DATA ] . length === 0 ) {
745743 return elem . generics . length === 0 ? defaultLev : MAX_LEV_DISTANCE + 1 ;
744+ } else if ( row [ GENERICS_DATA ] . length > 0 && row [ GENERICS_DATA ] [ 0 ] [ NAME ] === "" ) {
745+ if ( row . length > GENERICS_DATA ) {
746+ return checkGenerics ( row [ GENERICS_DATA ] [ 0 ] , elem , defaultLev ) ;
747+ }
748+ return elem . generics . length === 0 ? defaultLev : MAX_LEV_DISTANCE + 1 ;
746749 }
747750 // The names match, but we need to be sure that all generics kinda
748751 // match as well.
@@ -751,7 +754,15 @@ window.initSearch = function(rawSearchIndex) {
751754 var elems = { } ;
752755 for ( var x = 0 , length = row [ GENERICS_DATA ] . length ; x < length ; ++ x ) {
753756 elem_name = row [ GENERICS_DATA ] [ x ] [ NAME ] ;
754- if ( ! elems [ elem_name ] ) {
757+ if ( elem_name === "" ) {
758+ // Pure generic, needs to check into it.
759+ if ( checkGenerics (
760+ row [ GENERICS_DATA ] [ x ] , elem , MAX_LEV_DISTANCE + 1 ) !== 0 ) {
761+ return MAX_LEV_DISTANCE + 1 ;
762+ }
763+ continue ;
764+ }
765+ if ( elems [ elem_name ] === undefined ) {
755766 elems [ elem_name ] = 0 ;
756767 }
757768 elems [ elem_name ] += 1 ;
@@ -1216,9 +1227,6 @@ window.initSearch = function(rawSearchIndex) {
12161227 if ( ! checkArgs ( parsedQuery . elems , findArg ) ) {
12171228 return ;
12181229 }
1219- if ( ! checkArgs ( parsedQuery . args , findArg ) ) {
1220- return ;
1221- }
12221230 if ( ! checkArgs ( parsedQuery . returned , checkReturned ) ) {
12231231 return ;
12241232 }
@@ -1231,7 +1239,7 @@ window.initSearch = function(rawSearchIndex) {
12311239 }
12321240
12331241 function innerRunQuery ( ) {
1234- var elem , i , nSearchWords , in_args , in_returned , row ;
1242+ var elem , i , nSearchWords , in_returned , row ;
12351243
12361244 if ( parsedQuery . foundElems === 1 ) {
12371245 if ( parsedQuery . elems . length === 1 ) {
@@ -1241,14 +1249,6 @@ window.initSearch = function(rawSearchIndex) {
12411249 // returned).
12421250 handleSingleArg ( searchIndex [ i ] , i , elem ) ;
12431251 }
1244- } else if ( parsedQuery . args . length === 1 ) {
1245- // We received one argument to check, so looking into args.
1246- elem = parsedQuery . args [ 0 ] ;
1247- for ( i = 0 , nSearchWords = searchWords . length ; i < nSearchWords ; ++ i ) {
1248- row = searchIndex [ i ] ;
1249- in_args = findArg ( row , elem , parsedQuery . typeFilter ) ;
1250- addIntoResults ( results_in_args , row . id , i , - 1 , in_args ) ;
1251- }
12521252 } else if ( parsedQuery . returned . length === 1 ) {
12531253 // We received one returned argument to check, so looking into returned values.
12541254 elem = parsedQuery . returned [ 0 ] ;
@@ -1262,9 +1262,7 @@ window.initSearch = function(rawSearchIndex) {
12621262 var container = results_others ;
12631263 // In the special case where only a "returned" information is available, we want to
12641264 // put the information into the "results_returned" dict.
1265- if ( parsedQuery . returned . length !== 0 && parsedQuery . args . length === 0 &&
1266- parsedQuery . elems . length === 0 )
1267- {
1265+ if ( parsedQuery . returned . length !== 0 && parsedQuery . elems . length === 0 ) {
12681266 container = results_returned ;
12691267 }
12701268 for ( i = 0 , nSearchWords = searchWords . length ; i < nSearchWords ; ++ i ) {
0 commit comments