@@ -193,6 +193,7 @@ window.initSearch = function(rawSearchIndex) {
193
193
* Returns `true` if the current parser position is starting with "::".
194
194
*
195
195
* @param {ParserState } parserState
196
+ *
196
197
* @return {boolean }
197
198
*/
198
199
function isPathStart ( parserState ) {
@@ -203,6 +204,7 @@ window.initSearch = function(rawSearchIndex) {
203
204
* Returns `true` if the current parser position is starting with "->".
204
205
*
205
206
* @param {ParserState } parserState
207
+ *
206
208
* @return {boolean }
207
209
*/
208
210
function isReturnArrow ( parserState ) {
@@ -212,11 +214,12 @@ window.initSearch = function(rawSearchIndex) {
212
214
/**
213
215
* @param {ParsedQuery } query
214
216
* @param {ParserState } parserState
215
- * @param {Array<QueryElement> } elems - This is where the new {QueryElement} will be added.
216
217
* @param {string } name - Name of the query element.
217
218
* @param {Array<QueryElement> } generics - List of generics of this query element.
219
+ *
220
+ * @return {QueryElement } - The newly created `QueryElement`.
218
221
*/
219
- function createQueryElement ( query , parserState , elems , name , generics ) {
222
+ function createQueryElement ( query , parserState , name , generics ) {
220
223
if ( name === '*' || ( name . length === 0 && generics . length === 0 ) ) {
221
224
return ;
222
225
}
@@ -238,18 +241,18 @@ window.initSearch = function(rawSearchIndex) {
238
241
}
239
242
}
240
243
}
241
- // In case we only have something like `<p>`, there is no name but it remains valid .
242
- if ( pathSegments . length === 0 ) {
243
- pathSegments = [ "" ] ;
244
+ // In case we only have something like `<p>`, there is no name.
245
+ if ( pathSegments . length === 0 || ( pathSegments . length === 1 && pathSegments [ 0 ] === "" ) ) {
246
+ throw new Error ( "Found generics without a path" ) ;
244
247
}
245
- elems . push ( {
248
+ parserState . totalElems += 1 ;
249
+ return {
246
250
name : name ,
247
251
fullPath : pathSegments ,
248
252
pathWithoutLast : pathSegments . slice ( 0 , pathSegments . length - 1 ) ,
249
253
pathLast : pathSegments [ pathSegments . length - 1 ] ,
250
254
generics : generics ,
251
- } ) ;
252
- parserState . totalElems += 1 ;
255
+ } ;
253
256
}
254
257
255
258
/**
@@ -300,12 +303,14 @@ window.initSearch = function(rawSearchIndex) {
300
303
if ( start >= end && generics . length === 0 ) {
301
304
return ;
302
305
}
303
- createQueryElement (
304
- query ,
305
- parserState ,
306
- elems ,
307
- parserState . userQuery . slice ( start , end ) ,
308
- generics ) ;
306
+ elems . push (
307
+ createQueryElement (
308
+ query ,
309
+ parserState ,
310
+ parserState . userQuery . slice ( start , end ) ,
311
+ generics
312
+ )
313
+ ) ;
309
314
}
310
315
311
316
/**
@@ -372,8 +377,11 @@ window.initSearch = function(rawSearchIndex) {
372
377
if ( c === "," || c === " " ) {
373
378
parserState . pos += 1 ;
374
379
continue ;
375
- } else if ( c === "-" && isReturnArrow ( parserState ) ) {
376
- break ;
380
+ } else if ( c === "-" || c === ">" ) {
381
+ if ( isReturnArrow ( parserState ) ) {
382
+ break ;
383
+ }
384
+ throw new Error ( `Unexpected \`${ c } \` (did you mean \`->\`?)` ) ;
377
385
}
378
386
} else if ( c === ":" &&
379
387
parserState . typeFilter === null &&
@@ -424,6 +432,7 @@ window.initSearch = function(rawSearchIndex) {
424
432
* Takes the user search input and returns an empty `ParsedQuery`.
425
433
*
426
434
* @param {string } userQuery
435
+ *
427
436
* @return {ParsedQuery }
428
437
*/
429
438
function newParsedQuery ( userQuery ) {
@@ -445,6 +454,7 @@ window.initSearch = function(rawSearchIndex) {
445
454
*
446
455
* @param {string } search - The current search being performed.
447
456
* @param {string|null } filterCrates - The current filtering crate (if any).
457
+ *
448
458
* @return {string }
449
459
*/
450
460
function buildUrl ( search , filterCrates ) {
@@ -478,17 +488,20 @@ window.initSearch = function(rawSearchIndex) {
478
488
*
479
489
* The supported syntax by this parser is as follow:
480
490
*
481
- * ident = *(ALPHA / DIGIT)
491
+ * ident = *(ALPHA / DIGIT / "_" )
482
492
* path = ident *(DOUBLE-COLON ident)
483
493
* arg = path [generics]
484
494
* arg-without-generic = path
485
- * nonempty-arg-list = arg *WS *(COMMA *WS arg)
486
- * nonempty-arg-list-without-generics = arg-without-generic *WS *(COMMA *WS arg-without-generic)
487
- * generics = OPEN-ANGLE-BRACKET *WS nonempty-arg-list-without-generics *WS CLOSE-ANGLE-BRACKET
495
+ * type-sep = COMMA/WS *(COMMA/WS)
496
+ * nonempty-arg-list = arg *(type-sep arg) *(COMMA/WS)
497
+ * nonempty-arg-list-without-generics = arg-without-generic *(type-sep arg-without-generic)
498
+ * *(COMMA/WS)
499
+ * generics = OPEN-ANGLE-BRACKET *WS [ nonempty-arg-list-without-generics ] *WS
500
+ * CLOSE-ANGLE-BRACKET
488
501
* return-args = RETURN-ARROW *WS nonempty-arg-list
489
502
*
490
503
* exact-search = [type-filter *WS COLON] *WS QUOTE ident QUOTE *WS [generics]
491
- * type-search = [type-filter *WS COLON] *WS path *WS generics
504
+ * type-search = [type-filter *WS COLON] *WS path *WS nonempty-arg-list
492
505
*
493
506
* query = *WS (exact-search / type-search / return-args) *WS
494
507
*
@@ -533,6 +546,7 @@ window.initSearch = function(rawSearchIndex) {
533
546
* WS = %x09 / " "
534
547
*
535
548
* @param {string } val - The user query
549
+ *
536
550
* @return {ParsedQuery } - The parsed query
537
551
*/
538
552
function parseQuery ( userQuery ) {
@@ -567,7 +581,7 @@ window.initSearch = function(rawSearchIndex) {
567
581
query . foundElems = query . elems . length + query . returned . length ;
568
582
if ( query . foundElems === 0 && parserState . length !== 0 ) {
569
583
// In this case, we'll simply keep whatever was entered by the user...
570
- createQueryElement ( query , parserState , query . elems , userQuery , [ ] ) ;
584
+ query . elems . push ( createQueryElement ( query , parserState , userQuery , [ ] ) ) ;
571
585
query . foundElems += 1 ;
572
586
}
573
587
return query ;
@@ -580,6 +594,7 @@ window.initSearch = function(rawSearchIndex) {
580
594
* @param {Array<Result> } results_returned
581
595
* @param {Array<Result> } results_in_args
582
596
* @param {ParsedQuery } parsedQuery
597
+ *
583
598
* @return {ResultsTable }
584
599
*/
585
600
function createQueryResults ( results_in_args , results_returned , results_others , parsedQuery ) {
@@ -597,6 +612,7 @@ window.initSearch = function(rawSearchIndex) {
597
612
* @param {ParsedQuery } parsedQuery - The parsed user query
598
613
* @param {Object } searchWords - The list of search words to query against
599
614
* @param {Object } [filterCrates] - Crate to search in if defined
615
+ *
600
616
* @return {ResultsTable }
601
617
*/
602
618
function execQuery ( parsedQuery , searchWords , filterCrates ) {
@@ -634,12 +650,7 @@ window.initSearch = function(rawSearchIndex) {
634
650
}
635
651
636
652
function sortResults ( results , isType ) {
637
- var nameSplit = null ;
638
- if ( parsedQuery . elems . length === 1 ) {
639
- var hasPath = typeof parsedQuery . elems [ 0 ] . path === "undefined" ;
640
- nameSplit = hasPath ? null : parsedQuery . elems [ 0 ] . path ;
641
- }
642
- var query = parsedQuery . userQuery ;
653
+ var userQuery = parsedQuery . userQuery ;
643
654
var ar = [ ] ;
644
655
for ( var entry in results ) {
645
656
if ( hasOwnPropertyRustdoc ( results , entry ) ) {
@@ -659,8 +670,8 @@ window.initSearch = function(rawSearchIndex) {
659
670
var a , b ;
660
671
661
672
// sort by exact match with regard to the last word (mismatch goes later)
662
- a = ( aaa . word !== query ) ;
663
- b = ( bbb . word !== query ) ;
673
+ a = ( aaa . word !== userQuery ) ;
674
+ b = ( bbb . word !== userQuery ) ;
664
675
if ( a !== b ) { return a - b ; }
665
676
666
677
// Sort by non levenshtein results and then levenshtein results by the distance
@@ -722,6 +733,12 @@ window.initSearch = function(rawSearchIndex) {
722
733
return 0 ;
723
734
} ) ;
724
735
736
+ var nameSplit = null ;
737
+ if ( parsedQuery . elems . length === 1 ) {
738
+ var hasPath = typeof parsedQuery . elems [ 0 ] . path === "undefined" ;
739
+ nameSplit = hasPath ? null : parsedQuery . elems [ 0 ] . path ;
740
+ }
741
+
725
742
for ( var i = 0 , len = results . length ; i < len ; ++ i ) {
726
743
result = results [ i ] ;
727
744
@@ -763,7 +780,7 @@ window.initSearch = function(rawSearchIndex) {
763
780
// match as well.
764
781
var elem_name ;
765
782
if ( elem . generics . length > 0 && row [ GENERICS_DATA ] . length >= elem . generics . length ) {
766
- var elems = { } ;
783
+ var elems = Object . create ( null ) ;
767
784
for ( var x = 0 , length = row [ GENERICS_DATA ] . length ; x < length ; ++ x ) {
768
785
elem_name = row [ GENERICS_DATA ] [ x ] [ NAME ] ;
769
786
if ( elem_name === "" ) {
@@ -935,6 +952,8 @@ window.initSearch = function(rawSearchIndex) {
935
952
}
936
953
937
954
/**
955
+ * This function checks if the object (`row`) returns the given type (`elem`).
956
+ *
938
957
* @param {Row } row
939
958
* @param {QueryElement } elem - The element from the parsed query.
940
959
* @param {integer } typeFilter
@@ -1103,7 +1122,7 @@ window.initSearch = function(rawSearchIndex) {
1103
1122
* * `index` is an `integer`` used to sort by the position of the word in the item's name.
1104
1123
* * `lev` is the main metric used to sort the search results.
1105
1124
*
1106
- * @param {Object } results
1125
+ * @param {Results } results
1107
1126
* @param {string } fullId
1108
1127
* @param {integer } id
1109
1128
* @param {integer } index
@@ -1130,10 +1149,21 @@ window.initSearch = function(rawSearchIndex) {
1130
1149
* This function is called in case the query is only one element (with or without generics).
1131
1150
*
1132
1151
* @param {Row } row
1133
- * @param {integer } pos - Position in the `searchIndex`.
1134
- * @param {QueryElement } elem - The element from the parsed query.
1152
+ * @param {integer } pos - Position in the `searchIndex`.
1153
+ * @param {QueryElement } elem - The element from the parsed query.
1154
+ * @param {Results } results_others - Unqualified results (not in arguments nor in
1155
+ * returned values).
1156
+ * @param {Results } results_in_args - Matching arguments results.
1157
+ * @param {Results } results_returned - Matching returned arguments results.
1135
1158
*/
1136
- function handleSingleArg ( row , pos , elem ) {
1159
+ function handleSingleArg (
1160
+ row ,
1161
+ pos ,
1162
+ elem ,
1163
+ results_others ,
1164
+ results_in_args ,
1165
+ results_returned
1166
+ ) {
1137
1167
if ( ! row || ( filterCrates !== null && row . crate !== filterCrates ) ) {
1138
1168
return ;
1139
1169
}
@@ -1261,7 +1291,14 @@ window.initSearch = function(rawSearchIndex) {
1261
1291
for ( i = 0 , nSearchWords = searchWords . length ; i < nSearchWords ; ++ i ) {
1262
1292
// It means we want to check for this element everywhere (in names, args and
1263
1293
// returned).
1264
- handleSingleArg ( searchIndex [ i ] , i , elem ) ;
1294
+ handleSingleArg (
1295
+ searchIndex [ i ] ,
1296
+ i ,
1297
+ elem ,
1298
+ results_others ,
1299
+ results_in_args ,
1300
+ results_returned
1301
+ ) ;
1265
1302
}
1266
1303
} else if ( parsedQuery . returned . length === 1 ) {
1267
1304
// We received one returned argument to check, so looking into returned values.
@@ -1315,6 +1352,7 @@ window.initSearch = function(rawSearchIndex) {
1315
1352
* @param {string } path - The path of the result
1316
1353
* @param {string } keys - The keys to be used (["file", "open"])
1317
1354
* @param {Object } parent - The parent of the result
1355
+ *
1318
1356
* @return {boolean } - Whether the result is valid or not
1319
1357
*/
1320
1358
function validateResult ( name , path , keys , parent ) {
0 commit comments