@@ -129,17 +129,21 @@ window.initSearch = function(rawSearchIndex) {
129
129
}
130
130
131
131
function isSpecialStartCharacter ( c ) {
132
- return "( <\"" . indexOf ( c ) !== - 1 ;
132
+ return "<\"" . indexOf ( c ) !== - 1 ;
133
133
}
134
134
135
135
function isEndCharacter ( c ) {
136
- return ") ,>-" . indexOf ( c ) !== - 1 ;
136
+ return ",>-" . indexOf ( c ) !== - 1 ;
137
137
}
138
138
139
139
function isStopCharacter ( c ) {
140
140
return isWhitespace ( c ) || isEndCharacter ( c ) ;
141
141
}
142
142
143
+ function isErrorCharacter ( c ) {
144
+ return "()" . indexOf ( c ) !== - 1 ;
145
+ }
146
+
143
147
function itemTypeFromName ( typename ) {
144
148
for ( var i = 0 , len = itemTypes . length ; i < len ; ++ i ) {
145
149
if ( itemTypes [ i ] === typename ) {
@@ -267,7 +271,9 @@ window.initSearch = function(rawSearchIndex) {
267
271
} else {
268
272
while ( parserState . pos < parserState . length ) {
269
273
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 ) ) {
271
277
break ;
272
278
}
273
279
// If we allow paths ("str::string" for example).
@@ -285,6 +291,9 @@ window.initSearch = function(rawSearchIndex) {
285
291
if ( parserState . pos < parserState . length &&
286
292
parserState . userQuery [ parserState . pos ] === "<" )
287
293
{
294
+ if ( isInGenerics ) {
295
+ throw new Error ( "Unexpected `<` after `<`" ) ;
296
+ }
288
297
parserState . pos += 1 ;
289
298
getItemsBefore ( query , parserState , generics , ">" ) ;
290
299
}
@@ -317,12 +326,10 @@ window.initSearch = function(rawSearchIndex) {
317
326
continue ;
318
327
} else if ( c === ":" && isPathStart ( parserState ) ) {
319
328
throw new Error ( "Unexpected `::`: paths cannot start with `::`" ) ;
320
- } else if ( c === "(" || c === " :" || isEndCharacter ( c ) ) {
329
+ } else if ( c === ":" || isEndCharacter ( c ) ) {
321
330
var extra = "" ;
322
331
if ( limit === ">" ) {
323
332
extra = "`<`" ;
324
- } else if ( limit === ")" ) {
325
- extra = "`(`" ;
326
333
} else if ( limit === "" ) {
327
334
extra = "`->`" ;
328
335
}
@@ -356,8 +363,6 @@ window.initSearch = function(rawSearchIndex) {
356
363
} else if ( c === "-" && isReturnArrow ( parserState ) ) {
357
364
break ;
358
365
}
359
- } else if ( c == "(" ) {
360
- break ;
361
366
} else if ( c === ":" &&
362
367
parserState . typeFilter === null &&
363
368
! isPathStart ( parserState ) )
@@ -391,11 +396,7 @@ window.initSearch = function(rawSearchIndex) {
391
396
}
392
397
while ( parserState . pos < parserState . length ) {
393
398
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 ) ) {
399
400
parserState . pos += 2 ;
400
401
// Get returned elements.
401
402
getItemsBefore ( query , parserState , query . returned , "" ) ;
@@ -419,7 +420,6 @@ window.initSearch = function(rawSearchIndex) {
419
420
userQuery : userQuery . toLowerCase ( ) ,
420
421
typeFilter : NO_TYPE_FILTER ,
421
422
elems : [ ] ,
422
- args : [ ] ,
423
423
returned : [ ] ,
424
424
// Total number of "top" elements (does not include generics).
425
425
foundElems : 0 ,
@@ -466,19 +466,19 @@ window.initSearch = function(rawSearchIndex) {
466
466
*
467
467
* The supported syntax by this parser is as follow:
468
468
*
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
472
473
* 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
476
477
*
477
478
* exact-search = [type-filter *WS COLON] *WS QUOTE ident QUOTE *WS [generics]
478
479
* type-search = [type-filter *WS COLON] *WS path *WS generics
479
- * function-search = path *WS function-args *WS [return-args]
480
480
*
481
- * query = *WS (exact-search / type-search / function-search / return-args) *WS
481
+ * query = *WS (exact-search / type-search / return-args) *WS
482
482
*
483
483
* type-filter = (
484
484
* "mod" /
@@ -510,8 +510,6 @@ window.initSearch = function(rawSearchIndex) {
510
510
*
511
511
* OPEN-ANGLE-BRACKET = "<"
512
512
* CLOSE-ANGLE-BRACKET = ">"
513
- * OPEN-PAREN = "("
514
- * END-PAREN = ")"
515
513
* COLON = ":"
516
514
* DOUBLE-COLON = "::"
517
515
* QUOTE = %x22
@@ -554,7 +552,7 @@ window.initSearch = function(rawSearchIndex) {
554
552
// case.
555
553
query . literalSearch = parserState . totalElems > 1 ;
556
554
}
557
- query . foundElems = query . elems . length + query . args . length + query . returned . length ;
555
+ query . foundElems = query . elems . length + query . returned . length ;
558
556
if ( query . foundElems === 0 && parserState . length !== 0 ) {
559
557
// In this case, we'll simply keep whatever was entered by the user...
560
558
createQueryElement ( query , parserState , query . elems , userQuery , [ ] ) ;
@@ -743,6 +741,11 @@ window.initSearch = function(rawSearchIndex) {
743
741
function checkGenerics ( row , elem , defaultLev ) {
744
742
if ( row . length <= GENERICS_DATA || row [ GENERICS_DATA ] . length === 0 ) {
745
743
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 ;
746
749
}
747
750
// The names match, but we need to be sure that all generics kinda
748
751
// match as well.
@@ -751,7 +754,15 @@ window.initSearch = function(rawSearchIndex) {
751
754
var elems = { } ;
752
755
for ( var x = 0 , length = row [ GENERICS_DATA ] . length ; x < length ; ++ x ) {
753
756
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 ) {
755
766
elems [ elem_name ] = 0 ;
756
767
}
757
768
elems [ elem_name ] += 1 ;
@@ -1216,9 +1227,6 @@ window.initSearch = function(rawSearchIndex) {
1216
1227
if ( ! checkArgs ( parsedQuery . elems , findArg ) ) {
1217
1228
return ;
1218
1229
}
1219
- if ( ! checkArgs ( parsedQuery . args , findArg ) ) {
1220
- return ;
1221
- }
1222
1230
if ( ! checkArgs ( parsedQuery . returned , checkReturned ) ) {
1223
1231
return ;
1224
1232
}
@@ -1231,7 +1239,7 @@ window.initSearch = function(rawSearchIndex) {
1231
1239
}
1232
1240
1233
1241
function innerRunQuery ( ) {
1234
- var elem , i , nSearchWords , in_args , in_returned , row ;
1242
+ var elem , i , nSearchWords , in_returned , row ;
1235
1243
1236
1244
if ( parsedQuery . foundElems === 1 ) {
1237
1245
if ( parsedQuery . elems . length === 1 ) {
@@ -1241,14 +1249,6 @@ window.initSearch = function(rawSearchIndex) {
1241
1249
// returned).
1242
1250
handleSingleArg ( searchIndex [ i ] , i , elem ) ;
1243
1251
}
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
- }
1252
1252
} else if ( parsedQuery . returned . length === 1 ) {
1253
1253
// We received one returned argument to check, so looking into returned values.
1254
1254
elem = parsedQuery . returned [ 0 ] ;
@@ -1262,9 +1262,7 @@ window.initSearch = function(rawSearchIndex) {
1262
1262
var container = results_others ;
1263
1263
// In the special case where only a "returned" information is available, we want to
1264
1264
// 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 ) {
1268
1266
container = results_returned ;
1269
1267
}
1270
1268
for ( i = 0 , nSearchWords = searchWords . length ; i < nSearchWords ; ++ i ) {
0 commit comments