Skip to content

Commit 18dcad6

Browse files
committed
[WIP]
1 parent 05336f3 commit 18dcad6

15 files changed

+70
-157
lines changed

src/librustdoc/core.rs

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

3938
pub(crate) struct DocContext<'tcx> {
@@ -421,38 +420,39 @@ pub(crate) fn run_global_ctxt(
421420
}
422421
}
423422

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

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

452453
krate = tcx.sess.time("create_format_cache", || Cache::populate(&mut ctxt, krate));
453454

454-
let mut collector =
455-
LinkCollector { cx: &mut ctxt, visited_links: visited, ambiguous_links: ambiguous };
455+
let mut collector = LinkCollector { cx: &mut ctxt, visited_links, ambiguous_links };
456456
collector.resolve_ambiguities();
457457

458458
tcx.dcx().abort_if_errors();

src/librustdoc/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#![feature(assert_matches)]
1010
#![feature(box_patterns)]
1111
#![feature(debug_closure_helpers)]
12+
#![feature(decl_macro)]
1213
#![feature(file_buffered)]
1314
#![feature(if_let_guard)]
1415
#![feature(iter_advance_by)]
@@ -218,7 +219,7 @@ fn init_logging(early_dcx: &EarlyDiagCtxt) {
218219
.with_ansi(color_logs)
219220
.with_targets(true)
220221
.with_wraparound(10)
221-
.with_verbose_exit(true)
222+
.with_verbose_exit(false)
222223
.with_verbose_entry(true)
223224
.with_indent_amount(2);
224225
#[cfg(debug_assertions)]

src/librustdoc/passes/calculate_doc_coverage.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,13 @@ use tracing::debug;
1414
use crate::clean;
1515
use crate::core::DocContext;
1616
use crate::html::markdown::{ErrorCodes, find_testable_code};
17-
use crate::passes::Pass;
1817
use crate::passes::check_doc_test_visibility::{Tests, should_have_doc_example};
1918
use crate::visit::DocVisitor;
2019

21-
pub(crate) const CALCULATE_DOC_COVERAGE: Pass =
22-
Pass { name: "calculate-doc-coverage", run: Some(calculate_doc_coverage) };
23-
24-
fn calculate_doc_coverage(krate: clean::Crate, ctx: &mut DocContext<'_>) -> clean::Crate {
20+
pub(crate) fn calculate_doc_coverage(
21+
krate: clean::Crate,
22+
ctx: &mut DocContext<'_>,
23+
) -> clean::Crate {
2524
let mut calc = CoverageCalculator { items: Default::default(), ctx };
2625
calc.visit_crate(&krate);
2726

src/librustdoc/passes/check_doc_cfg.rs

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

6-
use super::Pass;
76
use crate::clean::{Attributes, Crate, Item};
87
use crate::core::DocContext;
98
use crate::visit::DocVisitor;
109

11-
pub(crate) const CHECK_DOC_CFG: Pass = Pass { name: "check-doc-cfg", run: Some(check_doc_cfg) };
12-
1310
pub(crate) fn check_doc_cfg(krate: Crate, cx: &mut DocContext<'_>) -> Crate {
1411
let mut checker = DocCfgChecker { cx };
1512
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
@@ -8,15 +8,11 @@ use rustc_middle::ty;
88
use rustc_span::symbol::sym;
99
use tracing::debug;
1010

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

17-
pub(crate) const COLLECT_TRAIT_IMPLS: Pass =
18-
Pass { name: "collect-trait-impls", run: Some(collect_trait_impls) };
19-
2016
pub(crate) fn collect_trait_impls(mut krate: Crate, cx: &mut DocContext<'_>) -> Crate {
2117
let tcx = cx.tcx;
2218
// 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
@@ -7,18 +7,15 @@ mod html_tags;
77
mod redundant_explicit_links;
88
mod unescaped_backticks;
99

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

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

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

src/librustdoc/passes/mod.rs

Lines changed: 16 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,87 +1,23 @@
11
//! Contains information about "passes", used to modify crate information during the documentation
22
//! process.
33
4-
use self::Condition::*;
5-
use crate::clean;
6-
use crate::core::DocContext;
7-
84
mod stripper;
95
pub(crate) use stripper::*;
106

11-
mod calculate_doc_coverage;
12-
mod check_doc_cfg;
13-
mod check_doc_test_visibility;
7+
pub(crate) mod calculate_doc_coverage;
8+
pub(crate) mod check_doc_cfg;
9+
pub(crate) mod check_doc_test_visibility;
1410
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,
50-
}
51-
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::new(strip_hidden::STRIP_HIDDEN, WhenNotDocumentHidden),
59-
ConditionalPass::new(strip_private::STRIP_PRIVATE, WhenNotDocumentPrivate),
60-
ConditionalPass::new(strip_priv_imports::STRIP_PRIV_IMPORTS, WhenDocumentPrivate),
61-
ConditionalPass::always(collect_intra_doc_links::COLLECT_INTRA_DOC_LINKS),
62-
ConditionalPass::always(propagate_doc_cfg::PROPAGATE_DOC_CFG),
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-
}
11+
pub(crate) mod collect_trait_impls;
12+
pub(crate) mod lint;
13+
pub(crate) mod propagate_doc_cfg;
14+
pub(crate) mod propagate_stability;
15+
pub(crate) mod strip_aliased_non_local;
16+
pub(crate) mod strip_hidden;
17+
pub(crate) mod strip_priv_imports;
18+
pub(crate) mod strip_private;
19+
20+
pub(crate) macro track($tcx:expr, $name:ident($( $args:tt )*)) {{
21+
tracing::debug!("running pass `{}`", stringify!($name));
22+
$tcx.sess.time(stringify!($name), || self::$name::$name($( $args )*))
23+
}}

src/librustdoc/passes/propagate_doc_cfg.rs

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

1713
pub(crate) fn propagate_doc_cfg(cr: Crate, cx: &mut DocContext<'_>) -> Crate {
1814
CfgPropagator { parent_cfg: None, parent: None, cx }.fold_crate(cr)

0 commit comments

Comments
 (0)