Skip to content

Commit

Permalink
Rollup merge of rust-lang#90727 - GuillaumeGomez:remove-potential-use…
Browse files Browse the repository at this point in the history
…less-search-index-data, r=notriddle,camelid

Remove potential useless data for search index

I uncovered this case when working on rust-lang#90726 to debug rust-lang#90385.

Explanations: if we have a full generic, we check if it has generics then we do the following:
 * If it has only one generic, we remove one nested level in order to not keep the "parent" generic (since it has empty name, it's useless after all).
 * Otherwise we add it alongside its generics.

However, I didn't handle the case where a generic had no generics. Meaning that we were adding items with empty names in the search index. So basically useless data in the search index.

r? `@camelid`
  • Loading branch information
matthiaskrgr authored Nov 10, 2021
2 parents 858fea4 + 8d5ef32 commit b31f019
Showing 1 changed file with 46 additions and 39 deletions.
85 changes: 46 additions & 39 deletions src/librustdoc/html/render/cache.rs
Original file line number Diff line number Diff line change
Expand Up @@ -258,45 +258,52 @@ crate fn get_real_types<'tcx>(
) {
let is_full_generic = ty.is_full_generic();

if is_full_generic && generics.len() == 1 {
// In this case, no need to go through an intermediate state if the generics
// contains only one element.
//
// For example:
//
// fn foo<T: Display>(r: Option<T>) {}
//
// In this case, it would contain:
//
// ```
// [{
// name: "option",
// generics: [{
// name: "",
// generics: [
// name: "Display",
// generics: []
// }]
// }]
// }]
// ```
//
// After removing the intermediate (unnecessary) full generic, it'll become:
//
// ```
// [{
// name: "option",
// generics: [{
// name: "Display",
// generics: []
// }]
// }]
// ```
//
// To be noted that it can work if there is ONLY ONE generic, otherwise we still
// need to keep it as is!
res.push(generics.pop().unwrap());
return;
if is_full_generic {
if generics.is_empty() {
// This is a type parameter with no trait bounds (for example: `T` in
// `fn f<T>(p: T)`, so not useful for the rustdoc search because we would end up
// with an empty type with an empty name. Let's just discard it.
return;
} else if generics.len() == 1 {
// In this case, no need to go through an intermediate state if the type parameter
// contains only one trait bound.
//
// For example:
//
// `fn foo<T: Display>(r: Option<T>) {}`
//
// In this case, it would contain:
//
// ```
// [{
// name: "option",
// generics: [{
// name: "",
// generics: [
// name: "Display",
// generics: []
// }]
// }]
// }]
// ```
//
// After removing the intermediate (unnecessary) type parameter, it'll become:
//
// ```
// [{
// name: "option",
// generics: [{
// name: "Display",
// generics: []
// }]
// }]
// ```
//
// To be noted that it can work if there is ONLY ONE trait bound, otherwise we still
// need to keep it as is!
res.push(generics.pop().unwrap());
return;
}
}
let mut index_ty = get_index_type(&ty, generics);
if index_ty.name.as_ref().map(|s| s.is_empty()).unwrap_or(true) {
Expand Down

0 comments on commit b31f019

Please sign in to comment.