rustdoc search: accept *mut T syntax for raw pointers

This commit is contained in:
binarycat 2025-08-21 16:12:07 -05:00
parent ead9f58251
commit 4b730a2010

View file

@ -587,6 +587,44 @@ function getNextElem(query, parserState, elems, isInGenerics) {
/** @type {rustdoc.ParserQueryElement[]} */
const generics = [];
/** @type {function(string, string): void} */
const handleRefOrPtr = (chr, name) => {
if (parserState.typeFilter !== null && parserState.typeFilter !== "primitive") {
throw [
"Invalid search type: primitive ",
chr,
" and ",
parserState.typeFilter,
" both specified",
];
}
parserState.typeFilter = null;
parserState.pos += 1;
let c = parserState.userQuery[parserState.pos];
while (c === " " && parserState.pos < parserState.length) {
parserState.pos += 1;
c = parserState.userQuery[parserState.pos];
}
const generics = [];
if (parserState.userQuery.slice(parserState.pos, parserState.pos + 3) === "mut") {
generics.push(makePrimitiveElement("mut", { typeFilter: "keyword" }));
parserState.pos += 3;
c = parserState.userQuery[parserState.pos];
} else if (chr === "*" && parserState.userQuery.slice(pos, pos + 5) === "const") {
// make *const T parse the same as *T
parserState.pos += 5;
c = parserState.userQuery[parserState.pos];
}
while (c === " " && parserState.pos < parserState.length) {
parserState.pos += 1;
c = parserState.userQuery[parserState.pos];
}
if (!isEndCharacter(c) && parserState.pos < parserState.length) {
getFilteredNextElem(query, parserState, generics, isInGenerics);
}
elems.push(makePrimitiveElement(name, { generics }));
}
skipWhitespace(parserState);
let start = parserState.pos;
let end;
@ -636,36 +674,9 @@ function getNextElem(query, parserState, elems, isInGenerics) {
elems.push(makePrimitiveElement(name, { bindingName, generics }));
}
} else if (parserState.userQuery[parserState.pos] === "&") {
if (parserState.typeFilter !== null && parserState.typeFilter !== "primitive") {
throw [
"Invalid search type: primitive ",
"&",
" and ",
parserState.typeFilter,
" both specified",
];
}
parserState.typeFilter = null;
parserState.pos += 1;
let c = parserState.userQuery[parserState.pos];
while (c === " " && parserState.pos < parserState.length) {
parserState.pos += 1;
c = parserState.userQuery[parserState.pos];
}
const generics = [];
if (parserState.userQuery.slice(parserState.pos, parserState.pos + 3) === "mut") {
generics.push(makePrimitiveElement("mut", { typeFilter: "keyword" }));
parserState.pos += 3;
c = parserState.userQuery[parserState.pos];
}
while (c === " " && parserState.pos < parserState.length) {
parserState.pos += 1;
c = parserState.userQuery[parserState.pos];
}
if (!isEndCharacter(c) && parserState.pos < parserState.length) {
getFilteredNextElem(query, parserState, generics, isInGenerics);
}
elems.push(makePrimitiveElement("reference", { generics }));
handleRefOrPtr("&", "reference");
} else if (parserState.userQuery[parserState.pos] === "*") {
handleRefOrPtr("*", "pointer");
} else {
const isStringElem = parserState.userQuery[start] === "\"";
// We handle the strings on their own mostly to make code easier to follow.
@ -1185,6 +1196,7 @@ class DocSearch {
this.typeNameIdOfUnit = -1;
this.typeNameIdOfTupleOrUnit = -1;
this.typeNameIdOfReference = -1;
this.typeNameIdOfPointer = -1;
this.typeNameIdOfHof = -1;
this.utf8decoder = new TextDecoder();
@ -1224,6 +1236,7 @@ class DocSearch {
tupleOrUnit,
// reference matches `&`
reference,
pointer,
// never matches `!`
never,
] = await Promise.all([
@ -1239,6 +1252,7 @@ class DocSearch {
nn.search("unit"),
nn.search("()"),
nn.search("reference"),
nn.search("pointer"),
nn.search("never"),
]);
/**
@ -1270,6 +1284,7 @@ class DocSearch {
this.typeNameIdOfUnit = await first(unit, TY_PRIMITIVE, "");
this.typeNameIdOfTupleOrUnit = await first(tupleOrUnit, TY_PRIMITIVE, "");
this.typeNameIdOfReference = await first(reference, TY_PRIMITIVE, "");
this.typeNameIdOfPointer = await first(pointer, TY_PRIMITIVE, "");
this.typeNameIdOfHof = await first(hof, TY_PRIMITIVE, "");
this.typeNameIdOfNever = await first(never, TY_PRIMITIVE, "");
}