diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 7635453d56f..2c2ebc9291b 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -44,9 +44,9 @@ pub type ExternalPaths = FxHashMap, clean::TypeKind)>; pub struct DocContext<'tcx> { pub tcx: TyCtxt<'tcx>, pub resolver: Rc>, - /// Later on moved into `formats::cache::CACHE_KEY` + /// Later on moved into `CACHE_KEY` pub renderinfo: RefCell, - /// Later on moved through `clean::Crate` into `formats::cache::CACHE_KEY` + /// Later on moved through `clean::Crate` into `CACHE_KEY` pub external_traits: Rc>>, /// Used while populating `external_traits` to ensure we don't process the same trait twice at /// the same time. diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index 72881eccf3e..99b31473f87 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -148,29 +148,19 @@ impl Cache { external_paths.into_iter().map(|(k, (v, t))| (k, (v, ItemType::from(t)))).collect(); let mut cache = Cache { - impls: Default::default(), external_paths, exact_paths, - paths: Default::default(), - implementors: Default::default(), - stack: Vec::new(), - parent_stack: Vec::new(), - search_index: Vec::new(), parent_is_trait_impl: false, - extern_locations: Default::default(), - primitive_locations: Default::default(), stripped_mod: false, access_levels, crate_version: krate.version.take(), document_private, - orphan_impl_items: Vec::new(), - orphan_trait_impls: Vec::new(), traits: krate.external_traits.replace(Default::default()), deref_trait_did, deref_mut_trait_did, owned_box_did, masked_crates: mem::take(&mut krate.masked_crates), - aliases: Default::default(), + ..Cache::default() }; // Cache where all our extern crates are located @@ -211,7 +201,7 @@ impl Cache { for (trait_did, dids, impl_) in cache.orphan_trait_impls.drain(..) { if cache.traits.contains_key(&trait_did) { for did in dids { - cache.impls.entry(did).or_insert(vec![]).push(impl_.clone()); + cache.impls.entry(did).or_default().push(impl_.clone()); } } } diff --git a/src/librustdoc/formats/mod.rs b/src/librustdoc/formats/mod.rs index 7757ee7e515..dcb0184c58c 100644 --- a/src/librustdoc/formats/mod.rs +++ b/src/librustdoc/formats/mod.rs @@ -2,7 +2,7 @@ pub mod cache; pub mod item_type; pub mod renderer; -pub use renderer::{FormatRenderer, Renderer}; +pub use renderer::{run_format, FormatRenderer}; use rustc_span::def_id::DefId; diff --git a/src/librustdoc/formats/renderer.rs b/src/librustdoc/formats/renderer.rs index 7d23c7b8aff..90ace4d44c4 100644 --- a/src/librustdoc/formats/renderer.rs +++ b/src/librustdoc/formats/renderer.rs @@ -7,7 +7,7 @@ use crate::config::{RenderInfo, RenderOptions}; use crate::error::Error; use crate::formats::cache::{Cache, CACHE_KEY}; -/// Allows for different backends to rustdoc to be used with the `Renderer::run()` function. Each +/// Allows for different backends to rustdoc to be used with the `run_format()` function. Each /// backend renderer has hooks for initialization, documenting an item, entering and exiting a /// module, and cleanup/finalizing output. pub trait FormatRenderer: Clone { @@ -42,75 +42,65 @@ pub trait FormatRenderer: Clone { fn after_run(&mut self, diag: &rustc_errors::Handler) -> Result<(), Error>; } -#[derive(Clone)] -pub struct Renderer; +/// Main method for rendering a crate. +pub fn run_format( + krate: clean::Crate, + options: RenderOptions, + render_info: RenderInfo, + diag: &rustc_errors::Handler, + edition: Edition, +) -> Result<(), Error> { + let (krate, mut cache) = Cache::from_krate( + render_info.clone(), + options.document_private, + &options.extern_html_root_urls, + &options.output, + krate, + ); -impl Renderer { - pub fn new() -> Renderer { - Renderer - } + let (mut format_renderer, mut krate) = + T::init(krate, options, render_info, edition, &mut cache)?; - /// Main method for rendering a crate. - pub fn run( - self, - krate: clean::Crate, - options: RenderOptions, - render_info: RenderInfo, - diag: &rustc_errors::Handler, - edition: Edition, - ) -> Result<(), Error> { - let (krate, mut cache) = Cache::from_krate( - render_info.clone(), - options.document_private, - &options.extern_html_root_urls, - &options.output, - krate, - ); + let cache = Arc::new(cache); + // Freeze the cache now that the index has been built. Put an Arc into TLS for future + // parallelization opportunities + CACHE_KEY.with(|v| *v.borrow_mut() = cache.clone()); - let (mut format_renderer, mut krate) = - T::init(krate, options, render_info, edition, &mut cache)?; + let mut item = match krate.module.take() { + Some(i) => i, + None => return Ok(()), + }; - let cache = Arc::new(cache); - // Freeze the cache now that the index has been built. Put an Arc into TLS for future - // parallelization opportunities - CACHE_KEY.with(|v| *v.borrow_mut() = cache.clone()); + item.name = Some(krate.name.clone()); - let mut item = match krate.module.take() { - Some(i) => i, - None => return Ok(()), - }; + // Render the crate documentation + let mut work = vec![(format_renderer.clone(), item)]; - item.name = Some(krate.name.clone()); - - // Render the crate documentation - let mut work = vec![(format_renderer.clone(), item)]; - - while let Some((mut cx, item)) = work.pop() { - if item.is_mod() { - // modules are special because they add a namespace. We also need to - // recurse into the items of the module as well. - let name = item.name.as_ref().unwrap().to_string(); - if name.is_empty() { - panic!("Unexpected module with empty name"); - } - - cx.mod_item_in(&item, &name, &cache)?; - let module = match item.inner { - clean::StrippedItem(box clean::ModuleItem(m)) | clean::ModuleItem(m) => m, - _ => unreachable!(), - }; - for it in module.items { - debug!("Adding {:?} to worklist", it.name); - work.push((cx.clone(), it)); - } - - cx.mod_item_out(&name)?; - } else if item.name.is_some() { - cx.item(item, &cache)?; + while let Some((mut cx, item)) = work.pop() { + if item.is_mod() { + // modules are special because they add a namespace. We also need to + // recurse into the items of the module as well. + let name = item.name.as_ref().unwrap().to_string(); + if name.is_empty() { + panic!("Unexpected module with empty name"); } - } - format_renderer.after_krate(&krate, &cache)?; - format_renderer.after_run(diag) + cx.mod_item_in(&item, &name, &cache)?; + let module = match item.inner { + clean::StrippedItem(box clean::ModuleItem(m)) | clean::ModuleItem(m) => m, + _ => unreachable!(), + }; + for it in module.items { + debug!("Adding {:?} to worklist", it.name); + work.push((cx.clone(), it)); + } + + cx.mod_item_out(&name)?; + } else if item.name.is_some() { + cx.item(item, &cache)?; + } } + + format_renderer.after_krate(&krate, &cache)?; + format_renderer.after_run(diag) } diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 46c1b27986d..a6edb8ace33 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -228,7 +228,7 @@ impl Serialize for IndexItem { /// A type used for the search index. #[derive(Debug)] -pub struct RenderType { +crate struct RenderType { ty: Option, idx: Option, name: Option, @@ -259,7 +259,7 @@ impl Serialize for RenderType { /// A type used for the search index. #[derive(Debug)] -pub struct Generic { +crate struct Generic { name: String, defid: Option, idx: Option, @@ -313,7 +313,7 @@ impl Serialize for IndexItemFunctionType { } #[derive(Debug)] -pub struct TypeWithKind { +crate struct TypeWithKind { ty: RenderType, kind: TypeKind, } diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 04651da4d09..a4ce84556f3 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -502,9 +502,9 @@ fn main_options(options: config::Options) -> i32 { info!("going to format"); let (error_format, edition, debugging_options) = diag_opts; let diag = core::new_handler(error_format, None, &debugging_options); - match formats::Renderer::new() - .run::(krate, renderopts, renderinfo, &diag, edition) - { + match formats::run_format::( + krate, renderopts, renderinfo, &diag, edition, + ) { Ok(_) => rustc_driver::EXIT_SUCCESS, Err(e) => { diag.struct_err(&format!("couldn't generate documentation: {}", e.error))