From e022936038d87b2e22100b976e934e36fcdb2c30 Mon Sep 17 00:00:00 2001 From: Camelid Date: Tue, 9 Mar 2021 20:14:50 -0800 Subject: [PATCH] Move `SharedContext` to `context.rs` It is tightly connected to `Context` and is primarily used as a field in `Context`. Thus, it should be next to `Context`. --- src/librustdoc/html/render/context.rs | 78 +++++++++++++++++++++++-- src/librustdoc/html/render/mod.rs | 82 ++------------------------- 2 files changed, 78 insertions(+), 82 deletions(-) diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs index 864fbccbcc451..9508d7bab9029 100644 --- a/src/librustdoc/html/render/context.rs +++ b/src/librustdoc/html/render/context.rs @@ -1,11 +1,11 @@ use std::cell::RefCell; use std::collections::BTreeMap; use std::io; -use std::path::PathBuf; +use std::path::{Path, PathBuf}; use std::rc::Rc; -use std::sync::mpsc::channel; +use std::sync::mpsc::{channel, Receiver}; -use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_middle::ty::TyCtxt; use rustc_session::Session; @@ -17,8 +17,8 @@ use super::cache::{build_index, ExternalLocation}; use super::print_item::{full_path, item_path, print_item}; use super::write_shared::write_shared; use super::{ - print_sidebar, settings, AllTypes, NameDoc, SharedContext, StylePath, BASIC_KEYWORDS, - CURRENT_DEPTH, INITIAL_IDS, + print_sidebar, settings, AllTypes, NameDoc, StylePath, BASIC_KEYWORDS, CURRENT_DEPTH, + INITIAL_IDS, }; use crate::clean::{self, AttributesExt}; @@ -78,6 +78,74 @@ crate struct Context<'tcx> { #[cfg(target_arch = "x86_64")] rustc_data_structures::static_assert_size!(Context<'_>, 152); +/// Shared mutable state used in [`Context`] and elsewhere. +crate struct SharedContext<'tcx> { + crate tcx: TyCtxt<'tcx>, + /// The path to the crate root source minus the file name. + /// Used for simplifying paths to the highlighted source code files. + crate src_root: PathBuf, + /// This describes the layout of each page, and is not modified after + /// creation of the context (contains info like the favicon and added html). + crate layout: layout::Layout, + /// This flag indicates whether `[src]` links should be generated or not. If + /// the source files are present in the html rendering, then this will be + /// `true`. + crate include_sources: bool, + /// The local file sources we've emitted and their respective url-paths. + crate local_sources: FxHashMap, + /// Whether the collapsed pass ran + pub(super) collapsed: bool, + /// The base-URL of the issue tracker for when an item has been tagged with + /// an issue number. + pub(super) issue_tracker_base_url: Option, + /// The directories that have already been created in this doc run. Used to reduce the number + /// of spurious `create_dir_all` calls. + pub(super) created_dirs: RefCell>, + /// This flag indicates whether listings of modules (in the side bar and documentation itself) + /// should be ordered alphabetically or in order of appearance (in the source code). + pub(super) sort_modules_alphabetically: bool, + /// Additional CSS files to be added to the generated docs. + crate style_files: Vec, + /// Suffix to be added on resource files (if suffix is "-v2" then "light.css" becomes + /// "light-v2.css"). + crate resource_suffix: String, + /// Optional path string to be used to load static files on output pages. If not set, uses + /// combinations of `../` to reach the documentation root. + crate static_root_path: Option, + /// The fs handle we are working with. + crate fs: DocFS, + /// The default edition used to parse doctests. + crate edition: Edition, + pub(super) codes: ErrorCodes, + pub(super) playground: Option, + pub(super) all: RefCell, + /// Storage for the errors produced while generating documentation so they + /// can be printed together at the end. + pub(super) errors: Receiver, + /// `None` by default, depends on the `generate-redirect-map` option flag. If this field is set + /// to `Some(...)`, it'll store redirections and then generate a JSON file at the top level of + /// the crate. + pub(super) redirections: Option>>, +} + +impl SharedContext<'_> { + crate fn ensure_dir(&self, dst: &Path) -> Result<(), Error> { + let mut dirs = self.created_dirs.borrow_mut(); + if !dirs.contains(dst) { + try_err!(self.fs.create_dir_all(dst), dst); + dirs.insert(dst.to_path_buf()); + } + + Ok(()) + } + + /// Based on whether the `collapse-docs` pass was run, return either the `doc_value` or the + /// `collapsed_doc_value` of the given item. + crate fn maybe_collapsed_doc_value<'a>(&self, item: &'a clean::Item) -> Option { + if self.collapsed { item.collapsed_doc_value() } else { item.doc_value() } + } +} + impl<'tcx> Context<'tcx> { pub(super) fn path(&self, filename: &str) -> PathBuf { // We use splitn vs Path::extension here because we might get a filename diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 66c47f14655ba..4f6f16d5e88ab 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -35,32 +35,29 @@ mod write_shared; crate use context::*; crate use write_shared::FILES_UNVERSIONED; -use std::cell::{Cell, RefCell}; +use std::cell::Cell; use std::collections::VecDeque; use std::default::Default; use std::fmt; -use std::path::{Path, PathBuf}; +use std::path::PathBuf; use std::str; use std::string::ToString; -use std::sync::mpsc::Receiver; use itertools::Itertools; use rustc_ast_pretty::pprust; use rustc_attr::{Deprecation, StabilityLevel}; -use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::fx::FxHashSet; use rustc_hir as hir; use rustc_hir::def::CtorKind; use rustc_hir::def_id::DefId; use rustc_hir::Mutability; use rustc_middle::middle::stability; -use rustc_middle::ty::TyCtxt; -use rustc_span::edition::Edition; use rustc_span::symbol::{kw, sym, Symbol}; use serde::ser::SerializeSeq; use serde::{Serialize, Serializer}; use crate::clean::{self, GetDefId, RenderedLink, SelfTy, TypeKind}; -use crate::docfs::{DocFS, PathError}; +use crate::docfs::PathError; use crate::error::Error; use crate::formats::cache::Cache; use crate::formats::item_type::ItemType; @@ -70,8 +67,7 @@ use crate::html::format::{ href, print_abi_with_space, print_default_space, print_generic_bounds, Buffer, Function, PrintWithSpace, WhereClause, }; -use crate::html::layout; -use crate::html::markdown::{self, ErrorCodes, Markdown, MarkdownHtml, MarkdownSummaryLine}; +use crate::html::markdown::{Markdown, MarkdownHtml, MarkdownSummaryLine}; /// A pair of name and its optional document. crate type NameDoc = (String, Option); @@ -82,74 +78,6 @@ crate fn ensure_trailing_slash(v: &str) -> impl fmt::Display + '_ { }) } -/// Shared mutable state used in [`Context`] and elsewhere. -crate struct SharedContext<'tcx> { - crate tcx: TyCtxt<'tcx>, - /// The path to the crate root source minus the file name. - /// Used for simplifying paths to the highlighted source code files. - crate src_root: PathBuf, - /// This describes the layout of each page, and is not modified after - /// creation of the context (contains info like the favicon and added html). - crate layout: layout::Layout, - /// This flag indicates whether `[src]` links should be generated or not. If - /// the source files are present in the html rendering, then this will be - /// `true`. - crate include_sources: bool, - /// The local file sources we've emitted and their respective url-paths. - crate local_sources: FxHashMap, - /// Whether the collapsed pass ran - collapsed: bool, - /// The base-URL of the issue tracker for when an item has been tagged with - /// an issue number. - issue_tracker_base_url: Option, - /// The directories that have already been created in this doc run. Used to reduce the number - /// of spurious `create_dir_all` calls. - created_dirs: RefCell>, - /// This flag indicates whether listings of modules (in the side bar and documentation itself) - /// should be ordered alphabetically or in order of appearance (in the source code). - sort_modules_alphabetically: bool, - /// Additional CSS files to be added to the generated docs. - crate style_files: Vec, - /// Suffix to be added on resource files (if suffix is "-v2" then "light.css" becomes - /// "light-v2.css"). - crate resource_suffix: String, - /// Optional path string to be used to load static files on output pages. If not set, uses - /// combinations of `../` to reach the documentation root. - crate static_root_path: Option, - /// The fs handle we are working with. - crate fs: DocFS, - /// The default edition used to parse doctests. - crate edition: Edition, - codes: ErrorCodes, - playground: Option, - all: RefCell, - /// Storage for the errors produced while generating documentation so they - /// can be printed together at the end. - errors: Receiver, - /// `None` by default, depends on the `generate-redirect-map` option flag. If this field is set - /// to `Some(...)`, it'll store redirections and then generate a JSON file at the top level of - /// the crate. - redirections: Option>>, -} - -impl SharedContext<'_> { - crate fn ensure_dir(&self, dst: &Path) -> Result<(), Error> { - let mut dirs = self.created_dirs.borrow_mut(); - if !dirs.contains(dst) { - try_err!(self.fs.create_dir_all(dst), dst); - dirs.insert(dst.to_path_buf()); - } - - Ok(()) - } - - /// Based on whether the `collapse-docs` pass was run, return either the `doc_value` or the - /// `collapsed_doc_value` of the given item. - crate fn maybe_collapsed_doc_value<'a>(&self, item: &'a clean::Item) -> Option { - if self.collapsed { item.collapsed_doc_value() } else { item.doc_value() } - } -} - // Helper structs for rendering items/sidebars and carrying along contextual // information