rustdoc: remove clean::TraitWithExtraInfo
Instead, it gathers the extra info later, when it's actually requested.
This commit is contained in:
parent
57ee5cf5a9
commit
a63a03dc54
@ -718,10 +718,6 @@ pub(crate) fn record_extern_trait(cx: &mut DocContext<'_>, did: DefId) {
|
||||
debug!("record_extern_trait: {:?}", did);
|
||||
let trait_ = build_external_trait(cx, did);
|
||||
|
||||
let trait_ = clean::TraitWithExtraInfo {
|
||||
trait_,
|
||||
is_notable: clean::utils::has_doc_flag(cx.tcx, did, sym::notable_trait),
|
||||
};
|
||||
cx.external_traits.borrow_mut().insert(did, trait_);
|
||||
cx.active_extern_traits.remove(&did);
|
||||
}
|
||||
|
@ -37,7 +37,7 @@
|
||||
use crate::clean::clean_visibility;
|
||||
use crate::clean::external_path;
|
||||
use crate::clean::inline::{self, print_inlined_const};
|
||||
use crate::clean::utils::{is_literal_expr, print_const_expr, print_evaluated_const};
|
||||
use crate::clean::utils::{has_doc_flag, is_literal_expr, print_const_expr, print_evaluated_const};
|
||||
use crate::core::DocContext;
|
||||
use crate::formats::cache::Cache;
|
||||
use crate::formats::item_type::ItemType;
|
||||
@ -119,7 +119,7 @@ pub(crate) struct Crate {
|
||||
pub(crate) module: Item,
|
||||
pub(crate) primitives: ThinVec<(DefId, PrimitiveType)>,
|
||||
/// Only here so that they can be filtered through the rustdoc passes.
|
||||
pub(crate) external_traits: Rc<RefCell<FxHashMap<DefId, TraitWithExtraInfo>>>,
|
||||
pub(crate) external_traits: Rc<RefCell<FxHashMap<DefId, Trait>>>,
|
||||
}
|
||||
|
||||
impl Crate {
|
||||
@ -132,13 +132,6 @@ pub(crate) fn src(&self, tcx: TyCtxt<'_>) -> FileName {
|
||||
}
|
||||
}
|
||||
|
||||
/// This struct is used to wrap additional information added by rustdoc on a `trait` item.
|
||||
#[derive(Clone, Debug)]
|
||||
pub(crate) struct TraitWithExtraInfo {
|
||||
pub(crate) trait_: Trait,
|
||||
pub(crate) is_notable: bool,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub(crate) struct ExternalCrate {
|
||||
pub(crate) crate_num: CrateNum,
|
||||
@ -1530,6 +1523,9 @@ impl Trait {
|
||||
pub(crate) fn is_auto(&self, tcx: TyCtxt<'_>) -> bool {
|
||||
tcx.trait_is_auto(self.def_id)
|
||||
}
|
||||
pub(crate) fn is_notable_trait(&self, tcx: TyCtxt<'_>) -> bool {
|
||||
has_doc_flag(tcx, self.def_id, sym::notable_trait)
|
||||
}
|
||||
pub(crate) fn unsafety(&self, tcx: TyCtxt<'_>) -> hir::Unsafety {
|
||||
tcx.trait_def(self.def_id).unsafety
|
||||
}
|
||||
|
@ -25,7 +25,7 @@
|
||||
use std::sync::LazyLock;
|
||||
|
||||
use crate::clean::inline::build_external_trait;
|
||||
use crate::clean::{self, ItemId, TraitWithExtraInfo};
|
||||
use crate::clean::{self, ItemId};
|
||||
use crate::config::{Options as RustdocOptions, OutputFormat, RenderOptions};
|
||||
use crate::formats::cache::Cache;
|
||||
use crate::passes::collect_intra_doc_links::PreprocessedMarkdownLink;
|
||||
@ -58,7 +58,7 @@ pub(crate) struct DocContext<'tcx> {
|
||||
/// Most of this logic is copied from rustc_lint::late.
|
||||
pub(crate) param_env: ParamEnv<'tcx>,
|
||||
/// Later on moved through `clean::Crate` into `cache`
|
||||
pub(crate) external_traits: Rc<RefCell<FxHashMap<DefId, clean::TraitWithExtraInfo>>>,
|
||||
pub(crate) external_traits: Rc<RefCell<FxHashMap<DefId, clean::Trait>>>,
|
||||
/// Used while populating `external_traits` to ensure we don't process the same trait twice at
|
||||
/// the same time.
|
||||
pub(crate) active_extern_traits: FxHashSet<DefId>,
|
||||
@ -388,9 +388,7 @@ pub(crate) fn run_global_ctxt(
|
||||
// Note that in case of `#![no_core]`, the trait is not available.
|
||||
if let Some(sized_trait_did) = ctxt.tcx.lang_items().sized_trait() {
|
||||
let sized_trait = build_external_trait(&mut ctxt, sized_trait_did);
|
||||
ctxt.external_traits
|
||||
.borrow_mut()
|
||||
.insert(sized_trait_did, TraitWithExtraInfo { trait_: sized_trait, is_notable: false });
|
||||
ctxt.external_traits.borrow_mut().insert(sized_trait_did, sized_trait);
|
||||
}
|
||||
|
||||
debug!("crate: {:?}", tcx.hir().krate());
|
||||
|
@ -94,7 +94,7 @@ fn fold_crate(&mut self, mut c: Crate) -> Crate {
|
||||
|
||||
let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
|
||||
for (k, mut v) in external_traits {
|
||||
v.trait_.items = v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
|
||||
v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect();
|
||||
c.external_traits.borrow_mut().insert(k, v);
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
use rustc_hir::def_id::{CrateNum, DefId};
|
||||
use rustc_middle::middle::privacy::AccessLevels;
|
||||
use rustc_middle::ty::{self, TyCtxt};
|
||||
use rustc_span::{sym, Symbol};
|
||||
use rustc_span::Symbol;
|
||||
|
||||
use crate::clean::{self, types::ExternalLocation, ExternalCrate, ItemId, PrimitiveType};
|
||||
use crate::core::DocContext;
|
||||
@ -62,7 +62,7 @@ pub(crate) struct Cache {
|
||||
/// Implementations of a crate should inherit the documentation of the
|
||||
/// parent trait if no extra documentation is specified, and default methods
|
||||
/// should show up in documentation about trait implementations.
|
||||
pub(crate) traits: FxHashMap<DefId, clean::TraitWithExtraInfo>,
|
||||
pub(crate) traits: FxHashMap<DefId, clean::Trait>,
|
||||
|
||||
/// When rendering traits, it's often useful to be able to list all
|
||||
/// implementors of the trait, and this mapping is exactly, that: a mapping
|
||||
@ -225,12 +225,7 @@ fn fold_item(&mut self, item: clean::Item) -> Option<clean::Item> {
|
||||
// Propagate a trait method's documentation to all implementors of the
|
||||
// trait.
|
||||
if let clean::TraitItem(ref t) = *item.kind {
|
||||
self.cache.traits.entry(item.item_id.expect_def_id()).or_insert_with(|| {
|
||||
clean::TraitWithExtraInfo {
|
||||
trait_: *t.clone(),
|
||||
is_notable: item.attrs.has_doc_flag(sym::notable_trait),
|
||||
}
|
||||
});
|
||||
self.cache.traits.entry(item.item_id.expect_def_id()).or_insert_with(|| (**t).clone());
|
||||
}
|
||||
|
||||
// Collect all the implementors of traits.
|
||||
|
@ -1294,7 +1294,12 @@ fn notable_traits_decl(decl: &clean::FnDecl, cx: &Context<'_>) -> String {
|
||||
if let Some(trait_) = &impl_.trait_ {
|
||||
let trait_did = trait_.def_id();
|
||||
|
||||
if cx.cache().traits.get(&trait_did).map_or(false, |t| t.is_notable) {
|
||||
if cx
|
||||
.cache()
|
||||
.traits
|
||||
.get(&trait_did)
|
||||
.map_or(false, |t| t.is_notable_trait(cx.tcx()))
|
||||
{
|
||||
if out.is_empty() {
|
||||
write!(
|
||||
&mut out,
|
||||
@ -1598,7 +1603,7 @@ fn doc_impl_item(
|
||||
link,
|
||||
render_mode,
|
||||
false,
|
||||
trait_.map(|t| &t.trait_),
|
||||
trait_,
|
||||
rendering_params,
|
||||
);
|
||||
}
|
||||
@ -1658,7 +1663,7 @@ fn render_default_items(
|
||||
&mut default_impl_items,
|
||||
&mut impl_items,
|
||||
cx,
|
||||
&t.trait_,
|
||||
t,
|
||||
i.inner_impl(),
|
||||
&i.impl_item,
|
||||
parent,
|
||||
|
@ -108,7 +108,6 @@ fn get_trait_items(&mut self) -> Vec<(types::Id, types::Item)> {
|
||||
.filter_map(|(&id, trait_item)| {
|
||||
// only need to synthesize items for external traits
|
||||
if !id.is_local() {
|
||||
let trait_item = &trait_item.trait_;
|
||||
for item in &trait_item.items {
|
||||
trace!("Adding subitem to {id:?}: {:?}", item.item_id);
|
||||
self.item(item.clone()).unwrap();
|
||||
|
@ -65,7 +65,7 @@ fn visit_crate(&mut self, c: &Crate) {
|
||||
// FIXME: make this a simple by-ref for loop once external_traits is cleaned up
|
||||
let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) };
|
||||
for (k, v) in external_traits {
|
||||
v.trait_.items.iter().for_each(|i| self.visit_item(i));
|
||||
v.items.iter().for_each(|i| self.visit_item(i));
|
||||
c.external_traits.borrow_mut().insert(k, v);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user