From 5082584d3c2b73aecadd218e3917ec0ae02e69ec Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Wed, 27 Oct 2021 21:10:35 -0700 Subject: [PATCH 1/4] Use `DocContext` to initialize `Cache.traits` This is preparation for cleaning up `external_traits`. --- src/librustdoc/core.rs | 4 +++- src/librustdoc/formats/cache.rs | 3 +-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index b7251e8f57151..47f89f06801af 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -494,7 +494,9 @@ crate fn run_global_ctxt( let render_options = ctxt.render_options; let mut cache = ctxt.cache; - krate = tcx.sess.time("create_format_cache", || cache.populate(krate, tcx, &render_options)); + // FIXME: remove this `take` once the Rc is gone + cache.traits = ctxt.external_traits.take(); + krate = tcx.sess.time("create_format_cache", || cache.populate(tcx, krate, &render_options)); // The main crate doc comments are always collapsed. krate.collapsed = true; diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index 6b9c9a9669b1a..68a9301477346 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -138,13 +138,12 @@ impl Cache { /// in `krate` due to the data being moved into the `Cache`. crate fn populate( &mut self, - mut krate: clean::Crate, tcx: TyCtxt<'_>, + mut krate: clean::Crate, render_options: &RenderOptions, ) -> clean::Crate { // Crawl the crate to build various caches used for the output debug!(?self.crate_version); - self.traits = krate.external_traits.take(); let RenderOptions { extern_html_root_takes_precedence, output: dst, .. } = render_options; // Cache where all our extern crates are located From e1b14c05939be5249d4fc908054cef5350431161 Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Wed, 27 Oct 2021 21:13:56 -0700 Subject: [PATCH 2/4] Remove `Crate.external_traits` --- src/librustdoc/clean/types.rs | 4 ---- src/librustdoc/clean/utils.rs | 10 +--------- src/librustdoc/fold.rs | 9 --------- 3 files changed, 1 insertion(+), 22 deletions(-) diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 6ae057abb3d36..433ad64ae37d8 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -1,10 +1,8 @@ -use std::cell::RefCell; use std::default::Default; use std::hash::{Hash, Hasher}; use std::iter::FromIterator; use std::lazy::SyncOnceCell as OnceCell; use std::path::PathBuf; -use std::rc::Rc; use std::sync::Arc; use std::{slice, vec}; @@ -120,8 +118,6 @@ crate struct Crate { crate module: Item, crate externs: Vec, crate primitives: ThinVec<(DefId, PrimitiveType)>, - /// Only here so that they can be filtered through the rustdoc passes. - crate external_traits: Rc>>, crate collapsed: bool, } diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index 0573a1ada3a84..8c5ce093b5b98 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -79,15 +79,7 @@ crate fn krate(cx: &mut DocContext<'_>) -> Crate { })); } - Crate { - name, - src, - module, - externs, - primitives, - external_traits: cx.external_traits.clone(), - collapsed: false, - } + Crate { name, src, module, externs, primitives, collapsed: false } } fn external_generic_args( diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs index f84850c0fe1f1..750c706e93728 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -85,15 +85,6 @@ crate trait DocFolder: Sized { fn fold_crate(&mut self, mut c: Crate) -> Crate { c.module = self.fold_item(c.module).unwrap(); - - { - 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(); - c.external_traits.borrow_mut().insert(k, v); - } - } c } } From d17cce45dffafcd405c71072f7cc24291987db06 Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Wed, 27 Oct 2021 21:20:20 -0700 Subject: [PATCH 3/4] Remove `Rc` wrapper --- src/librustdoc/core.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 47f89f06801af..3f8fb69d8aa5d 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -50,7 +50,7 @@ crate struct DocContext<'tcx> { /// Most of this logic is copied from rustc_lint::late. crate param_env: ParamEnv<'tcx>, /// Later on moved through `clean::Crate` into `cache` - crate external_traits: Rc>>, + crate external_traits: RefCell>, /// Used while populating `external_traits` to ensure we don't process the same trait twice at /// the same time. crate active_extern_traits: FxHashSet, @@ -494,8 +494,7 @@ crate fn run_global_ctxt( let render_options = ctxt.render_options; let mut cache = ctxt.cache; - // FIXME: remove this `take` once the Rc is gone - cache.traits = ctxt.external_traits.take(); + cache.traits = ctxt.external_traits.into_inner(); krate = tcx.sess.time("create_format_cache", || cache.populate(tcx, krate, &render_options)); // The main crate doc comments are always collapsed. From 64358a85d5f178e0784da89c6b61d6ac52dee49c Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Wed, 27 Oct 2021 21:24:07 -0700 Subject: [PATCH 4/4] Remove `RefCell` wrapper --- src/librustdoc/clean/inline.rs | 13 ++++--------- src/librustdoc/core.rs | 9 +++++---- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index c5e0587581970..191ebb4f5141b 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -674,16 +674,11 @@ crate fn record_extern_trait(cx: &mut DocContext<'_>, did: DefId) { return; } - { - if cx.external_traits.borrow().contains_key(&did) || cx.active_extern_traits.contains(&did) - { - return; - } + if cx.external_traits.contains_key(&did) || cx.active_extern_traits.contains(&did) { + return; } - { - cx.active_extern_traits.insert(did); - } + cx.active_extern_traits.insert(did); debug!("record_extern_trait: {:?}", did); let trait_ = build_external_trait(cx, did); @@ -692,6 +687,6 @@ crate fn record_extern_trait(cx: &mut DocContext<'_>, did: DefId) { trait_, is_notable: clean::utils::has_doc_flag(cx.tcx.get_attrs(did), sym::notable_trait), }; - cx.external_traits.borrow_mut().insert(did, trait_); + cx.external_traits.insert(did, trait_); cx.active_extern_traits.remove(&did); } diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 3f8fb69d8aa5d..42bfc15c7596e 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -49,8 +49,10 @@ crate struct DocContext<'tcx> { /// /// Most of this logic is copied from rustc_lint::late. crate param_env: ParamEnv<'tcx>, - /// Later on moved through `clean::Crate` into `cache` - crate external_traits: RefCell>, + /// Traits defined outside the current crate. + /// + /// Later on moved into `cache`. + crate external_traits: FxHashMap, /// Used while populating `external_traits` to ensure we don't process the same trait twice at /// the same time. crate active_extern_traits: FxHashSet, @@ -375,7 +377,6 @@ crate fn run_global_ctxt( let mut sized_trait = build_external_trait(&mut ctxt, sized_trait_did); sized_trait.is_auto = true; ctxt.external_traits - .borrow_mut() .insert(sized_trait_did, TraitWithExtraInfo { trait_: sized_trait, is_notable: false }); } @@ -494,7 +495,7 @@ crate fn run_global_ctxt( let render_options = ctxt.render_options; let mut cache = ctxt.cache; - cache.traits = ctxt.external_traits.into_inner(); + cache.traits = ctxt.external_traits; krate = tcx.sess.time("create_format_cache", || cache.populate(tcx, krate, &render_options)); // The main crate doc comments are always collapsed.