@@ -587,6 +587,44 @@ 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+ if ( parserState . userQuery . slice ( parserState . pos , parserState . pos + 3 ) === "mut" ) {
610+ generics . push ( makePrimitiveElement ( "mut" , { typeFilter : "keyword" } ) ) ;
611+ parserState . pos += 3 ;
612+ c = parserState . userQuery [ parserState . pos ] ;
613+ } else if ( chr == "*" && parserState . userQuery . slice ( parserState . pos , parserState . pos + 5 ) === "const" ) {
614+ // make *const T parse the same as *T
615+ parserState . pos += 5 ;
616+ c = parserState . userQuery [ parserState . pos ] ;
617+ }
618+ while ( c === " " && parserState . pos < parserState . length ) {
619+ parserState . pos += 1 ;
620+ c = parserState . userQuery [ parserState . pos ] ;
621+ }
622+ if ( ! isEndCharacter ( c ) && parserState . pos < parserState . length ) {
623+ getFilteredNextElem ( query , parserState , generics , isInGenerics ) ;
624+ }
625+ elems . push ( makePrimitiveElement ( name , { generics } ) ) ;
626+ }
627+
590628 skipWhitespace ( parserState ) ;
591629 let start = parserState . pos ;
592630 let end ;
@@ -636,36 +674,9 @@ function getNextElem(query, parserState, elems, isInGenerics) {
636674 elems . push ( makePrimitiveElement ( name , { bindingName, generics } ) ) ;
637675 }
638676 } 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 } ) ) ;
677+ handleRefOrPtr ( "&" , "reference" ) ;
678+ } else if ( parserState . userQuery [ parserState . pos ] === "*" ) {
679+ handleRefOrPtr ( "*" , "pointer" ) ;
669680 } else {
670681 const isStringElem = parserState . userQuery [ start ] === "\"" ;
671682 // We handle the strings on their own mostly to make code easier to follow.
@@ -1185,6 +1196,7 @@ class DocSearch {
11851196 this . typeNameIdOfUnit = - 1 ;
11861197 this . typeNameIdOfTupleOrUnit = - 1 ;
11871198 this . typeNameIdOfReference = - 1 ;
1199+ this . typeNameIdOfPointer = - 1 ;
11881200 this . typeNameIdOfHof = - 1 ;
11891201
11901202 this . utf8decoder = new TextDecoder ( ) ;
@@ -1224,6 +1236,7 @@ class DocSearch {
12241236 tupleOrUnit ,
12251237 // reference matches `&`
12261238 reference ,
1239+ pointer ,
12271240 // never matches `!`
12281241 never ,
12291242 ] = await Promise . all ( [
@@ -1239,6 +1252,7 @@ class DocSearch {
12391252 nn . search ( "unit" ) ,
12401253 nn . search ( "()" ) ,
12411254 nn . search ( "reference" ) ,
1255+ nn . search ( "pointer" ) ,
12421256 nn . search ( "never" ) ,
12431257 ] ) ;
12441258 /**
@@ -1270,6 +1284,7 @@ class DocSearch {
12701284 this . typeNameIdOfUnit = await first ( unit , TY_PRIMITIVE , "" ) ;
12711285 this . typeNameIdOfTupleOrUnit = await first ( tupleOrUnit , TY_PRIMITIVE , "" ) ;
12721286 this . typeNameIdOfReference = await first ( reference , TY_PRIMITIVE , "" ) ;
1287+ this . typeNameIdOfPointer = await first ( pointer , TY_PRIMITIVE , "" ) ;
12731288 this . typeNameIdOfHof = await first ( hof , TY_PRIMITIVE , "" ) ;
12741289 this . typeNameIdOfNever = await first ( never , TY_PRIMITIVE , "" ) ;
12751290 }
0 commit comments