diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index dda97cfdb2c..f59d3fb68bf 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -26,6 +26,7 @@ #![feature(entry_and_modify)] #![feature(ptr_offset_from)] #![feature(crate_visibility_modifier)] +#![feature(const_fn)] #![recursion_limit="256"] @@ -367,8 +368,8 @@ fn main_args(args: &[String]) -> isize { if matches.opt_strs("passes") == ["list"] { println!("Available passes for running rustdoc:"); - for &(name, _, description) in passes::PASSES { - println!("{:>20} - {}", name, description); + for pass in passes::PASSES { + println!("{:>20} - {}", pass.name(), pass.description()); } println!("\nDefault passes for rustdoc:"); for &name in passes::DEFAULT_PASSES { @@ -751,8 +752,13 @@ where R: 'static + Send, for pass in &passes { // determine if we know about this pass - let pass = match passes::PASSES.iter().find(|(p, ..)| p == pass) { - Some(pass) => pass.1, + let pass = match passes::PASSES.iter().find(|p| p.name() == pass) { + Some(pass) => if let Some(pass) = pass.late_fn() { + pass + } else { + // not a late pass, but still valid so don't report the error + continue + } None => { error!("unknown pass {}, skipping", *pass); diff --git a/src/librustdoc/passes/collapse_docs.rs b/src/librustdoc/passes/collapse_docs.rs index 6f70fcf1099..33d052775ba 100644 --- a/src/librustdoc/passes/collapse_docs.rs +++ b/src/librustdoc/passes/collapse_docs.rs @@ -11,8 +11,13 @@ use clean::{self, DocFragment, Item}; use fold; use fold::DocFolder; +use passes::Pass; use std::mem::replace; +pub const COLLAPSE_DOCS: Pass = + Pass::late("collapse-docs", collapse_docs, + "concatenates all document attributes into one document attribute"); + #[derive(Copy, Clone, Debug, PartialEq, Eq)] enum DocFragmentKind { Sugared, diff --git a/src/librustdoc/passes/mod.rs b/src/librustdoc/passes/mod.rs index aa4acaf75bf..e3f867d7fb1 100644 --- a/src/librustdoc/passes/mod.rs +++ b/src/librustdoc/passes/mod.rs @@ -18,61 +18,65 @@ use fold; use fold::StripItem; mod collapse_docs; -pub use self::collapse_docs::collapse_docs; +pub use self::collapse_docs::COLLAPSE_DOCS; mod strip_hidden; -pub use self::strip_hidden::strip_hidden; +pub use self::strip_hidden::STRIP_HIDDEN; mod strip_private; -pub use self::strip_private::strip_private; +pub use self::strip_private::STRIP_PRIVATE; mod strip_priv_imports; -pub use self::strip_priv_imports::strip_priv_imports; +pub use self::strip_priv_imports::STRIP_PRIV_IMPORTS; mod unindent_comments; -pub use self::unindent_comments::unindent_comments; +pub use self::unindent_comments::UNINDENT_COMMENTS; mod propagate_doc_cfg; -pub use self::propagate_doc_cfg::propagate_doc_cfg; +pub use self::propagate_doc_cfg::PROPAGATE_DOC_CFG; -type Pass = ( - &'static str, // name - fn(clean::Crate) -> clean::Crate, // fn - &'static str, -); // description +#[derive(Copy, Clone, Debug)] +pub enum Pass { + LatePass { + name: &'static str, + pass: fn(clean::Crate) -> clean::Crate, + description: &'static str, + } +} + +impl Pass { + pub const fn late(name: &'static str, + pass: fn(clean::Crate) -> clean::Crate, + description: &'static str) -> Pass { + Pass::LatePass { name, pass, description } + } + + pub fn name(self) -> &'static str { + match self { + Pass::LatePass { name, .. } => name, + } + } + + pub fn description(self) -> &'static str { + match self { + Pass::LatePass { description, .. } => description, + } + } + + pub fn late_fn(self) -> Option clean::Crate> { + match self { + Pass::LatePass { pass, .. } => Some(pass), + } + } +} pub const PASSES: &'static [Pass] = &[ - ( - "strip-hidden", - strip_hidden, - "strips all doc(hidden) items from the output", - ), - ( - "unindent-comments", - unindent_comments, - "removes excess indentation on comments in order for markdown to like it", - ), - ( - "collapse-docs", - collapse_docs, - "concatenates all document attributes into one document attribute", - ), - ( - "strip-private", - strip_private, - "strips all private items from a crate which cannot be seen externally, \ - implies strip-priv-imports", - ), - ( - "strip-priv-imports", - strip_priv_imports, - "strips all private import statements (`use`, `extern crate`) from a crate", - ), - ( - "propagate-doc-cfg", - propagate_doc_cfg, - "propagates `#[doc(cfg(...))]` to child items", - ), + STRIP_HIDDEN, + UNINDENT_COMMENTS, + COLLAPSE_DOCS, + STRIP_PRIVATE, + STRIP_PRIV_IMPORTS, + PROPAGATE_DOC_CFG, ]; pub const DEFAULT_PASSES: &'static [&'static str] = &[ diff --git a/src/librustdoc/passes/propagate_doc_cfg.rs b/src/librustdoc/passes/propagate_doc_cfg.rs index 572a8d3f470..69093846302 100644 --- a/src/librustdoc/passes/propagate_doc_cfg.rs +++ b/src/librustdoc/passes/propagate_doc_cfg.rs @@ -13,6 +13,11 @@ use std::sync::Arc; use clean::{Crate, Item}; use clean::cfg::Cfg; use fold::DocFolder; +use passes::Pass; + +pub const PROPAGATE_DOC_CFG: Pass = + Pass::late("propagate-doc-cfg", propagate_doc_cfg, + "propagates `#[doc(cfg(...))]` to child items"); pub fn propagate_doc_cfg(cr: Crate) -> Crate { CfgPropagator { parent_cfg: None }.fold_crate(cr) diff --git a/src/librustdoc/passes/strip_hidden.rs b/src/librustdoc/passes/strip_hidden.rs index 279c9603703..2093da41222 100644 --- a/src/librustdoc/passes/strip_hidden.rs +++ b/src/librustdoc/passes/strip_hidden.rs @@ -16,7 +16,11 @@ use clean::Item; use fold; use fold::DocFolder; use fold::StripItem; -use passes::ImplStripper; +use passes::{ImplStripper, Pass}; + +pub const STRIP_HIDDEN: Pass = + Pass::late("strip-hidden", strip_hidden, + "strips all doc(hidden) items from the output"); /// Strip items marked `#[doc(hidden)]` pub fn strip_hidden(krate: clean::Crate) -> clean::Crate { diff --git a/src/librustdoc/passes/strip_priv_imports.rs b/src/librustdoc/passes/strip_priv_imports.rs index c4640839923..62f8b1092c7 100644 --- a/src/librustdoc/passes/strip_priv_imports.rs +++ b/src/librustdoc/passes/strip_priv_imports.rs @@ -10,7 +10,10 @@ use clean; use fold::DocFolder; -use passes::ImportStripper; +use passes::{ImportStripper, Pass}; + +pub const STRIP_PRIV_IMPORTS: Pass = Pass::late("strip-priv-imports", strip_priv_imports, + "strips all private import statements (`use`, `extern crate`) from a crate"); pub fn strip_priv_imports(krate: clean::Crate) -> clean::Crate { ImportStripper.fold_crate(krate) diff --git a/src/librustdoc/passes/strip_private.rs b/src/librustdoc/passes/strip_private.rs index 45f706590e3..0011aedd80a 100644 --- a/src/librustdoc/passes/strip_private.rs +++ b/src/librustdoc/passes/strip_private.rs @@ -12,7 +12,12 @@ use rustc::util::nodemap::DefIdSet; use clean; use fold::DocFolder; -use passes::{ImplStripper, ImportStripper, Stripper}; +use passes::{ImplStripper, ImportStripper, Stripper, Pass}; + +pub const STRIP_PRIVATE: Pass = + Pass::late("strip-private", strip_private, + "strips all private items from a crate which cannot be seen externally, \ + implies strip-priv-imports"); /// Strip private items from the point of view of a crate or externally from a /// crate, specified by the `xcrate` flag. diff --git a/src/librustdoc/passes/unindent_comments.rs b/src/librustdoc/passes/unindent_comments.rs index 2510ec011b6..6d875c107c8 100644 --- a/src/librustdoc/passes/unindent_comments.rs +++ b/src/librustdoc/passes/unindent_comments.rs @@ -14,6 +14,11 @@ use std::usize; use clean::{self, DocFragment, Item}; use fold::{self, DocFolder}; +use passes::Pass; + +pub const UNINDENT_COMMENTS: Pass = + Pass::late("unindent-comments", unindent_comments, + "removes excess indentation on comments in order for markdown to like it"); pub fn unindent_comments(krate: clean::Crate) -> clean::Crate { CommentCleaner.fold_crate(krate)