Skip to content

Commit d3d804e

Browse files
committed
rustdoc: Defossilize the passes infrastructure
1 parent 57a45ea commit d3d804e

13 files changed

+73
-151
lines changed

src/librustdoc/core.rs

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ use crate::config::{Options as RustdocOptions, OutputFormat, RenderOptions};
3232
use crate::formats::cache::Cache;
3333
use crate::html::macro_expansion::{ExpandedCode, source_macro_expansion};
3434
use crate::passes;
35-
use crate::passes::Condition::*;
3635
use crate::passes::collect_intra_doc_links::LinkCollector;
3736

3837
pub(crate) struct DocContext<'tcx> {
@@ -412,39 +411,38 @@ pub(crate) fn run_global_ctxt(
412411
);
413412
}
414413

415-
info!("Executing passes");
416-
417-
let mut visited = FxHashMap::default();
418-
let mut ambiguous = FxIndexMap::default();
419-
420-
for p in passes::defaults(show_coverage) {
421-
let run = match p.condition {
422-
Always => true,
423-
WhenDocumentPrivate => ctxt.document_private(),
424-
WhenNotDocumentPrivate => !ctxt.document_private(),
425-
WhenNotDocumentHidden => !ctxt.document_hidden(),
426-
};
427-
if run {
428-
debug!("running pass {}", p.pass.name);
429-
if let Some(run_fn) = p.pass.run {
430-
krate = tcx.sess.time(p.pass.name, || run_fn(krate, &mut ctxt));
431-
} else {
432-
let (k, LinkCollector { visited_links, ambiguous_links, .. }) =
433-
passes::collect_intra_doc_links::collect_intra_doc_links(krate, &mut ctxt);
434-
krate = k;
435-
visited = visited_links;
436-
ambiguous = ambiguous_links;
437-
}
438-
}
414+
info!("running passes");
415+
passes::initialize!(tcx, ctxt);
416+
417+
let mut visited_links = FxHashMap::default();
418+
let mut ambiguous_links = FxIndexMap::default();
419+
420+
if !show_coverage {
421+
krate = track!(collect_trait_impls(krate));
422+
krate = track!(check_doc_test_visibility(krate));
423+
krate = track!(strip_aliased_non_local(krate));
424+
krate = track!(propagate_doc_cfg(krate));
425+
}
426+
427+
krate = track!(strip_hidden(krate));
428+
krate = track!(strip_private(krate));
429+
430+
if show_coverage {
431+
krate = track!(calculate_doc_coverage(krate));
432+
} else {
433+
krate = track!(strip_priv_imports(krate));
434+
(krate, LinkCollector { visited_links, ambiguous_links, .. }) =
435+
track!(collect_intra_doc_links(krate));
436+
krate = track!(propagate_stability(krate));
437+
krate = track!(lint(krate));
439438
}
440439

441440
tcx.sess.time("check_lint_expectations", || tcx.check_expectations(Some(sym::rustdoc)));
442441

443442
krate =
444443
tcx.sess.time("create_format_cache", || Cache::populate(&mut ctxt, krate, &render_options));
445444

446-
let mut collector =
447-
LinkCollector { cx: &mut ctxt, visited_links: visited, ambiguous_links: ambiguous };
445+
let mut collector = LinkCollector { cx: &mut ctxt, visited_links, ambiguous_links };
448446
collector.resolve_ambiguities();
449447

450448
tcx.dcx().abort_if_errors();

src/librustdoc/passes/calculate_doc_coverage.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,13 @@ use tracing::debug;
1717
use crate::clean;
1818
use crate::core::DocContext;
1919
use crate::html::markdown::{ErrorCodes, find_testable_code};
20-
use crate::passes::Pass;
2120
use crate::passes::check_doc_test_visibility::{Tests, should_have_doc_example};
2221
use crate::visit::DocVisitor;
2322

24-
pub(crate) const CALCULATE_DOC_COVERAGE: Pass =
25-
Pass { name: "calculate-doc-coverage", run: Some(calculate_doc_coverage) };
26-
27-
fn calculate_doc_coverage(krate: clean::Crate, ctx: &mut DocContext<'_>) -> clean::Crate {
23+
pub(crate) fn calculate_doc_coverage(
24+
krate: clean::Crate,
25+
ctx: &mut DocContext<'_>,
26+
) -> clean::Crate {
2827
let mut calc = CoverageCalculator { items: Default::default(), ctx };
2928
calc.visit_crate(&krate);
3029

src/librustdoc/passes/check_doc_test_visibility.rs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,12 @@ use rustc_middle::lint::{LevelAndSource, LintLevelSource};
1010
use rustc_session::lint;
1111
use tracing::debug;
1212

13-
use super::Pass;
14-
use crate::clean;
1513
use crate::clean::utils::inherits_doc_hidden;
16-
use crate::clean::*;
14+
use crate::clean::{self, *};
1715
use crate::core::DocContext;
1816
use crate::html::markdown::{ErrorCodes, Ignore, LangString, MdRelLine, find_testable_code};
1917
use crate::visit::DocVisitor;
2018

21-
pub(crate) const CHECK_DOC_TEST_VISIBILITY: Pass =
22-
Pass { name: "check_doc_test_visibility", run: Some(check_doc_test_visibility) };
23-
2419
struct DocTestVisibilityLinter<'a, 'tcx> {
2520
cx: &'a mut DocContext<'tcx>,
2621
}

src/librustdoc/passes/collect_intra_doc_links.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,8 @@ use crate::clean::{self, Crate, Item, ItemId, ItemLink, PrimitiveType};
3434
use crate::core::DocContext;
3535
use crate::html::markdown::{MarkdownLink, MarkdownLinkRange, markdown_links};
3636
use crate::lint::{BROKEN_INTRA_DOC_LINKS, PRIVATE_INTRA_DOC_LINKS};
37-
use crate::passes::Pass;
3837
use crate::visit::DocVisitor;
3938

40-
pub(crate) const COLLECT_INTRA_DOC_LINKS: Pass =
41-
Pass { name: "collect-intra-doc-links", run: None };
42-
4339
pub(crate) fn collect_intra_doc_links<'a, 'tcx>(
4440
krate: Crate,
4541
cx: &'a mut DocContext<'tcx>,

src/librustdoc/passes/collect_trait_impls.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,11 @@ use rustc_hir::def_id::{DefId, DefIdMap, DefIdSet, LOCAL_CRATE};
1010
use rustc_middle::ty;
1111
use tracing::debug;
1212

13-
use super::Pass;
1413
use crate::clean::*;
1514
use crate::core::DocContext;
1615
use crate::formats::cache::Cache;
1716
use crate::visit::DocVisitor;
1817

19-
pub(crate) const COLLECT_TRAIT_IMPLS: Pass =
20-
Pass { name: "collect-trait-impls", run: Some(collect_trait_impls) };
21-
2218
pub(crate) fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate {
2319
let tcx = cx.tcx;
2420
// We need to check if there are errors before running this pass because it would crash when

src/librustdoc/passes/lint.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,15 @@ mod html_tags;
66
mod redundant_explicit_links;
77
mod unescaped_backticks;
88

9-
use super::Pass;
109
use crate::clean::*;
1110
use crate::core::DocContext;
1211
use crate::visit::DocVisitor;
1312

14-
pub(crate) const RUN_LINTS: Pass = Pass { name: "run-lints", run: Some(run_lints) };
15-
1613
struct Linter<'a, 'tcx> {
1714
cx: &'a mut DocContext<'tcx>,
1815
}
1916

20-
pub(crate) fn run_lints(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
17+
pub(crate) fn lint(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
2118
Linter { cx }.visit_crate(&krate);
2219
krate
2320
}

src/librustdoc/passes/mod.rs

Lines changed: 22 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,85 +1,29 @@
1-
//! Contains information about "passes", used to modify crate information during the documentation
2-
//! process.
3-
4-
use self::Condition::*;
5-
use crate::clean;
6-
use crate::core::DocContext;
1+
//! The definitions of *passes* which transform crate information.
72
83
mod stripper;
94
pub(crate) use stripper::*;
105

11-
mod calculate_doc_coverage;
12-
mod check_doc_test_visibility;
6+
pub(crate) mod calculate_doc_coverage;
7+
pub(crate) mod check_doc_test_visibility;
138
pub(crate) mod collect_intra_doc_links;
14-
mod collect_trait_impls;
15-
mod lint;
16-
mod propagate_doc_cfg;
17-
mod propagate_stability;
18-
mod strip_aliased_non_local;
19-
mod strip_hidden;
20-
mod strip_priv_imports;
21-
mod strip_private;
22-
23-
/// A single pass over the cleaned documentation.
24-
///
25-
/// Runs in the compiler context, so it has access to types and traits and the like.
26-
#[derive(Copy, Clone)]
27-
pub(crate) struct Pass {
28-
pub(crate) name: &'static str,
29-
pub(crate) run: Option<fn(clean::Crate, &mut DocContext<'_>) -> clean::Crate>,
30-
}
31-
32-
/// In a list of passes, a pass that may or may not need to be run depending on options.
33-
#[derive(Copy, Clone)]
34-
pub(crate) struct ConditionalPass {
35-
pub(crate) pass: Pass,
36-
pub(crate) condition: Condition,
37-
}
38-
39-
/// How to decide whether to run a conditional pass.
40-
#[derive(Copy, Clone)]
41-
pub(crate) enum Condition {
42-
Always,
43-
/// When `--document-private-items` is passed.
44-
WhenDocumentPrivate,
45-
/// When `--document-private-items` is not passed.
46-
WhenNotDocumentPrivate,
47-
/// When `--document-hidden-items` is not passed.
48-
WhenNotDocumentHidden,
9+
pub(crate) mod collect_trait_impls;
10+
pub(crate) mod lint;
11+
pub(crate) mod propagate_doc_cfg;
12+
pub(crate) mod propagate_stability;
13+
pub(crate) mod strip_aliased_non_local;
14+
pub(crate) mod strip_hidden;
15+
pub(crate) mod strip_priv_imports;
16+
pub(crate) mod strip_private;
17+
18+
macro_rules! initialize {
19+
($tcx:ident, $cx:ident) => {
20+
macro_rules! track {
21+
($name:ident($krate:ident)) => {{
22+
debug!("running pass `{}`", stringify!($name));
23+
$tcx.sess.time(stringify!($name), || passes::$name::$name($krate, &mut $cx))
24+
}};
25+
}
26+
};
4927
}
5028

51-
/// The list of passes run by default.
52-
const DEFAULT_PASSES: &[ConditionalPass] = &[
53-
ConditionalPass::always(collect_trait_impls::COLLECT_TRAIT_IMPLS),
54-
ConditionalPass::always(check_doc_test_visibility::CHECK_DOC_TEST_VISIBILITY),
55-
ConditionalPass::always(strip_aliased_non_local::STRIP_ALIASED_NON_LOCAL),
56-
ConditionalPass::always(propagate_doc_cfg::PROPAGATE_DOC_CFG),
57-
ConditionalPass::new(strip_hidden::STRIP_HIDDEN, WhenNotDocumentHidden),
58-
ConditionalPass::new(strip_private::STRIP_PRIVATE, WhenNotDocumentPrivate),
59-
ConditionalPass::new(strip_priv_imports::STRIP_PRIV_IMPORTS, WhenDocumentPrivate),
60-
ConditionalPass::always(collect_intra_doc_links::COLLECT_INTRA_DOC_LINKS),
61-
ConditionalPass::always(propagate_stability::PROPAGATE_STABILITY),
62-
ConditionalPass::always(lint::RUN_LINTS),
63-
];
64-
65-
/// The list of default passes run when `--doc-coverage` is passed to rustdoc.
66-
const COVERAGE_PASSES: &[ConditionalPass] = &[
67-
ConditionalPass::new(strip_hidden::STRIP_HIDDEN, WhenNotDocumentHidden),
68-
ConditionalPass::new(strip_private::STRIP_PRIVATE, WhenNotDocumentPrivate),
69-
ConditionalPass::always(calculate_doc_coverage::CALCULATE_DOC_COVERAGE),
70-
];
71-
72-
impl ConditionalPass {
73-
pub(crate) const fn always(pass: Pass) -> Self {
74-
Self::new(pass, Always)
75-
}
76-
77-
pub(crate) const fn new(pass: Pass, condition: Condition) -> Self {
78-
ConditionalPass { pass, condition }
79-
}
80-
}
81-
82-
/// Returns the given default set of passes.
83-
pub(crate) fn defaults(show_coverage: bool) -> &'static [ConditionalPass] {
84-
if show_coverage { COVERAGE_PASSES } else { DEFAULT_PASSES }
85-
}
29+
pub(crate) use initialize;

src/librustdoc/passes/propagate_doc_cfg.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,6 @@ use crate::clean::inline::{load_attrs, merge_attrs};
1010
use crate::clean::{CfgInfo, Crate, Item, ItemKind};
1111
use crate::core::DocContext;
1212
use crate::fold::DocFolder;
13-
use crate::passes::Pass;
14-
15-
pub(crate) const PROPAGATE_DOC_CFG: Pass =
16-
Pass { name: "propagate-doc-cfg", run: Some(propagate_doc_cfg) };
1713

1814
pub(crate) fn propagate_doc_cfg(cr: Crate, cx: &mut DocContext<'_>) -> Crate {
1915
if cx.tcx.features().doc_cfg() {

src/librustdoc/passes/propagate_stability.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,6 @@ use rustc_hir::{Stability, StabilityLevel};
1212
use crate::clean::{Crate, Item, ItemId, ItemKind};
1313
use crate::core::DocContext;
1414
use crate::fold::DocFolder;
15-
use crate::passes::Pass;
16-
17-
pub(crate) const PROPAGATE_STABILITY: Pass =
18-
Pass { name: "propagate-stability", run: Some(propagate_stability) };
1915

2016
pub(crate) fn propagate_stability(cr: Crate, cx: &mut DocContext<'_>) -> Crate {
2117
let crate_stability = cx.tcx.lookup_stability(CRATE_DEF_ID);

src/librustdoc/passes/strip_aliased_non_local.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,11 @@ use crate::clean;
66
use crate::clean::Item;
77
use crate::core::DocContext;
88
use crate::fold::{DocFolder, strip_item};
9-
use crate::passes::Pass;
109

11-
pub(crate) const STRIP_ALIASED_NON_LOCAL: Pass =
12-
Pass { name: "strip-aliased-non-local", run: Some(strip_aliased_non_local) };
13-
14-
fn strip_aliased_non_local(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate {
10+
pub(crate) fn strip_aliased_non_local(
11+
krate: clean::Crate,
12+
cx: &mut DocContext<'_>,
13+
) -> clean::Crate {
1514
let mut stripper = AliasedNonLocalStripper { tcx: cx.tcx };
1615
stripper.fold_crate(krate)
1716
}

0 commit comments

Comments
 (0)