Skip to content

Commit 750f57f

Browse files
committed
Make {Type,Path}::generics return iterators.
Instead of a `Vec`, to avoid some allocations.
1 parent b9b482e commit 750f57f

File tree

2 files changed

+11
-18
lines changed

2 files changed

+11
-18
lines changed

src/librustdoc/clean/types.rs

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1601,9 +1601,7 @@ impl Type {
16011601
a.def_id() == b.def_id()
16021602
&& a.generics()
16031603
.zip(b.generics())
1604-
.map(|(ag, bg)| {
1605-
ag.iter().zip(bg.iter()).all(|(at, bt)| at.is_doc_subtype_of(bt, cache))
1606-
})
1604+
.map(|(ag, bg)| ag.zip(bg).all(|(at, bt)| at.is_doc_subtype_of(bt, cache)))
16071605
.unwrap_or(true)
16081606
}
16091607
// Other cases, such as primitives, just use recursion.
@@ -1676,7 +1674,7 @@ impl Type {
16761674
}
16771675
}
16781676

1679-
pub(crate) fn generics(&self) -> Option<Vec<&Type>> {
1677+
pub(crate) fn generics<'a>(&'a self) -> Option<impl Iterator<Item = &'a Type>> {
16801678
match self {
16811679
Type::Path { path, .. } => path.generics(),
16821680
_ => None,
@@ -2234,17 +2232,13 @@ impl Path {
22342232
self.segments.last().map(|seg| &seg.args)
22352233
}
22362234

2237-
pub(crate) fn generics(&self) -> Option<Vec<&Type>> {
2235+
pub(crate) fn generics<'a>(&'a self) -> Option<impl Iterator<Item = &'a Type>> {
22382236
self.segments.last().and_then(|seg| {
22392237
if let GenericArgs::AngleBracketed { ref args, .. } = seg.args {
2240-
Some(
2241-
args.iter()
2242-
.filter_map(|arg| match arg {
2243-
GenericArg::Type(ty) => Some(ty),
2244-
_ => None,
2245-
})
2246-
.collect(),
2247-
)
2238+
Some(args.iter().filter_map(|arg| match arg {
2239+
GenericArg::Type(ty) => Some(ty),
2240+
_ => None,
2241+
}))
22482242
} else {
22492243
None
22502244
}

src/librustdoc/html/format.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,8 +1119,8 @@ impl clean::Impl {
11191119
write!(f, "!")?;
11201120
}
11211121
if self.kind.is_fake_variadic()
1122-
&& let generics = ty.generics()
1123-
&& let &[inner_type] = generics.as_ref().map_or(&[][..], |v| &v[..])
1122+
&& let Some(mut generics) = ty.generics()
1123+
&& let (Some(inner_type), None) = (generics.next(), generics.next())
11241124
{
11251125
let last = ty.last();
11261126
if f.alternate() {
@@ -1198,11 +1198,10 @@ impl clean::Impl {
11981198
fmt_type(&bare_fn.decl.output, f, use_absolute, cx)?;
11991199
}
12001200
} else if let clean::Type::Path { path } = type_
1201-
&& let Some(generics) = path.generics()
1202-
&& generics.len() == 1
1201+
&& let Some(mut generics) = path.generics()
1202+
&& let (Some(ty), None) = (generics.next(), generics.next())
12031203
&& self.kind.is_fake_variadic()
12041204
{
1205-
let ty = generics[0];
12061205
let wrapper = print_anchor(path.def_id(), path.last(), cx);
12071206
if f.alternate() {
12081207
write!(f, "{wrapper:#}&lt;")?;

0 commit comments

Comments
 (0)