Skip to content

Commit aaec101

Browse files
strongly-typed passes
1 parent 667fdc1 commit aaec101

8 files changed

+86
-49
lines changed

src/librustdoc/lib.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#![feature(entry_and_modify)]
2727
#![feature(ptr_offset_from)]
2828
#![feature(crate_visibility_modifier)]
29+
#![feature(const_fn)]
2930

3031
#![recursion_limit="256"]
3132

@@ -367,8 +368,8 @@ fn main_args(args: &[String]) -> isize {
367368

368369
if matches.opt_strs("passes") == ["list"] {
369370
println!("Available passes for running rustdoc:");
370-
for &(name, _, description) in passes::PASSES {
371-
println!("{:>20} - {}", name, description);
371+
for pass in passes::PASSES {
372+
println!("{:>20} - {}", pass.name(), pass.description());
372373
}
373374
println!("\nDefault passes for rustdoc:");
374375
for &name in passes::DEFAULT_PASSES {
@@ -751,8 +752,13 @@ where R: 'static + Send,
751752

752753
for pass in &passes {
753754
// determine if we know about this pass
754-
let pass = match passes::PASSES.iter().find(|(p, ..)| p == pass) {
755-
Some(pass) => pass.1,
755+
let pass = match passes::PASSES.iter().find(|p| p.name() == pass) {
756+
Some(pass) => if let Some(pass) = pass.late_fn() {
757+
pass
758+
} else {
759+
// not a late pass, but still valid so don't report the error
760+
continue
761+
}
756762
None => {
757763
error!("unknown pass {}, skipping", *pass);
758764

src/librustdoc/passes/collapse_docs.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@
1111
use clean::{self, DocFragment, Item};
1212
use fold;
1313
use fold::DocFolder;
14+
use passes::Pass;
1415
use std::mem::replace;
1516

17+
pub const COLLAPSE_DOCS: Pass =
18+
Pass::late("collapse-docs", collapse_docs,
19+
"concatenates all document attributes into one document attribute");
20+
1621
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
1722
enum DocFragmentKind {
1823
Sugared,

src/librustdoc/passes/mod.rs

Lines changed: 46 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -18,61 +18,65 @@ use fold;
1818
use fold::StripItem;
1919

2020
mod collapse_docs;
21-
pub use self::collapse_docs::collapse_docs;
21+
pub use self::collapse_docs::COLLAPSE_DOCS;
2222

2323
mod strip_hidden;
24-
pub use self::strip_hidden::strip_hidden;
24+
pub use self::strip_hidden::STRIP_HIDDEN;
2525

2626
mod strip_private;
27-
pub use self::strip_private::strip_private;
27+
pub use self::strip_private::STRIP_PRIVATE;
2828

2929
mod strip_priv_imports;
30-
pub use self::strip_priv_imports::strip_priv_imports;
30+
pub use self::strip_priv_imports::STRIP_PRIV_IMPORTS;
3131

3232
mod unindent_comments;
33-
pub use self::unindent_comments::unindent_comments;
33+
pub use self::unindent_comments::UNINDENT_COMMENTS;
3434

3535
mod propagate_doc_cfg;
36-
pub use self::propagate_doc_cfg::propagate_doc_cfg;
36+
pub use self::propagate_doc_cfg::PROPAGATE_DOC_CFG;
3737

38-
type Pass = (
39-
&'static str, // name
40-
fn(clean::Crate) -> clean::Crate, // fn
41-
&'static str,
42-
); // description
38+
#[derive(Copy, Clone, Debug)]
39+
pub enum Pass {
40+
LatePass {
41+
name: &'static str,
42+
pass: fn(clean::Crate) -> clean::Crate,
43+
description: &'static str,
44+
}
45+
}
46+
47+
impl Pass {
48+
pub const fn late(name: &'static str,
49+
pass: fn(clean::Crate) -> clean::Crate,
50+
description: &'static str) -> Pass {
51+
Pass::LatePass { name, pass, description }
52+
}
53+
54+
pub fn name(self) -> &'static str {
55+
match self {
56+
Pass::LatePass { name, .. } => name,
57+
}
58+
}
59+
60+
pub fn description(self) -> &'static str {
61+
match self {
62+
Pass::LatePass { description, .. } => description,
63+
}
64+
}
65+
66+
pub fn late_fn(self) -> Option<fn(clean::Crate) -> clean::Crate> {
67+
match self {
68+
Pass::LatePass { pass, .. } => Some(pass),
69+
}
70+
}
71+
}
4372

4473
pub const PASSES: &'static [Pass] = &[
45-
(
46-
"strip-hidden",
47-
strip_hidden,
48-
"strips all doc(hidden) items from the output",
49-
),
50-
(
51-
"unindent-comments",
52-
unindent_comments,
53-
"removes excess indentation on comments in order for markdown to like it",
54-
),
55-
(
56-
"collapse-docs",
57-
collapse_docs,
58-
"concatenates all document attributes into one document attribute",
59-
),
60-
(
61-
"strip-private",
62-
strip_private,
63-
"strips all private items from a crate which cannot be seen externally, \
64-
implies strip-priv-imports",
65-
),
66-
(
67-
"strip-priv-imports",
68-
strip_priv_imports,
69-
"strips all private import statements (`use`, `extern crate`) from a crate",
70-
),
71-
(
72-
"propagate-doc-cfg",
73-
propagate_doc_cfg,
74-
"propagates `#[doc(cfg(...))]` to child items",
75-
),
74+
STRIP_HIDDEN,
75+
UNINDENT_COMMENTS,
76+
COLLAPSE_DOCS,
77+
STRIP_PRIVATE,
78+
STRIP_PRIV_IMPORTS,
79+
PROPAGATE_DOC_CFG,
7680
];
7781

7882
pub const DEFAULT_PASSES: &'static [&'static str] = &[

src/librustdoc/passes/propagate_doc_cfg.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ use std::sync::Arc;
1313
use clean::{Crate, Item};
1414
use clean::cfg::Cfg;
1515
use fold::DocFolder;
16+
use passes::Pass;
17+
18+
pub const PROPAGATE_DOC_CFG: Pass =
19+
Pass::late("propagate-doc-cfg", propagate_doc_cfg,
20+
"propagates `#[doc(cfg(...))]` to child items");
1621

1722
pub fn propagate_doc_cfg(cr: Crate) -> Crate {
1823
CfgPropagator { parent_cfg: None }.fold_crate(cr)

src/librustdoc/passes/strip_hidden.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ use clean::Item;
1616
use fold;
1717
use fold::DocFolder;
1818
use fold::StripItem;
19-
use passes::ImplStripper;
19+
use passes::{ImplStripper, Pass};
20+
21+
pub const STRIP_HIDDEN: Pass =
22+
Pass::late("strip-hidden", strip_hidden,
23+
"strips all doc(hidden) items from the output");
2024

2125
/// Strip items marked `#[doc(hidden)]`
2226
pub fn strip_hidden(krate: clean::Crate) -> clean::Crate {

src/librustdoc/passes/strip_priv_imports.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010

1111
use clean;
1212
use fold::DocFolder;
13-
use passes::ImportStripper;
13+
use passes::{ImportStripper, Pass};
14+
15+
pub const STRIP_PRIV_IMPORTS: Pass = Pass::late("strip-priv-imports", strip_priv_imports,
16+
"strips all private import statements (`use`, `extern crate`) from a crate");
1417

1518
pub fn strip_priv_imports(krate: clean::Crate) -> clean::Crate {
1619
ImportStripper.fold_crate(krate)

src/librustdoc/passes/strip_private.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ use rustc::util::nodemap::DefIdSet;
1212

1313
use clean;
1414
use fold::DocFolder;
15-
use passes::{ImplStripper, ImportStripper, Stripper};
15+
use passes::{ImplStripper, ImportStripper, Stripper, Pass};
16+
17+
pub const STRIP_PRIVATE: Pass =
18+
Pass::late("strip-private", strip_private,
19+
"strips all private items from a crate which cannot be seen externally, \
20+
implies strip-priv-imports");
1621

1722
/// Strip private items from the point of view of a crate or externally from a
1823
/// crate, specified by the `xcrate` flag.

src/librustdoc/passes/unindent_comments.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ use std::usize;
1414

1515
use clean::{self, DocFragment, Item};
1616
use fold::{self, DocFolder};
17+
use passes::Pass;
18+
19+
pub const UNINDENT_COMMENTS: Pass =
20+
Pass::late("unindent-comments", unindent_comments,
21+
"removes excess indentation on comments in order for markdown to like it");
1722

1823
pub fn unindent_comments(krate: clean::Crate) -> clean::Crate {
1924
CommentCleaner.fold_crate(krate)

0 commit comments

Comments
 (0)