From 8f76773041cf730410ad5287c07d64a797d3b8e3 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Thu, 20 Nov 2025 20:49:31 +0100 Subject: [PATCH] Return `impl Display` instead of `String` in `fragment` --- src/librustdoc/clean/types.rs | 4 +++- src/librustdoc/html/format.rs | 39 ++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 7669a2b1a579..f1b0f4a68bea 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -1,3 +1,4 @@ +use std::fmt::Write; use std::hash::Hash; use std::path::PathBuf; use std::sync::{Arc, OnceLock as OnceCell}; @@ -524,7 +525,8 @@ impl Item { debug!(?url); match fragment { Some(UrlFragment::Item(def_id)) => { - url.push_str(&crate::html::format::fragment(*def_id, cx.tcx())) + write!(url, "{}", crate::html::format::fragment(*def_id, cx.tcx())) + .unwrap(); } Some(UrlFragment::UserWritten(raw)) => { url.push('#'); diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index 5892eecea35e..dd91cec531f5 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -833,26 +833,27 @@ fn print_higher_ranked_params_with_space( }) } -pub(crate) fn fragment(did: DefId, tcx: TyCtxt<'_>) -> String { - let def_kind = tcx.def_kind(did); - match def_kind { - DefKind::AssocTy | DefKind::AssocFn | DefKind::AssocConst | DefKind::Variant => { - let item_type = ItemType::from_def_id(did, tcx); - format!("#{}.{}", item_type.as_str(), tcx.item_name(did)) +pub(crate) fn fragment(did: DefId, tcx: TyCtxt<'_>) -> impl Display { + fmt::from_fn(move |f| { + let def_kind = tcx.def_kind(did); + match def_kind { + DefKind::AssocTy | DefKind::AssocFn | DefKind::AssocConst | DefKind::Variant => { + let item_type = ItemType::from_def_id(did, tcx); + write!(f, "#{}.{}", item_type.as_str(), tcx.item_name(did)) + } + DefKind::Field => { + let parent_def_id = tcx.parent(did); + f.write_char('#')?; + if tcx.def_kind(parent_def_id) == DefKind::Variant { + write!(f, "variant.{}.field", tcx.item_name(parent_def_id).as_str())?; + } else { + f.write_str("structfield")?; + }; + write!(f, ".{}", tcx.item_name(did)) + } + _ => Ok(()), } - DefKind::Field => { - let parent_def_id = tcx.parent(did); - let s; - let kind = if tcx.def_kind(parent_def_id) == DefKind::Variant { - s = format!("variant.{}.field", tcx.item_name(parent_def_id).as_str()); - &s - } else { - "structfield" - }; - format!("#{kind}.{}", tcx.item_name(did)) - } - _ => String::new(), - } + }) } pub(crate) fn print_anchor(did: DefId, text: Symbol, cx: &Context<'_>) -> impl Display {