Skip to content

Commit 7a0a82c

Browse files
committed
rustdoc: Defossilize the passes infrastructure
1 parent c836f95 commit 7a0a82c

14 files changed

+75
-156
lines changed

src/librustdoc/core.rs

Lines changed: 26 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ use crate::config::{Options as RustdocOptions, OutputFormat, RenderOptions};
3434
use crate::formats::cache::Cache;
3535
use crate::html::macro_expansion::{ExpandedCode, source_macro_expansion};
3636
use crate::passes;
37-
use crate::passes::Condition::*;
3837
use crate::passes::collect_intra_doc_links::LinkCollector;
3938

4039
pub(crate) struct DocContext<'tcx> {
@@ -423,39 +422,39 @@ pub(crate) fn run_global_ctxt(
423422
);
424423
}
425424

426-
info!("Executing passes");
427-
428-
let mut visited = FxHashMap::default();
429-
let mut ambiguous = FxIndexMap::default();
430-
431-
for p in passes::defaults(show_coverage) {
432-
let run = match p.condition {
433-
Always => true,
434-
WhenDocumentPrivate => ctxt.document_private(),
435-
WhenNotDocumentPrivate => !ctxt.document_private(),
436-
WhenNotDocumentHidden => !ctxt.document_hidden(),
437-
};
438-
if run {
439-
debug!("running pass {}", p.pass.name);
440-
if let Some(run_fn) = p.pass.run {
441-
krate = tcx.sess.time(p.pass.name, || run_fn(krate, &mut ctxt));
442-
} else {
443-
let (k, LinkCollector { visited_links, ambiguous_links, .. }) =
444-
passes::collect_intra_doc_links::collect_intra_doc_links(krate, &mut ctxt);
445-
krate = k;
446-
visited = visited_links;
447-
ambiguous = ambiguous_links;
448-
}
449-
}
425+
info!("running passes");
426+
passes::initialize!(tcx, ctxt);
427+
428+
let mut visited_links = FxHashMap::default();
429+
let mut ambiguous_links = FxIndexMap::default();
430+
431+
if !show_coverage {
432+
krate = track!(collect_trait_impls(krate));
433+
krate = track!(check_doc_test_visibility(krate));
434+
krate = track!(check_doc_cfg(krate));
435+
krate = track!(strip_aliased_non_local(krate));
436+
krate = track!(propagate_doc_cfg(krate));
437+
}
438+
439+
krate = track!(strip_hidden(krate));
440+
krate = track!(strip_private(krate));
441+
442+
if show_coverage {
443+
krate = track!(calculate_doc_coverage(krate));
444+
} else {
445+
krate = track!(strip_priv_imports(krate));
446+
(krate, LinkCollector { visited_links, ambiguous_links, .. }) =
447+
track!(collect_intra_doc_links(krate));
448+
krate = track!(propagate_stability(krate));
449+
krate = track!(lint(krate));
450450
}
451451

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

454454
krate =
455455
tcx.sess.time("create_format_cache", || Cache::populate(&mut ctxt, krate, &render_options));
456456

457-
let mut collector =
458-
LinkCollector { cx: &mut ctxt, visited_links: visited, ambiguous_links: ambiguous };
457+
let mut collector = LinkCollector { cx: &mut ctxt, visited_links, ambiguous_links };
459458
collector.resolve_ambiguities();
460459

461460
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_cfg.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,10 @@ use rustc_hir::def_id::LocalDefId;
55
use rustc_middle::ty::TyCtxt;
66
use rustc_span::sym;
77

8-
use super::Pass;
98
use crate::clean::{Attributes, Crate, Item};
109
use crate::core::DocContext;
1110
use crate::visit::DocVisitor;
1211

13-
pub(crate) const CHECK_DOC_CFG: Pass = Pass { name: "check-doc-cfg", run: Some(check_doc_cfg) };
14-
1512
pub(crate) fn check_doc_cfg(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
1613
let mut checker = DocCfgChecker { cx };
1714
checker.visit_crate(&krate);

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
@@ -9,15 +9,11 @@ use rustc_middle::ty;
99
use rustc_span::symbol::sym;
1010
use tracing::debug;
1111

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

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

52-
/// The list of passes run by default.
53-
const DEFAULT_PASSES: &[ConditionalPass] = &[
54-
ConditionalPass::always(collect_trait_impls::COLLECT_TRAIT_IMPLS),
55-
ConditionalPass::always(check_doc_test_visibility::CHECK_DOC_TEST_VISIBILITY),
56-
ConditionalPass::always(check_doc_cfg::CHECK_DOC_CFG),
57-
ConditionalPass::always(strip_aliased_non_local::STRIP_ALIASED_NON_LOCAL),
58-
ConditionalPass::always(propagate_doc_cfg::PROPAGATE_DOC_CFG),
59-
ConditionalPass::new(strip_hidden::STRIP_HIDDEN, WhenNotDocumentHidden),
60-
ConditionalPass::new(strip_private::STRIP_PRIVATE, WhenNotDocumentPrivate),
61-
ConditionalPass::new(strip_priv_imports::STRIP_PRIV_IMPORTS, WhenDocumentPrivate),
62-
ConditionalPass::always(collect_intra_doc_links::COLLECT_INTRA_DOC_LINKS),
63-
ConditionalPass::always(propagate_stability::PROPAGATE_STABILITY),
64-
ConditionalPass::always(lint::RUN_LINTS),
65-
];
66-
67-
/// The list of default passes run when `--doc-coverage` is passed to rustdoc.
68-
const COVERAGE_PASSES: &[ConditionalPass] = &[
69-
ConditionalPass::new(strip_hidden::STRIP_HIDDEN, WhenNotDocumentHidden),
70-
ConditionalPass::new(strip_private::STRIP_PRIVATE, WhenNotDocumentPrivate),
71-
ConditionalPass::always(calculate_doc_coverage::CALCULATE_DOC_COVERAGE),
72-
];
73-
74-
impl ConditionalPass {
75-
pub(crate) const fn always(pass: Pass) -> Self {
76-
Self::new(pass, Always)
77-
}
78-
79-
pub(crate) const fn new(pass: Pass, condition: Condition) -> Self {
80-
ConditionalPass { pass, condition }
81-
}
82-
}
83-
84-
/// Returns the given default set of passes.
85-
pub(crate) fn defaults(show_coverage: bool) -> &'static [ConditionalPass] {
86-
if show_coverage { COVERAGE_PASSES } else { DEFAULT_PASSES }
87-
}
30+
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
@@ -11,10 +11,6 @@ use crate::clean::inline::{load_attrs, merge_attrs};
1111
use crate::clean::{CfgInfo, Crate, Item, ItemKind};
1212
use crate::core::DocContext;
1313
use crate::fold::DocFolder;
14-
use crate::passes::Pass;
15-
16-
pub(crate) const PROPAGATE_DOC_CFG: Pass =
17-
Pass { name: "propagate-doc-cfg", run: Some(propagate_doc_cfg) };
1814

1915
pub(crate) fn propagate_doc_cfg(cr: Crate, cx: &mut DocContext<'_>) -> Crate {
2016
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);

0 commit comments

Comments
 (0)