about summary refs log tree commit diff
diff options
context:
space:
mode:
authorNicholas Nethercote <n.nethercote@gmail.com>2025-05-23 13:42:10 +1000
committerNicholas Nethercote <n.nethercote@gmail.com>2025-05-26 15:09:40 +1000
commit750f57fafe43a07758ecf8e2622ebba2967966ae (patch)
tree65665e33421baf42e0f792b99ba2c578f62211b2
parentb9b482e9d9ea18fa5dcb276c704fb9bec57b9e59 (diff)
downloadrust-750f57fafe43a07758ecf8e2622ebba2967966ae.tar.gz
rust-750f57fafe43a07758ecf8e2622ebba2967966ae.zip
Make `{Type,Path}::generics` return iterators.
Instead of a `Vec`, to avoid some allocations.
-rw-r--r--src/librustdoc/clean/types.rs20
-rw-r--r--src/librustdoc/html/format.rs9
2 files changed, 11 insertions, 18 deletions
diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs
index 07ecd98f775..bfc02b6b1d4 100644
--- a/src/librustdoc/clean/types.rs
+++ b/src/librustdoc/clean/types.rs
@@ -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
             }
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index 1cb6e89218a..0d7a409d481 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -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;")?;