@@ -106,7 +106,7 @@ function levenshtein(s1, s2) {
106106window . initSearch = function ( rawSearchIndex ) {
107107 var MAX_LEV_DISTANCE = 3 ;
108108 var MAX_RESULTS = 200 ;
109- var GENERICS_DATA = 1 ;
109+ var GENERICS_DATA = 2 ;
110110 var NAME = 0 ;
111111 var INPUTS_DATA = 0 ;
112112 var OUTPUT_DATA = 1 ;
@@ -306,6 +306,9 @@ window.initSearch = function(rawSearchIndex) {
306306 var elems = Object . create ( null ) ;
307307 var elength = obj [ GENERICS_DATA ] . length ;
308308 for ( var x = 0 ; x < elength ; ++ x ) {
309+ if ( ! elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] ) {
310+ elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] = 0 ;
311+ }
309312 elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] += 1 ;
310313 }
311314 var total = 0 ;
@@ -354,10 +357,13 @@ window.initSearch = function(rawSearchIndex) {
354357 if ( literalSearch ) {
355358 if ( val . generics && val . generics . length !== 0 ) {
356359 if ( obj . length > GENERICS_DATA &&
357- obj [ GENERICS_DATA ] . length >= val . generics . length ) {
360+ obj [ GENERICS_DATA ] . length > 0 ) {
358361 var elems = Object . create ( null ) ;
359362 len = obj [ GENERICS_DATA ] . length ;
360363 for ( x = 0 ; x < len ; ++ x ) {
364+ if ( ! elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] ) {
365+ elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] = 0 ;
366+ }
361367 elems [ getObjectNameFromId ( obj [ GENERICS_DATA ] [ x ] ) ] += 1 ;
362368 }
363369
@@ -375,26 +381,23 @@ window.initSearch = function(rawSearchIndex) {
375381 if ( allFound ) {
376382 return true ;
377383 }
378- } else {
379- return false ;
380384 }
385+ return false ;
381386 }
382387 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- }
391388 } 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+ }
393397 }
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 ) {
398401 return obj [ GENERICS_DATA ] . some (
399402 function ( name ) {
400403 return name === val . name ;
@@ -1167,7 +1170,48 @@ window.initSearch = function(rawSearchIndex) {
11671170 return ret ;
11681171 }
11691172
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 ) ;
11711215 var results = {
11721216 "in_args" : [ ] ,
11731217 "returned" : [ ] ,
0 commit comments