@@ -52,6 +52,12 @@ const itemTypes = [
52
52
// used for special search precedence
53
53
const TY_GENERIC = itemTypes . indexOf ( "generic" ) ;
54
54
const TY_IMPORT = itemTypes . indexOf ( "import" ) ;
55
+ // used for isType
56
+ const TY_STRUCT = itemTypes . indexOf ( "struct" ) ;
57
+ const TY_ENUM = itemTypes . indexOf ( "enum" ) ;
58
+ const TY_UNION = itemTypes . indexOf ( "union" ) ;
59
+ const TY_PRIMATIVE = itemTypes . indexOf ( "primative" ) ;
60
+ const TY_FOREIGN_TYPE = itemTypes . indexOf ( "foreigntype" ) ;
55
61
const ROOT_PATH = typeof window !== "undefined" ? window . rootPath : "../" ;
56
62
57
63
// Hard limit on how deep to recurse into generics when doing type-driven search.
@@ -239,6 +245,19 @@ function prevIs(parserState, lookingFor) {
239
245
return false ;
240
246
}
241
247
248
+ function isType ( ty ) {
249
+ let r = ty === TY_STRUCT || ty === TY_ENUM || ty === TY_UNION ||
250
+ ty === TY_PRIMATIVE || ty === TY_FOREIGN_TYPE || ty === - 1 ;
251
+ return r ;
252
+ }
253
+
254
+ /**
255
+ * This function removes any queryElem that cannot be a function argument.
256
+ */
257
+ function filterOnlyTypes ( elems ) {
258
+ return elems . filter ( ( elem ) => isType ( elem . typeFilter ) ) ;
259
+ }
260
+
242
261
/**
243
262
* Returns `true` if the last element in the `elems` argument has generics.
244
263
*
@@ -1800,6 +1819,8 @@ class DocSearch {
1800
1819
correction : null ,
1801
1820
proposeCorrectionFrom : null ,
1802
1821
proposeCorrectionTo : null ,
1822
+ // used for type-and-name searches
1823
+ extraNameElem : null ,
1803
1824
// bloom filter build from type ids
1804
1825
typeFingerprint : new Uint32Array ( 4 ) ,
1805
1826
} ;
@@ -1932,6 +1953,17 @@ class DocSearch {
1932
1953
query . literalSearch = parserState . totalElems > 1 ;
1933
1954
}
1934
1955
query . foundElems = query . elems . length + query . returned . length ;
1956
+ if ( query . returned . length > 0 || query . elems . length > 1 ) {
1957
+ for ( const elem of query . elems ) {
1958
+ if ( ! isType ( elem . typeFilter ) ) {
1959
+ query . extraNameElem = elem ;
1960
+ query . elems = filterOnlyTypes ( query . elems ) ;
1961
+ query . hasReturnArrow = true ;
1962
+ console . log ( query . elems ) ;
1963
+ break ;
1964
+ }
1965
+ }
1966
+ }
1935
1967
query . totalElems = parserState . totalElems ;
1936
1968
return query ;
1937
1969
}
@@ -3047,7 +3079,7 @@ class DocSearch {
3047
3079
* @param {integer } pos - Position in the `searchIndex`.
3048
3080
* @param {Object } results
3049
3081
*/
3050
- function handleArgs ( row , pos , results ) {
3082
+ function handleArgs ( row , pos , results , maxEditDistance ) {
3051
3083
if ( ! row || ( filterCrates !== null && row . crate !== filterCrates ) || ! row . type ) {
3052
3084
return ;
3053
3085
}
@@ -3084,8 +3116,26 @@ class DocSearch {
3084
3116
return ;
3085
3117
}
3086
3118
3119
+ let name_dist = 0 ;
3120
+ let name_elem = parsedQuery . extraNameElem ;
3121
+ let path_dist = tfpDist ;
3122
+ if ( name_elem !== null ) {
3123
+ if ( ! typePassesFilter ( name_elem . typeFilter , row . ty ) ) {
3124
+ return ;
3125
+ }
3126
+ name_dist = editDistance (
3127
+ row . normalizedName , name_elem . normalizedPathLast , maxEditDistance ) ;
3128
+ if ( row . normalizedName . includes ( name_elem . normalizedPathLast ) ) {
3129
+ name_dist = name_dist / 3 ;
3130
+ }
3131
+ if ( name_dist > maxEditDistance ) {
3132
+ return ;
3133
+ }
3134
+ let real_path_dist = checkPath ( name_elem . fullPath , row ) ;
3135
+ path_dist = ( path_dist + real_path_dist ) / 2 ;
3136
+ }
3087
3137
results . max_dist = Math . max ( results . max_dist || 0 , tfpDist ) ;
3088
- addIntoResults ( results , row . id , pos , 0 , tfpDist , 0 , Number . MAX_VALUE ) ;
3138
+ addIntoResults ( results , row . id , pos , name_dist , path_dist , 0 , Number . MAX_VALUE ) ;
3089
3139
}
3090
3140
3091
3141
/**
@@ -3285,7 +3335,7 @@ class DocSearch {
3285
3335
parsedQuery . elems . sort ( sortQ ) ;
3286
3336
parsedQuery . returned . sort ( sortQ ) ;
3287
3337
for ( let i = 0 , nSearchIndex = this . searchIndex . length ; i < nSearchIndex ; ++ i ) {
3288
- handleArgs ( this . searchIndex [ i ] , i , results_others ) ;
3338
+ handleArgs ( this . searchIndex [ i ] , i , results_others , maxEditDistance ) ;
3289
3339
}
3290
3340
}
3291
3341
} ;
0 commit comments