X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustdoc%2Fcore.rs;h=1d55fa42a3a9bc0b3cb764ca65f9edf7e85a7c3f;hb=163b01aa140299ca5934031e5edf17cb23184941;hp=dbf202a7321083b8139a8d9b983b60affbbd6e5b;hpb=1c2a949736a85810127b73dbc1006565689d6fe4;p=rust.git diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index dbf202a7321..1d55fa42a3a 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -30,44 +30,44 @@ use crate::clean; use crate::clean::inline::build_external_trait; -use crate::clean::{AttributesExt, MAX_DEF_IDX}; -use crate::config::{Options as RustdocOptions, RenderOptions}; -use crate::config::{OutputFormat, RenderInfo}; +use crate::clean::{AttributesExt, TraitWithExtraInfo, MAX_DEF_IDX}; +use crate::config::{Options as RustdocOptions, OutputFormat, RenderOptions}; use crate::formats::cache::Cache; use crate::passes::{self, Condition::*, ConditionalPass}; crate use rustc_session::config::{DebuggingOptions, Input, Options}; -crate type ExternalPaths = FxHashMap, clean::TypeKind)>; - crate struct DocContext<'tcx> { crate tcx: TyCtxt<'tcx>, + /// Name resolver. Used for intra-doc links. + /// + /// The `Rc>` wrapping is needed because that is what's returned by + /// [`Queries::expansion()`]. + // FIXME: see if we can get rid of this RefCell somehow crate resolver: Rc>, /// Used for normalization. /// /// Most of this logic is copied from rustc_lint::late. crate param_env: ParamEnv<'tcx>, - /// Later on moved into `cache` - crate renderinfo: RefCell, /// Later on moved through `clean::Crate` into `cache` - crate external_traits: Rc>>, + crate external_traits: Rc>>, /// Used while populating `external_traits` to ensure we don't process the same trait twice at /// the same time. - crate active_extern_traits: RefCell>, + crate active_extern_traits: FxHashSet, // The current set of type and lifetime substitutions, // for expanding type aliases at the HIR level: /// Table `DefId` of type parameter -> substituted type - crate ty_substs: RefCell>, + crate ty_substs: FxHashMap, /// Table `DefId` of lifetime parameter -> substituted lifetime - crate lt_substs: RefCell>, + crate lt_substs: FxHashMap, /// Table `DefId` of const parameter -> substituted const - crate ct_substs: RefCell>, + crate ct_substs: FxHashMap, /// Table synthetic type parameter for `impl Trait` in argument position -> bounds - crate impl_trait_bounds: RefCell>>, + crate impl_trait_bounds: FxHashMap>, crate fake_def_ids: FxHashMap, /// Auto-trait or blanket impls processed so far, as `(self_ty, trait_def_id)`. // FIXME(eddyb) make this a `ty::TraitRef<'tcx>` set. - crate generated_synthetics: RefCell, DefId)>>, + crate generated_synthetics: FxHashSet<(Ty<'tcx>, DefId)>, crate auto_traits: Vec, /// The options given to rustdoc that could be relevant to a pass. crate render_options: RenderOptions, @@ -76,8 +76,12 @@ /// See `collect_intra_doc_links::traits_implemented_by` for more details. /// `map>` crate module_trait_cache: RefCell>>, - /// Fake empty cache used when cache is required as parameter. + /// This same cache is used throughout rustdoc, including in [`crate::html::render`]. crate cache: Cache, + /// Used by [`clean::inline`] to tell if an item has already been inlined. + crate inlined: FxHashSet, + /// Used by `calculate_doc_coverage`. + crate output_format: OutputFormat, } impl<'tcx> DocContext<'tcx> { @@ -112,14 +116,14 @@ impl<'tcx> DocContext<'tcx> { F: FnOnce(&mut Self) -> R, { let (old_tys, old_lts, old_cts) = ( - mem::replace(&mut *self.ty_substs.get_mut(), ty_substs), - mem::replace(&mut *self.lt_substs.get_mut(), lt_substs), - mem::replace(&mut *self.ct_substs.get_mut(), ct_substs), + mem::replace(&mut self.ty_substs, ty_substs), + mem::replace(&mut self.lt_substs, lt_substs), + mem::replace(&mut self.ct_substs, ct_substs), ); let r = f(self); - *self.ty_substs.get_mut() = old_tys; - *self.lt_substs.get_mut() = old_lts; - *self.ct_substs.get_mut() = old_cts; + self.ty_substs = old_tys; + self.lt_substs = old_lts; + self.ct_substs = old_cts; r } @@ -460,7 +464,7 @@ pub(crate) fn init_lints( mut manual_passes: Vec, render_options: RenderOptions, output_format: OutputFormat, -) -> (clean::Crate, RenderInfo, RenderOptions) { +) -> (clean::Crate, RenderOptions, Cache) { // Certain queries assume that some checks were run elsewhere // (see https://github.com/rust-lang/rust/pull/73566#issuecomment-656954425), // so type-check everything other than function bodies in this crate before running lints. @@ -499,17 +503,12 @@ pub(crate) fn init_lints( .collect(), }; - let mut renderinfo = RenderInfo::default(); - renderinfo.access_levels = access_levels; - renderinfo.output_format = output_format; - let mut ctxt = DocContext { tcx, resolver, param_env: ParamEnv::empty(), external_traits: Default::default(), active_extern_traits: Default::default(), - renderinfo: RefCell::new(renderinfo), ty_substs: Default::default(), lt_substs: Default::default(), ct_substs: Default::default(), @@ -522,9 +521,11 @@ pub(crate) fn init_lints( .cloned() .filter(|trait_def_id| tcx.trait_is_auto(*trait_def_id)) .collect(), - render_options, module_trait_cache: RefCell::new(FxHashMap::default()), - cache: Cache::default(), + cache: Cache::new(access_levels, render_options.document_private), + inlined: FxHashSet::default(), + output_format, + render_options, }; // Small hack to force the Sized trait to be present. @@ -533,7 +534,10 @@ pub(crate) fn init_lints( if let Some(sized_trait_did) = ctxt.tcx.lang_items().sized_trait() { 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, sized_trait); + ctxt.external_traits.borrow_mut().insert( + sized_trait_did, + TraitWithExtraInfo { trait_: sized_trait, is_spotlight: false }, + ); } debug!("crate: {:?}", tcx.hir().krate()); @@ -639,10 +643,16 @@ fn report_deprecated_attr(name: &str, diag: &rustc_errors::Handler) { ctxt.sess().abort_if_errors(); + let render_options = ctxt.render_options; + let mut cache = ctxt.cache; + krate = tcx.sess.time("create_format_cache", || { + cache.populate(krate, tcx, &render_options.extern_html_root_urls, &render_options.output) + }); + // The main crate doc comments are always collapsed. krate.collapsed = true; - (krate, ctxt.renderinfo.into_inner(), ctxt.render_options) + (krate, render_options, cache) } /// Due to ,