1
Fork 0

rustdoc: use LocalDefId for inline stmt

It's never a cross-crate DefId, so save space by not storing it.
This commit is contained in:
Michael Howell 2024-08-30 10:16:41 -07:00
parent 878f49f5ff
commit e80c9ac3e2
3 changed files with 22 additions and 20 deletions

View file

@ -5,7 +5,7 @@ use std::sync::Arc;
use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::fx::FxHashSet;
use rustc_hir::def::{DefKind, Res}; use rustc_hir::def::{DefKind, Res};
use rustc_hir::def_id::{DefId, DefIdSet, LocalModDefId}; use rustc_hir::def_id::{DefId, DefIdSet, LocalDefId, LocalModDefId};
use rustc_hir::Mutability; use rustc_hir::Mutability;
use rustc_metadata::creader::{CStore, LoadedMacro}; use rustc_metadata::creader::{CStore, LoadedMacro};
use rustc_middle::ty::fast_reject::SimplifiedType; use rustc_middle::ty::fast_reject::SimplifiedType;
@ -43,7 +43,7 @@ pub(crate) fn try_inline(
cx: &mut DocContext<'_>, cx: &mut DocContext<'_>,
res: Res, res: Res,
name: Symbol, name: Symbol,
attrs: Option<(&[ast::Attribute], Option<DefId>)>, attrs: Option<(&[ast::Attribute], Option<LocalDefId>)>,
visited: &mut DefIdSet, visited: &mut DefIdSet,
) -> Option<Vec<clean::Item>> { ) -> Option<Vec<clean::Item>> {
let did = res.opt_def_id()?; let did = res.opt_def_id()?;
@ -157,7 +157,7 @@ pub(crate) fn try_inline(
kind, kind,
did, did,
name, name,
import_def_id.and_then(|def_id| def_id.as_local()), import_def_id,
None, None,
); );
// The visibility needs to reflect the one from the reexport and not from the "source" DefId. // The visibility needs to reflect the one from the reexport and not from the "source" DefId.
@ -198,7 +198,7 @@ pub(crate) fn try_inline_glob(
visited, visited,
inlined_names, inlined_names,
Some(&reexports), Some(&reexports),
Some((attrs, Some(import.owner_id.def_id.to_def_id()))), Some((attrs, Some(import.owner_id.def_id))),
); );
items.retain(|item| { items.retain(|item| {
if let Some(name) = item.name { if let Some(name) = item.name {
@ -372,7 +372,7 @@ fn build_type_alias(
pub(crate) fn build_impls( pub(crate) fn build_impls(
cx: &mut DocContext<'_>, cx: &mut DocContext<'_>,
did: DefId, did: DefId,
attrs: Option<(&[ast::Attribute], Option<DefId>)>, attrs: Option<(&[ast::Attribute], Option<LocalDefId>)>,
ret: &mut Vec<clean::Item>, ret: &mut Vec<clean::Item>,
) { ) {
let _prof_timer = cx.tcx.sess.prof.generic_activity("build_inherent_impls"); let _prof_timer = cx.tcx.sess.prof.generic_activity("build_inherent_impls");
@ -405,7 +405,7 @@ pub(crate) fn build_impls(
pub(crate) fn merge_attrs( pub(crate) fn merge_attrs(
cx: &mut DocContext<'_>, cx: &mut DocContext<'_>,
old_attrs: &[ast::Attribute], old_attrs: &[ast::Attribute],
new_attrs: Option<(&[ast::Attribute], Option<DefId>)>, new_attrs: Option<(&[ast::Attribute], Option<LocalDefId>)>,
) -> (clean::Attributes, Option<Arc<clean::cfg::Cfg>>) { ) -> (clean::Attributes, Option<Arc<clean::cfg::Cfg>>) {
// NOTE: If we have additional attributes (from a re-export), // NOTE: If we have additional attributes (from a re-export),
// always insert them first. This ensure that re-export // always insert them first. This ensure that re-export
@ -416,7 +416,7 @@ pub(crate) fn merge_attrs(
both.extend_from_slice(old_attrs); both.extend_from_slice(old_attrs);
( (
if let Some(item_id) = item_id { if let Some(item_id) = item_id {
Attributes::from_ast_with_additional(old_attrs, (inner, item_id)) Attributes::from_ast_with_additional(old_attrs, (inner, item_id.to_def_id()))
} else { } else {
Attributes::from_ast(&both) Attributes::from_ast(&both)
}, },
@ -431,7 +431,7 @@ pub(crate) fn merge_attrs(
pub(crate) fn build_impl( pub(crate) fn build_impl(
cx: &mut DocContext<'_>, cx: &mut DocContext<'_>,
did: DefId, did: DefId,
attrs: Option<(&[ast::Attribute], Option<DefId>)>, attrs: Option<(&[ast::Attribute], Option<LocalDefId>)>,
ret: &mut Vec<clean::Item>, ret: &mut Vec<clean::Item>,
) { ) {
if !cx.inlined.insert(did.into()) { if !cx.inlined.insert(did.into()) {
@ -641,7 +641,7 @@ fn build_module_items(
visited: &mut DefIdSet, visited: &mut DefIdSet,
inlined_names: &mut FxHashSet<(ItemType, Symbol)>, inlined_names: &mut FxHashSet<(ItemType, Symbol)>,
allowed_def_ids: Option<&DefIdSet>, allowed_def_ids: Option<&DefIdSet>,
attrs: Option<(&[ast::Attribute], Option<DefId>)>, attrs: Option<(&[ast::Attribute], Option<LocalDefId>)>,
) -> Vec<clean::Item> { ) -> Vec<clean::Item> {
let mut items = Vec::new(); let mut items = Vec::new();
@ -745,7 +745,7 @@ fn build_macro(
cx: &mut DocContext<'_>, cx: &mut DocContext<'_>,
def_id: DefId, def_id: DefId,
name: Symbol, name: Symbol,
import_def_id: Option<DefId>, import_def_id: Option<LocalDefId>,
macro_kind: MacroKind, macro_kind: MacroKind,
is_doc_hidden: bool, is_doc_hidden: bool,
) -> clean::ItemKind { ) -> clean::ItemKind {
@ -753,7 +753,7 @@ fn build_macro(
LoadedMacro::MacroDef(item_def, _) => match macro_kind { LoadedMacro::MacroDef(item_def, _) => match macro_kind {
MacroKind::Bang => { MacroKind::Bang => {
if let ast::ItemKind::MacroDef(ref def) = item_def.kind { if let ast::ItemKind::MacroDef(ref def) = item_def.kind {
let vis = cx.tcx.visibility(import_def_id.unwrap_or(def_id)); let vis = cx.tcx.visibility(import_def_id.map(|d| d.to_def_id()).unwrap_or(def_id));
clean::MacroItem(clean::Macro { clean::MacroItem(clean::Macro {
source: utils::display_macro_source( source: utils::display_macro_source(
cx, cx,

View file

@ -204,7 +204,7 @@ fn generate_item_with_correct_attrs(
let name = renamed.or(Some(name)); let name = renamed.or(Some(name));
let mut item = Item::from_def_id_and_attrs_and_parts(def_id, name, kind, Box::new(attrs), cfg); let mut item = Item::from_def_id_and_attrs_and_parts(def_id, name, kind, Box::new(attrs), cfg);
item.inline_stmt_id = import_id.map(|local| local.to_def_id()); item.inline_stmt_id = import_id;
item item
} }
@ -2927,7 +2927,7 @@ fn clean_extern_crate<'tcx>(
}) })
&& !cx.output_format.is_json(); && !cx.output_format.is_json();
let krate_owner_def_id = krate.owner_id.to_def_id(); let krate_owner_def_id = krate.owner_id.def_id;
if please_inline { if please_inline {
if let Some(items) = inline::try_inline( if let Some(items) = inline::try_inline(
cx, cx,
@ -2941,7 +2941,7 @@ fn clean_extern_crate<'tcx>(
} }
vec![Item::from_def_id_and_parts( vec![Item::from_def_id_and_parts(
krate_owner_def_id, krate_owner_def_id.to_def_id(),
Some(name), Some(name),
ExternCrateItem { src: orig_name }, ExternCrateItem { src: orig_name },
cx, cx,
@ -2988,7 +2988,7 @@ fn clean_use_statement_inner<'tcx>(
let inline_attr = attrs.lists(sym::doc).get_word_attr(sym::inline); let inline_attr = attrs.lists(sym::doc).get_word_attr(sym::inline);
let pub_underscore = visibility.is_public() && name == kw::Underscore; let pub_underscore = visibility.is_public() && name == kw::Underscore;
let current_mod = cx.tcx.parent_module_from_def_id(import.owner_id.def_id); let current_mod = cx.tcx.parent_module_from_def_id(import.owner_id.def_id);
let import_def_id = import.owner_id.def_id.to_def_id(); let import_def_id = import.owner_id.def_id;
// The parent of the module in which this import resides. This // The parent of the module in which this import resides. This
// is the same as `current_mod` if that's already the top // is the same as `current_mod` if that's already the top
@ -3071,7 +3071,7 @@ fn clean_use_statement_inner<'tcx>(
) )
{ {
items.push(Item::from_def_id_and_parts( items.push(Item::from_def_id_and_parts(
import_def_id, import_def_id.to_def_id(),
None, None,
ImportItem(Import::new_simple(name, resolve_use_source(cx, path), false)), ImportItem(Import::new_simple(name, resolve_use_source(cx, path), false)),
cx, cx,
@ -3081,7 +3081,7 @@ fn clean_use_statement_inner<'tcx>(
Import::new_simple(name, resolve_use_source(cx, path), true) Import::new_simple(name, resolve_use_source(cx, path), true)
}; };
vec![Item::from_def_id_and_parts(import_def_id, None, ImportItem(inner), cx)] vec![Item::from_def_id_and_parts(import_def_id.to_def_id(), None, ImportItem(inner), cx)]
} }
fn clean_maybe_renamed_foreign_item<'tcx>( fn clean_maybe_renamed_foreign_item<'tcx>(

View file

@ -325,8 +325,10 @@ pub(crate) struct Item {
/// E.g., struct vs enum vs function. /// E.g., struct vs enum vs function.
pub(crate) kind: Box<ItemKind>, pub(crate) kind: Box<ItemKind>,
pub(crate) item_id: ItemId, pub(crate) item_id: ItemId,
/// This is the `DefId` of the `use` statement if the item was inlined. /// This is the `LocalDefId` of the `use` statement if the item was inlined.
pub(crate) inline_stmt_id: Option<DefId>, /// The crate metadata doesn't hold this information, so the `use` statement
/// always belongs to the current crate.
pub(crate) inline_stmt_id: Option<LocalDefId>,
pub(crate) cfg: Option<Arc<Cfg>>, pub(crate) cfg: Option<Arc<Cfg>>,
} }
@ -702,7 +704,7 @@ impl Item {
_ => {} _ => {}
} }
let def_id = match self.inline_stmt_id { let def_id = match self.inline_stmt_id {
Some(inlined) => inlined, Some(inlined) => inlined.to_def_id(),
None => def_id, None => def_id,
}; };
Some(tcx.visibility(def_id)) Some(tcx.visibility(def_id))