From 86a2e85e5af4284b5e7911a479748286b70b4b54 Mon Sep 17 00:00:00 2001 From: Yotam Ofek Date: Sat, 29 Nov 2025 14:56:07 +0200 Subject: [PATCH] Separate out some `IndexItem` fields into a new struct and DRY --- src/librustdoc/formats/cache.rs | 20 ++++--------- src/librustdoc/html/render/mod.rs | 34 ++++++++++++++++++---- src/librustdoc/html/render/search_index.rs | 25 ++++++---------- 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index 56f10b03d62de..0f8306ba70108 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -15,9 +15,7 @@ use crate::core::DocContext; use crate::fold::DocFolder; use crate::formats::Impl; use crate::formats::item_type::ItemType; -use crate::html::markdown::short_markdown_summary; -use crate::html::render::IndexItem; -use crate::html::render::search_index::get_function_type_for_search; +use crate::html::render::{IndexItem, IndexItemInfo}; use crate::visit_lib::RustdocEffectiveVisibilities; /// This cache is used to store information about the [`clean::Crate`] being @@ -574,7 +572,6 @@ fn add_item_to_search_index(tcx: TyCtxt<'_>, cache: &mut Cache, item: &clean::It debug_assert!(!item.is_stripped()); - let desc = short_markdown_summary(&item.doc_value(), &item.link_names(cache)); // For searching purposes, a re-export is a duplicate if: // // - It's either an inline, or a true re-export @@ -585,30 +582,25 @@ fn add_item_to_search_index(tcx: TyCtxt<'_>, cache: &mut Cache, item: &clean::It _ => item_def_id, }; let (impl_id, trait_parent) = cache.parent_stack_last_impl_and_trait_id(); - let search_type = get_function_type_for_search( - item, + let info = IndexItemInfo::new( tcx, - clean_impl_generics(cache.parent_stack.last()).as_ref(), - parent_did, cache, + item, + parent_did, + clean_impl_generics(cache.parent_stack.last()).as_ref(), ); - let aliases = item.attrs.get_doc_aliases(); - let deprecation = item.deprecation(tcx); let index_item = IndexItem { ty: item.type_(), defid: Some(defid), name, module_path: parent_path.to_vec(), - desc, parent: parent_did, parent_idx: None, trait_parent, trait_parent_idx: None, exact_module_path: None, impl_id, - search_type, - aliases, - deprecation, + info, }; cache.search_index.push(index_item); diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 4529f5a8c0163..ee5a983ece2b9 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -66,7 +66,7 @@ use tracing::{debug, info}; pub(crate) use self::context::*; pub(crate) use self::span_map::{LinkFromSrc, collect_spans_and_sources}; pub(crate) use self::write_shared::*; -use crate::clean::{self, ItemId, RenderedLink}; +use crate::clean::{self, Item, ItemId, RenderedLink}; use crate::display::{Joined as _, MaybeDisplay as _}; use crate::error::Error; use crate::formats::Impl; @@ -79,7 +79,7 @@ use crate::html::format::{ print_impl, print_path, print_type, print_where_clause, visibility_print_with_space, }; use crate::html::markdown::{ - HeadingOffset, IdMap, Markdown, MarkdownItemInfo, MarkdownSummaryLine, + HeadingOffset, IdMap, Markdown, MarkdownItemInfo, MarkdownSummaryLine, short_markdown_summary, }; use crate::html::static_files::SCRAPE_EXAMPLES_HELP_MD; use crate::html::{highlight, sources}; @@ -124,6 +124,31 @@ enum RenderMode { // Helper structs for rendering items/sidebars and carrying along contextual // information +#[derive(Debug)] +pub(crate) struct IndexItemInfo { + pub(crate) desc: String, + pub(crate) search_type: Option, + pub(crate) aliases: Box<[Symbol]>, + pub(crate) deprecation: Option, +} + +impl IndexItemInfo { + pub(crate) fn new( + tcx: TyCtxt<'_>, + cache: &Cache, + item: &Item, + parent_did: Option, + impl_generics: Option<&(clean::Type, clean::Generics)>, + ) -> Self { + let desc = short_markdown_summary(&item.doc_value(), &item.link_names(cache)); + let search_type = + search_index::get_function_type_for_search(item, tcx, impl_generics, parent_did, cache); + let aliases = item.attrs.get_doc_aliases(); + let deprecation = item.deprecation(tcx); + Self { desc, search_type, aliases, deprecation } + } +} + /// Struct representing one entry in the JS search index. These are all emitted /// by hand to a large JS file at the end of cache-creation. #[derive(Debug)] @@ -132,16 +157,13 @@ pub(crate) struct IndexItem { pub(crate) defid: Option, pub(crate) name: Symbol, pub(crate) module_path: Vec, - pub(crate) desc: String, pub(crate) parent: Option, pub(crate) parent_idx: Option, pub(crate) trait_parent: Option, pub(crate) trait_parent_idx: Option, pub(crate) exact_module_path: Option>, pub(crate) impl_id: Option, - pub(crate) search_type: Option, - pub(crate) aliases: Box<[Symbol]>, - pub(crate) deprecation: Option, + pub(crate) info: IndexItemInfo, } /// A type used for the search index. diff --git a/src/librustdoc/html/render/search_index.rs b/src/librustdoc/html/render/search_index.rs index 12b207dda5693..a83be5d34e9fb 100644 --- a/src/librustdoc/html/render/search_index.rs +++ b/src/librustdoc/html/render/search_index.rs @@ -29,7 +29,9 @@ use crate::error::Error; use crate::formats::cache::{Cache, OrphanImplItem}; use crate::formats::item_type::ItemType; use crate::html::markdown::short_markdown_summary; -use crate::html::render::{self, IndexItem, IndexItemFunctionType, RenderType, RenderTypeId}; +use crate::html::render::{ + self, IndexItem, IndexItemFunctionType, IndexItemInfo, RenderType, RenderTypeId, +}; #[derive(Clone, Debug, Default, Deserialize, Serialize)] pub(crate) struct SerializedSearchIndex { @@ -1261,28 +1263,19 @@ pub(crate) fn build_index( &cache.orphan_impl_items { if let Some((fqp, _)) = cache.paths.get(&parent) { - let desc = short_markdown_summary(&item.doc_value(), &item.link_names(cache)); + let info = IndexItemInfo::new(tcx, cache, item, Some(parent), impl_generics.as_ref()); search_index.push(IndexItem { ty: item.type_(), defid: item.item_id.as_def_id(), name: item.name.unwrap(), module_path: fqp[..fqp.len() - 1].to_vec(), - desc, parent: Some(parent), parent_idx: None, trait_parent, trait_parent_idx: None, exact_module_path: None, impl_id, - search_type: get_function_type_for_search( - item, - tcx, - impl_generics.as_ref(), - Some(parent), - cache, - ), - aliases: item.attrs.get_doc_aliases(), - deprecation: item.deprecation(tcx), + info, }); } } @@ -1519,7 +1512,7 @@ pub(crate) fn build_index( trait_parent: item.trait_parent_idx, module_path, exact_module_path, - deprecated: item.deprecation.is_some(), + deprecated: item.info.deprecation.is_some(), associated_item_disambiguator: if let Some(impl_id) = item.impl_id && let Some(parent_idx) = item.parent_idx && associated_item_duplicates @@ -1534,12 +1527,12 @@ pub(crate) fn build_index( }, krate: crate_idx, }, - item.desc.to_string(), + item.info.desc.to_string(), ); // Aliases // ------- - for alias in &item.aliases[..] { + for alias in &item.info.aliases { serialized_index.push_alias(alias.as_str().to_string(), new_entry_id); } @@ -1812,7 +1805,7 @@ pub(crate) fn build_index( _ => {} } } - if let Some(search_type) = &mut item.search_type { + if let Some(search_type) = &mut item.info.search_type { let mut used_in_function_inputs = BTreeSet::new(); let mut used_in_function_output = BTreeSet::new(); for item in &mut search_type.inputs {