@@ -106,7 +106,7 @@ function levenshtein(s1, s2) {
106
106
window . initSearch = function ( rawSearchIndex ) {
107
107
var MAX_LEV_DISTANCE = 3 ;
108
108
var MAX_RESULTS = 200 ;
109
- var GENERICS_DATA = 1 ;
109
+ var GENERICS_DATA = 2 ;
110
110
var NAME = 0 ;
111
111
var INPUTS_DATA = 0 ;
112
112
var OUTPUT_DATA = 1 ;
@@ -306,6 +306,9 @@ window.initSearch = function(rawSearchIndex) {
306
306
var elems = Object . create ( null ) ;
307
307
var elength = obj [ GENERICS_DATA ] . length ;
308
308
for ( var x = 0 ; x < elength ; ++ x ) {
309
+ if ( ! elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] ) {
310
+ elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] = 0 ;
311
+ }
309
312
elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] += 1 ;
310
313
}
311
314
var total = 0 ;
@@ -354,10 +357,13 @@ window.initSearch = function(rawSearchIndex) {
354
357
if ( literalSearch ) {
355
358
if ( val . generics && val . generics . length !== 0 ) {
356
359
if ( obj . length > GENERICS_DATA &&
357
- obj [ GENERICS_DATA ] . length >= val . generics . length ) {
360
+ obj [ GENERICS_DATA ] . length > 0 ) {
358
361
var elems = Object . create ( null ) ;
359
362
len = obj [ GENERICS_DATA ] . length ;
360
363
for ( x = 0 ; x < len ; ++ x ) {
364
+ if ( ! elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] ) {
365
+ elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] = 0 ;
366
+ }
361
367
elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] += 1 ;
362
368
}
363
369
@@ -375,26 +381,23 @@ window.initSearch = function(rawSearchIndex) {
375
381
if ( allFound ) {
376
382
return true ;
377
383
}
378
- } else {
379
- return false ;
380
384
}
385
+ return false ;
381
386
}
382
387
return true ;
383
- }
384
- // If the type has generics but don't match, then it won't return at this point.
385
- // Otherwise, `checkGenerics` will return 0 and it'll return.
386
- if ( obj . length > GENERICS_DATA && obj [ GENERICS_DATA ] . length !== 0 ) {
387
- var tmp_lev = checkGenerics ( obj , val ) ;
388
- if ( tmp_lev <= MAX_LEV_DISTANCE ) {
389
- return tmp_lev ;
390
- }
391
388
} else {
392
- return 0 ;
389
+ // If the type has generics but don't match, then it won't return at this point.
390
+ // Otherwise, `checkGenerics` will return 0 and it'll return.
391
+ if ( obj . length > GENERICS_DATA && obj [ GENERICS_DATA ] . length !== 0 ) {
392
+ var tmp_lev = checkGenerics ( obj , val ) ;
393
+ if ( tmp_lev <= MAX_LEV_DISTANCE ) {
394
+ return tmp_lev ;
395
+ }
396
+ }
393
397
}
394
- }
395
- // Names didn't match so let's check if one of the generic types could.
396
- if ( literalSearch ) {
397
- if ( obj . length > GENERICS_DATA && obj [ GENERICS_DATA ] . length > 0 ) {
398
+ } else if ( literalSearch ) {
399
+ if ( ( ! val . generics || val . generics . length === 0 ) &&
400
+ obj . length > GENERICS_DATA && obj [ GENERICS_DATA ] . length > 0 ) {
398
401
return obj [ GENERICS_DATA ] . some (
399
402
function ( name ) {
400
403
return name === val . name ;
@@ -1167,7 +1170,48 @@ window.initSearch = function(rawSearchIndex) {
1167
1170
return ret ;
1168
1171
}
1169
1172
1170
- var queries = query . raw . split ( "," ) ;
1173
+ // Split search query by ",", while respecting angle bracket nesting.
1174
+ // Since "<" is an alias for the Ord family of traits, it also uses
1175
+ // lookahead to distinguish "<"-as-less-than from "<"-as-angle-bracket.
1176
+ //
1177
+ // tokenizeQuery("A<B, C>, D") == ["A<B, C>", "D"]
1178
+ // tokenizeQuery("A<B, C, D") == ["A<B", "C", "D"]
1179
+ function tokenizeQuery ( raw ) {
1180
+ var i , matched ;
1181
+ var l = raw . length ;
1182
+ var depth = 0 ;
1183
+ var nextAngle = / ( < | > ) / g;
1184
+ var ret = [ ] ;
1185
+ var start = 0 ;
1186
+ for ( i = 0 ; i < l ; ++ i ) {
1187
+ switch ( raw [ i ] ) {
1188
+ case "<" :
1189
+ nextAngle . lastIndex = i + 1 ;
1190
+ matched = nextAngle . exec ( raw ) ;
1191
+ if ( matched && matched [ 1 ] === '>' ) {
1192
+ depth += 1 ;
1193
+ }
1194
+ break ;
1195
+ case ">" :
1196
+ if ( depth > 0 ) {
1197
+ depth -= 1 ;
1198
+ }
1199
+ break ;
1200
+ case "," :
1201
+ if ( depth === 0 ) {
1202
+ ret . push ( raw . substring ( start , i ) ) ;
1203
+ start = i + 1 ;
1204
+ }
1205
+ break ;
1206
+ }
1207
+ }
1208
+ if ( start !== i ) {
1209
+ ret . push ( raw . substring ( start , i ) ) ;
1210
+ }
1211
+ return ret ;
1212
+ }
1213
+
1214
+ var queries = tokenizeQuery ( query . raw ) ;
1171
1215
var results = {
1172
1216
"in_args" : [ ] ,
1173
1217
"returned" : [ ] ,
0 commit comments