@@ -587,6 +587,45 @@ function getNextElem(query, parserState, elems, isInGenerics) {
587
587
/** @type {rustdoc.ParserQueryElement[] } */
588
588
const generics = [ ] ;
589
589
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
+
590
629
skipWhitespace ( parserState ) ;
591
630
let start = parserState . pos ;
592
631
let end ;
@@ -636,36 +675,9 @@ function getNextElem(query, parserState, elems, isInGenerics) {
636
675
elems . push ( makePrimitiveElement ( name , { bindingName, generics } ) ) ;
637
676
}
638
677
} 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" ) ;
669
681
} else {
670
682
const isStringElem = parserState . userQuery [ start ] === "\"" ;
671
683
// We handle the strings on their own mostly to make code easier to follow.
@@ -1185,6 +1197,7 @@ class DocSearch {
1185
1197
this . typeNameIdOfUnit = - 1 ;
1186
1198
this . typeNameIdOfTupleOrUnit = - 1 ;
1187
1199
this . typeNameIdOfReference = - 1 ;
1200
+ this . typeNameIdOfPointer = - 1 ;
1188
1201
this . typeNameIdOfHof = - 1 ;
1189
1202
1190
1203
this . utf8decoder = new TextDecoder ( ) ;
@@ -1224,6 +1237,7 @@ class DocSearch {
1224
1237
tupleOrUnit ,
1225
1238
// reference matches `&`
1226
1239
reference ,
1240
+ pointer ,
1227
1241
// never matches `!`
1228
1242
never ,
1229
1243
] = await Promise . all ( [
@@ -1239,6 +1253,7 @@ class DocSearch {
1239
1253
nn . search ( "unit" ) ,
1240
1254
nn . search ( "()" ) ,
1241
1255
nn . search ( "reference" ) ,
1256
+ nn . search ( "pointer" ) ,
1242
1257
nn . search ( "never" ) ,
1243
1258
] ) ;
1244
1259
/**
@@ -1270,6 +1285,7 @@ class DocSearch {
1270
1285
this . typeNameIdOfUnit = await first ( unit , TY_PRIMITIVE , "" ) ;
1271
1286
this . typeNameIdOfTupleOrUnit = await first ( tupleOrUnit , TY_PRIMITIVE , "" ) ;
1272
1287
this . typeNameIdOfReference = await first ( reference , TY_PRIMITIVE , "" ) ;
1288
+ this . typeNameIdOfPointer = await first ( pointer , TY_PRIMITIVE , "" ) ;
1273
1289
this . typeNameIdOfHof = await first ( hof , TY_PRIMITIVE , "" ) ;
1274
1290
this . typeNameIdOfNever = await first ( never , TY_PRIMITIVE , "" ) ;
1275
1291
}
@@ -2309,6 +2325,25 @@ class DocSearch {
2309
2325
} , result ) ,
2310
2326
) ;
2311
2327
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 ;
2312
2347
} else if (
2313
2348
fnType . id === this . typeNameIdOfFn ||
2314
2349
fnType . id === this . typeNameIdOfFnMut ||
0 commit comments