@@ -587,6 +587,45 @@ function getNextElem(query, parserState, elems, isInGenerics) {
587587 /** @type {rustdoc.ParserQueryElement[] } */
588588 const generics = [ ] ;
589589
590+ /** @type {function(string, string): void } */
591+ const handleRefOrPtr = ( chr , name ) => {
592+ if ( parserState . typeFilter !== null && parserState . typeFilter !== "primitive" ) {
593+ throw [
594+ "Invalid search type: primitive " ,
595+ chr ,
596+ " and " ,
597+ parserState . typeFilter ,
598+ " both specified" ,
599+ ] ;
600+ }
601+ parserState . typeFilter = null ;
602+ parserState . pos += 1 ;
603+ let c = parserState . userQuery [ parserState . pos ] ;
604+ while ( c === " " && parserState . pos < parserState . length ) {
605+ parserState . pos += 1 ;
606+ c = parserState . userQuery [ parserState . pos ] ;
607+ }
608+ const generics = [ ] ;
609+ const pos = parserState . pos ;
610+ if ( parserState . userQuery . slice ( pos , pos + 3 ) === "mut" ) {
611+ generics . push ( makePrimitiveElement ( "mut" , { typeFilter : "keyword" } ) ) ;
612+ parserState . pos += 3 ;
613+ c = parserState . userQuery [ parserState . pos ] ;
614+ } else if ( chr === "*" && parserState . userQuery . slice ( pos , pos + 5 ) === "const" ) {
615+ // make *const T parse the same as *T
616+ parserState . pos += 5 ;
617+ c = parserState . userQuery [ parserState . pos ] ;
618+ }
619+ while ( c === " " && parserState . pos < parserState . length ) {
620+ parserState . pos += 1 ;
621+ c = parserState . userQuery [ parserState . pos ] ;
622+ }
623+ if ( ! isEndCharacter ( c ) && parserState . pos < parserState . length ) {
624+ getFilteredNextElem ( query , parserState , generics , isInGenerics ) ;
625+ }
626+ elems . push ( makePrimitiveElement ( name , { generics } ) ) ;
627+ } ;
628+
590629 skipWhitespace ( parserState ) ;
591630 let start = parserState . pos ;
592631 let end ;
@@ -636,36 +675,9 @@ function getNextElem(query, parserState, elems, isInGenerics) {
636675 elems . push ( makePrimitiveElement ( name , { bindingName, generics } ) ) ;
637676 }
638677 } else if ( parserState . userQuery [ parserState . pos ] === "&" ) {
639- if ( parserState . typeFilter !== null && parserState . typeFilter !== "primitive" ) {
640- throw [
641- "Invalid search type: primitive " ,
642- "&" ,
643- " and " ,
644- parserState . typeFilter ,
645- " both specified" ,
646- ] ;
647- }
648- parserState . typeFilter = null ;
649- parserState . pos += 1 ;
650- let c = parserState . userQuery [ parserState . pos ] ;
651- while ( c === " " && parserState . pos < parserState . length ) {
652- parserState . pos += 1 ;
653- c = parserState . userQuery [ parserState . pos ] ;
654- }
655- const generics = [ ] ;
656- if ( parserState . userQuery . slice ( parserState . pos , parserState . pos + 3 ) === "mut" ) {
657- generics . push ( makePrimitiveElement ( "mut" , { typeFilter : "keyword" } ) ) ;
658- parserState . pos += 3 ;
659- c = parserState . userQuery [ parserState . pos ] ;
660- }
661- while ( c === " " && parserState . pos < parserState . length ) {
662- parserState . pos += 1 ;
663- c = parserState . userQuery [ parserState . pos ] ;
664- }
665- if ( ! isEndCharacter ( c ) && parserState . pos < parserState . length ) {
666- getFilteredNextElem ( query , parserState , generics , isInGenerics ) ;
667- }
668- elems . push ( makePrimitiveElement ( "reference" , { generics } ) ) ;
678+ handleRefOrPtr ( "&" , "reference" ) ;
679+ } else if ( parserState . userQuery [ parserState . pos ] === "*" ) {
680+ handleRefOrPtr ( "*" , "pointer" ) ;
669681 } else {
670682 const isStringElem = parserState . userQuery [ start ] === "\"" ;
671683 // We handle the strings on their own mostly to make code easier to follow.
@@ -1185,6 +1197,7 @@ class DocSearch {
11851197 this . typeNameIdOfUnit = - 1 ;
11861198 this . typeNameIdOfTupleOrUnit = - 1 ;
11871199 this . typeNameIdOfReference = - 1 ;
1200+ this . typeNameIdOfPointer = - 1 ;
11881201 this . typeNameIdOfHof = - 1 ;
11891202
11901203 this . utf8decoder = new TextDecoder ( ) ;
@@ -1224,6 +1237,7 @@ class DocSearch {
12241237 tupleOrUnit ,
12251238 // reference matches `&`
12261239 reference ,
1240+ pointer ,
12271241 // never matches `!`
12281242 never ,
12291243 ] = await Promise . all ( [
@@ -1239,6 +1253,7 @@ class DocSearch {
12391253 nn . search ( "unit" ) ,
12401254 nn . search ( "()" ) ,
12411255 nn . search ( "reference" ) ,
1256+ nn . search ( "pointer" ) ,
12421257 nn . search ( "never" ) ,
12431258 ] ) ;
12441259 /**
@@ -1270,6 +1285,7 @@ class DocSearch {
12701285 this . typeNameIdOfUnit = await first ( unit , TY_PRIMITIVE , "" ) ;
12711286 this . typeNameIdOfTupleOrUnit = await first ( tupleOrUnit , TY_PRIMITIVE , "" ) ;
12721287 this . typeNameIdOfReference = await first ( reference , TY_PRIMITIVE , "" ) ;
1288+ this . typeNameIdOfPointer = await first ( pointer , TY_PRIMITIVE , "" ) ;
12731289 this . typeNameIdOfHof = await first ( hof , TY_PRIMITIVE , "" ) ;
12741290 this . typeNameIdOfNever = await first ( never , TY_PRIMITIVE , "" ) ;
12751291 }
@@ -2309,6 +2325,25 @@ class DocSearch {
23092325 } , result ) ,
23102326 ) ;
23112327 return true ;
2328+ } else if ( fnType . id === this . typeNameIdOfPointer ) {
2329+ pushText ( { name : "*" , highlighted : fnType . highlighted } , result ) ;
2330+ if ( fnType . generics . length < 2 ) {
2331+ pushText ( { name : "const " , highlighted : fnType . highlighted } , result ) ;
2332+ }
2333+ let prevHighlighted = false ;
2334+ await onEachBtwnAsync (
2335+ fnType . generics ,
2336+ async value => {
2337+ prevHighlighted = ! ! value . highlighted ;
2338+ await writeFn ( value , result ) ;
2339+ } ,
2340+ // @ts -expect-error
2341+ value => pushText ( {
2342+ name : " " ,
2343+ highlighted : prevHighlighted && value . highlighted ,
2344+ } , result ) ,
2345+ ) ;
2346+ return true ;
23122347 } else if (
23132348 fnType . id === this . typeNameIdOfFn ||
23142349 fnType . id === this . typeNameIdOfFnMut ||
0 commit comments