@@ -56,13 +56,16 @@ const itemTypes = [
5656    "derive" , 
5757    "traitalias" ,  // 25 
5858    "generic" , 
59+     "crate" , 
5960] ; 
6061
6162// used for special search precedence 
6263const  TY_PRIMITIVE  =  itemTypes . indexOf ( "primitive" ) ; 
6364const  TY_GENERIC  =  itemTypes . indexOf ( "generic" ) ; 
6465const  TY_IMPORT  =  itemTypes . indexOf ( "import" ) ; 
6566const  TY_TRAIT  =  itemTypes . indexOf ( "trait" ) ; 
67+ // minor hack to implement the `crate:` syntax 
68+ const  TY_CRATE  =  itemTypes . indexOf ( "crate" ) ; 
6669const  ROOT_PATH  =  typeof  window  !==  "undefined"  ? window . rootPath  : "../" ; 
6770
6871// Hard limit on how deep to recurse into generics when doing type-driven search. 
@@ -291,6 +294,20 @@ function getFilteredNextElem(query, parserState, elems, isInGenerics) {
291294        parserState . pos  +=  1 ; 
292295        parserState . totalElems  -=  1 ; 
293296        query . literalSearch  =  false ; 
297+         if  ( parserState . typeFilter  ===  "crate" )  { 
298+             while  ( parserState . userQuery [ parserState . pos ]  ===  " " )  { 
299+                 parserState . pos  +=  1 ; 
300+             } 
301+             const  start  =  parserState . pos ; 
302+             const  foundCrate  =  consumeIdent ( parserState ) ; 
303+             if  ( ! foundCrate )  { 
304+                 throw  [ "Expected ident after " ,  "crate:" ,  ", found " ,  parserState . userQuery [ start ] ] ; 
305+             } 
306+             const  name  =  parserState . userQuery . substring ( start ,  parserState . pos ) ; 
307+             elems . push ( makePrimitiveElement ( name ,  {  typeFilter : "crate"  } ) ) ; 
308+             parserState . typeFilter  =  null ; 
309+             return  getFilteredNextElem ( query ,  parserState ,  elems ,  isInGenerics ) ; 
310+         } 
294311        getNextElem ( query ,  parserState ,  elems ,  isInGenerics ) ; 
295312    } 
296313} 
@@ -1870,6 +1887,7 @@ class DocSearch {
18701887                correction : null , 
18711888                proposeCorrectionFrom : null , 
18721889                proposeCorrectionTo : null , 
1890+                 filterCrates : null , 
18731891                // bloom filter build from type ids 
18741892                typeFingerprint : new  Uint32Array ( 4 ) , 
18751893            } ; 
@@ -1996,6 +2014,20 @@ class DocSearch {
19962014            query . error  =  err ; 
19972015            return  query ; 
19982016        } 
2017+ 
2018+         function  handleCrateFilters ( elem )  { 
2019+             if  ( elem . typeFilter  ===  TY_CRATE )  { 
2020+                 query . filterCrates  =  elem . name ; 
2021+                 return  false ; 
2022+             } 
2023+             return  true ; 
2024+ 
2025+         } 
2026+         const  nonCrateElems  =  query . elems . filter ( handleCrateFilters ) ; 
2027+         if  ( nonCrateElems . length  !==  query . elems . length )  { 
2028+             query . elems  =  nonCrateElems ; 
2029+         } 
2030+ 
19992031        if  ( ! query . literalSearch )  { 
20002032            // If there is more than one element in the query, we switch to literalSearch in any 
20012033            // case. 
@@ -4428,6 +4460,9 @@ async function search(forced) {
44284460
44294461    const  params  =  searchState . getQueryStringParams ( ) ; 
44304462
4463+     if  ( query . filterCrates  !==  null )  { 
4464+         filterCrates  =  query . filterCrates ; 
4465+     } 
44314466    // In case we have no information about the saved crate and there is a URL query parameter, 
44324467    // we override it with the URL query parameter. 
44334468    if  ( filterCrates  ===  null  &&  params [ "filter-crate" ]  !==  undefined )  { 
0 commit comments