fix(rustdoc): generics search
This commit adds a test case for generics, re-adds generics data
to the search index, and tweaks function indexing to use less space in JSON.
This reverts commit 14ca89446c.
This commit is contained in:
parent
3cb1c11340
commit
cedd2425b6
8 changed files with 191 additions and 19 deletions
|
|
@ -219,6 +219,7 @@ crate fn get_index_search_type<'tcx>(
|
|||
fn get_index_type(clean_type: &clean::Type) -> RenderType {
|
||||
RenderType {
|
||||
name: get_index_type_name(clean_type, true).map(|s| s.as_str().to_ascii_lowercase()),
|
||||
generics: get_generics(clean_type),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -251,6 +252,23 @@ fn get_index_type_name(clean_type: &clean::Type, accept_generic: bool) -> Option
|
|||
}
|
||||
}
|
||||
|
||||
/// Return a list of generic parameters for use in the search index.
|
||||
///
|
||||
/// This function replaces bounds with types, so that `T where T: Debug` just becomes `Debug`.
|
||||
/// It does return duplicates, and that's intentional, since search queries like `Result<usize, usize>`
|
||||
/// are supposed to match only results where both parameters are `usize`.
|
||||
fn get_generics(clean_type: &clean::Type) -> Option<Vec<String>> {
|
||||
clean_type.generics().and_then(|types| {
|
||||
let r = types
|
||||
.iter()
|
||||
.filter_map(|t| {
|
||||
get_index_type_name(t, false).map(|name| name.as_str().to_ascii_lowercase())
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
if r.is_empty() { None } else { Some(r) }
|
||||
})
|
||||
}
|
||||
|
||||
/// The point of this function is to replace bounds with types.
|
||||
///
|
||||
/// i.e. `[T, U]` when you have the following bounds: `T: Display, U: Option<T>` will return
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ crate struct IndexItem {
|
|||
#[derive(Debug)]
|
||||
crate struct RenderType {
|
||||
name: Option<String>,
|
||||
generics: Option<Vec<String>>,
|
||||
}
|
||||
|
||||
/// Full type of functions/methods in the search index.
|
||||
|
|
@ -149,7 +150,13 @@ impl Serialize for TypeWithKind {
|
|||
where
|
||||
S: Serializer,
|
||||
{
|
||||
(&self.ty.name, self.kind).serialize(serializer)
|
||||
let mut seq = serializer.serialize_seq(None)?;
|
||||
seq.serialize_element(&self.ty.name)?;
|
||||
seq.serialize_element(&self.kind)?;
|
||||
if let Some(generics) = &self.ty.generics {
|
||||
seq.serialize_element(generics)?;
|
||||
}
|
||||
seq.end()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue