Make {Type,Path}::generics return iterators.

Instead of a `Vec`, to avoid some allocations.
This commit is contained in:
Nicholas Nethercote 2025-05-23 13:42:10 +10:00
parent b9b482e9d9
commit 750f57fafe
2 changed files with 11 additions and 18 deletions

View file

@ -1601,9 +1601,7 @@ impl Type {
a.def_id() == b.def_id()
&& a.generics()
.zip(b.generics())
.map(|(ag, bg)| {
ag.iter().zip(bg.iter()).all(|(at, bt)| at.is_doc_subtype_of(bt, cache))
})
.map(|(ag, bg)| ag.zip(bg).all(|(at, bt)| at.is_doc_subtype_of(bt, cache)))
.unwrap_or(true)
}
// Other cases, such as primitives, just use recursion.
@ -1676,7 +1674,7 @@ impl Type {
}
}
pub(crate) fn generics(&self) -> Option<Vec<&Type>> {
pub(crate) fn generics<'a>(&'a self) -> Option<impl Iterator<Item = &'a Type>> {
match self {
Type::Path { path, .. } => path.generics(),
_ => None,
@ -2234,17 +2232,13 @@ impl Path {
self.segments.last().map(|seg| &seg.args)
}
pub(crate) fn generics(&self) -> Option<Vec<&Type>> {
pub(crate) fn generics<'a>(&'a self) -> Option<impl Iterator<Item = &'a Type>> {
self.segments.last().and_then(|seg| {
if let GenericArgs::AngleBracketed { ref args, .. } = seg.args {
Some(
args.iter()
.filter_map(|arg| match arg {
GenericArg::Type(ty) => Some(ty),
_ => None,
})
.collect(),
)
Some(args.iter().filter_map(|arg| match arg {
GenericArg::Type(ty) => Some(ty),
_ => None,
}))
} else {
None
}

View file

@ -1119,8 +1119,8 @@ impl clean::Impl {
write!(f, "!")?;
}
if self.kind.is_fake_variadic()
&& let generics = ty.generics()
&& let &[inner_type] = generics.as_ref().map_or(&[][..], |v| &v[..])
&& let Some(mut generics) = ty.generics()
&& let (Some(inner_type), None) = (generics.next(), generics.next())
{
let last = ty.last();
if f.alternate() {
@ -1198,11 +1198,10 @@ impl clean::Impl {
fmt_type(&bare_fn.decl.output, f, use_absolute, cx)?;
}
} else if let clean::Type::Path { path } = type_
&& let Some(generics) = path.generics()
&& generics.len() == 1
&& let Some(mut generics) = path.generics()
&& let (Some(ty), None) = (generics.next(), generics.next())
&& self.kind.is_fake_variadic()
{
let ty = generics[0];
let wrapper = print_anchor(path.def_id(), path.last(), cx);
if f.alternate() {
write!(f, "{wrapper:#}&lt;")?;