Skip to content

Commit 7798185

Browse files
authored
Rollup merge of #145731 - lolbinarycat:rustdoc-search-generic-pointer-142385, r=notriddle
Make raw pointers work in type-based search fixes #142385
2 parents 566c13c + 401f40f commit 7798185

File tree

5 files changed

+351
-41
lines changed

5 files changed

+351
-41
lines changed

src/librustdoc/html/render/search_index.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1494,7 +1494,9 @@ pub(crate) fn build_index(
14941494
let search_unbox = match id {
14951495
RenderTypeId::Mut => false,
14961496
RenderTypeId::DefId(defid) => utils::has_doc_flag(tcx, defid, sym::search_unbox),
1497-
RenderTypeId::Primitive(PrimitiveType::Reference | PrimitiveType::Tuple) => true,
1497+
RenderTypeId::Primitive(
1498+
PrimitiveType::Reference | PrimitiveType::RawPointer | PrimitiveType::Tuple,
1499+
) => true,
14981500
RenderTypeId::Primitive(..) => false,
14991501
RenderTypeId::AssociatedType(..) => false,
15001502
// this bool is only used by `insert_into_map`, so it doesn't matter what we set here
@@ -1855,7 +1857,7 @@ fn get_index_type_id(
18551857
}
18561858
clean::Primitive(p) => Some(RenderTypeId::Primitive(p)),
18571859
clean::BorrowedRef { .. } => Some(RenderTypeId::Primitive(clean::PrimitiveType::Reference)),
1858-
clean::RawPointer(_, ref type_) => get_index_type_id(type_, rgen),
1860+
clean::RawPointer { .. } => Some(RenderTypeId::Primitive(clean::PrimitiveType::RawPointer)),
18591861
// The type parameters are converted to generics in `simplify_fn_type`
18601862
clean::Slice(_) => Some(RenderTypeId::Primitive(clean::PrimitiveType::Slice)),
18611863
clean::Array(_, _) => Some(RenderTypeId::Primitive(clean::PrimitiveType::Array)),
@@ -2113,7 +2115,8 @@ fn simplify_fn_type<'a, 'tcx>(
21132115
generics: Some(ty_generics),
21142116
});
21152117
}
2116-
Type::BorrowedRef { lifetime: _, mutability, ref type_ } => {
2118+
Type::BorrowedRef { lifetime: _, mutability, ref type_ }
2119+
| Type::RawPointer(mutability, ref type_) => {
21172120
let mut ty_generics = Vec::new();
21182121
if mutability.is_mut() {
21192122
ty_generics.push(RenderType {

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

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

tests/rustdoc-js-std/parser-errors.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@ const PARSED = [
1515
returned: [],
1616
error: "Found generics without a path",
1717
},
18-
{
19-
query: '-> *',
20-
elems: [],
21-
foundElems: 0,
22-
userQuery: "-> *",
23-
returned: [],
24-
error: "Unexpected `*` after ` ` (not a valid identifier)",
25-
},
2618
{
2719
query: 'a<"P">',
2820
elems: [],

0 commit comments

Comments
 (0)