Skip to content

Commit 4b730a2

Browse files
committed
rustdoc search: accept *mut T syntax for raw pointers
1 parent ead9f58 commit 4b730a2

File tree

1 file changed

+45
-30
lines changed

1 file changed

+45
-30
lines changed

src/librustdoc/html/static/js/search.js

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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(pos, 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

Comments
 (0)