diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index d99b40c0a38d..91b4b3ba1eba 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -709,19 +709,22 @@ fn resolved_path(
if w.alternate() {
write!(w, "{}{:#}", last.name, last.args.print(cx))?;
} else {
- let path = if use_absolute {
- if let Ok((_, _, fqp)) = href(did, cx) {
- format!(
- "{path}::{anchor}",
- path = join_with_double_colon(&fqp[..fqp.len() - 1]),
- anchor = anchor(did, *fqp.last().unwrap(), cx)
- )
+ let path = fmt::from_fn(|f| {
+ if use_absolute {
+ if let Ok((_, _, fqp)) = href(did, cx) {
+ write!(
+ f,
+ "{path}::{anchor}",
+ path = join_with_double_colon(&fqp[..fqp.len() - 1]),
+ anchor = anchor(did, *fqp.last().unwrap(), cx)
+ )
+ } else {
+ write!(f, "{}", last.name)
+ }
} else {
- last.name.to_string()
+ write!(f, "{}", anchor(did, last.name, cx))
}
- } else {
- anchor(did, last.name, cx).to_string()
- };
+ });
write!(w, "{path}{args}", args = last.args.print(cx))?;
}
Ok(())
@@ -749,16 +752,20 @@ fn primitive_link_fragment(
match m.primitive_locations.get(&prim) {
Some(&def_id) if def_id.is_local() => {
let len = cx.current.len();
- let path = if len == 0 {
- let cname_sym = ExternalCrate { crate_num: def_id.krate }.name(cx.tcx());
- format!("{cname_sym}/")
- } else {
- "../".repeat(len - 1)
- };
+ let path = fmt::from_fn(|f| {
+ if len == 0 {
+ let cname_sym = ExternalCrate { crate_num: def_id.krate }.name(cx.tcx());
+ write!(f, "{cname_sym}/")?;
+ } else {
+ for _ in 0..(len - 1) {
+ f.write_str("../")?;
+ }
+ }
+ Ok(())
+ });
write!(
f,
- "",
- path,
+ "",
prim.as_sym()
)?;
needs_termination = true;
diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs
index dab9ba79761a..146bdd340697 100644
--- a/src/librustdoc/html/render/context.rs
+++ b/src/librustdoc/html/render/context.rs
@@ -266,12 +266,12 @@ impl<'tcx> Context<'tcx> {
// preventing an infinite redirection loop in the generated
// documentation.
- let mut path = String::new();
- for name in &names[..names.len() - 1] {
- path.push_str(name.as_str());
- path.push('/');
- }
- let _ = write!(path, "{}", item_path(ty, names.last().unwrap().as_str()));
+ let path = fmt::from_fn(|f| {
+ for name in &names[..names.len() - 1] {
+ write!(f, "{name}/")?;
+ }
+ write!(f, "{}", item_path(ty, names.last().unwrap().as_str()))
+ });
match self.shared.redirections {
Some(ref redirections) => {
let mut current_path = String::new();