strongly-typed passes
This commit is contained in:
parent
667fdc1ce4
commit
aaec1014d8
8 changed files with 86 additions and 49 deletions
|
@ -26,6 +26,7 @@
|
||||||
#![feature(entry_and_modify)]
|
#![feature(entry_and_modify)]
|
||||||
#![feature(ptr_offset_from)]
|
#![feature(ptr_offset_from)]
|
||||||
#![feature(crate_visibility_modifier)]
|
#![feature(crate_visibility_modifier)]
|
||||||
|
#![feature(const_fn)]
|
||||||
|
|
||||||
#![recursion_limit="256"]
|
#![recursion_limit="256"]
|
||||||
|
|
||||||
|
@ -367,8 +368,8 @@ fn main_args(args: &[String]) -> isize {
|
||||||
|
|
||||||
if matches.opt_strs("passes") == ["list"] {
|
if matches.opt_strs("passes") == ["list"] {
|
||||||
println!("Available passes for running rustdoc:");
|
println!("Available passes for running rustdoc:");
|
||||||
for &(name, _, description) in passes::PASSES {
|
for pass in passes::PASSES {
|
||||||
println!("{:>20} - {}", name, description);
|
println!("{:>20} - {}", pass.name(), pass.description());
|
||||||
}
|
}
|
||||||
println!("\nDefault passes for rustdoc:");
|
println!("\nDefault passes for rustdoc:");
|
||||||
for &name in passes::DEFAULT_PASSES {
|
for &name in passes::DEFAULT_PASSES {
|
||||||
|
@ -751,8 +752,13 @@ where R: 'static + Send,
|
||||||
|
|
||||||
for pass in &passes {
|
for pass in &passes {
|
||||||
// determine if we know about this pass
|
// determine if we know about this pass
|
||||||
let pass = match passes::PASSES.iter().find(|(p, ..)| p == pass) {
|
let pass = match passes::PASSES.iter().find(|p| p.name() == pass) {
|
||||||
Some(pass) => pass.1,
|
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 => {
|
None => {
|
||||||
error!("unknown pass {}, skipping", *pass);
|
error!("unknown pass {}, skipping", *pass);
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,13 @@
|
||||||
use clean::{self, DocFragment, Item};
|
use clean::{self, DocFragment, Item};
|
||||||
use fold;
|
use fold;
|
||||||
use fold::DocFolder;
|
use fold::DocFolder;
|
||||||
|
use passes::Pass;
|
||||||
use std::mem::replace;
|
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)]
|
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
|
||||||
enum DocFragmentKind {
|
enum DocFragmentKind {
|
||||||
Sugared,
|
Sugared,
|
||||||
|
|
|
@ -18,61 +18,65 @@ use fold;
|
||||||
use fold::StripItem;
|
use fold::StripItem;
|
||||||
|
|
||||||
mod collapse_docs;
|
mod collapse_docs;
|
||||||
pub use self::collapse_docs::collapse_docs;
|
pub use self::collapse_docs::COLLAPSE_DOCS;
|
||||||
|
|
||||||
mod strip_hidden;
|
mod strip_hidden;
|
||||||
pub use self::strip_hidden::strip_hidden;
|
pub use self::strip_hidden::STRIP_HIDDEN;
|
||||||
|
|
||||||
mod strip_private;
|
mod strip_private;
|
||||||
pub use self::strip_private::strip_private;
|
pub use self::strip_private::STRIP_PRIVATE;
|
||||||
|
|
||||||
mod strip_priv_imports;
|
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;
|
mod unindent_comments;
|
||||||
pub use self::unindent_comments::unindent_comments;
|
pub use self::unindent_comments::UNINDENT_COMMENTS;
|
||||||
|
|
||||||
mod propagate_doc_cfg;
|
mod propagate_doc_cfg;
|
||||||
pub use self::propagate_doc_cfg::propagate_doc_cfg;
|
pub use self::propagate_doc_cfg::PROPAGATE_DOC_CFG;
|
||||||
|
|
||||||
type Pass = (
|
#[derive(Copy, Clone, Debug)]
|
||||||
&'static str, // name
|
pub enum Pass {
|
||||||
fn(clean::Crate) -> clean::Crate, // fn
|
LatePass {
|
||||||
&'static str,
|
name: &'static str,
|
||||||
); // description
|
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<fn(clean::Crate) -> clean::Crate> {
|
||||||
|
match self {
|
||||||
|
Pass::LatePass { pass, .. } => Some(pass),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub const PASSES: &'static [Pass] = &[
|
pub const PASSES: &'static [Pass] = &[
|
||||||
(
|
STRIP_HIDDEN,
|
||||||
"strip-hidden",
|
UNINDENT_COMMENTS,
|
||||||
strip_hidden,
|
COLLAPSE_DOCS,
|
||||||
"strips all doc(hidden) items from the output",
|
STRIP_PRIVATE,
|
||||||
),
|
STRIP_PRIV_IMPORTS,
|
||||||
(
|
PROPAGATE_DOC_CFG,
|
||||||
"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",
|
|
||||||
),
|
|
||||||
];
|
];
|
||||||
|
|
||||||
pub const DEFAULT_PASSES: &'static [&'static str] = &[
|
pub const DEFAULT_PASSES: &'static [&'static str] = &[
|
||||||
|
|
|
@ -13,6 +13,11 @@ use std::sync::Arc;
|
||||||
use clean::{Crate, Item};
|
use clean::{Crate, Item};
|
||||||
use clean::cfg::Cfg;
|
use clean::cfg::Cfg;
|
||||||
use fold::DocFolder;
|
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 {
|
pub fn propagate_doc_cfg(cr: Crate) -> Crate {
|
||||||
CfgPropagator { parent_cfg: None }.fold_crate(cr)
|
CfgPropagator { parent_cfg: None }.fold_crate(cr)
|
||||||
|
|
|
@ -16,7 +16,11 @@ use clean::Item;
|
||||||
use fold;
|
use fold;
|
||||||
use fold::DocFolder;
|
use fold::DocFolder;
|
||||||
use fold::StripItem;
|
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)]`
|
/// Strip items marked `#[doc(hidden)]`
|
||||||
pub fn strip_hidden(krate: clean::Crate) -> clean::Crate {
|
pub fn strip_hidden(krate: clean::Crate) -> clean::Crate {
|
||||||
|
|
|
@ -10,7 +10,10 @@
|
||||||
|
|
||||||
use clean;
|
use clean;
|
||||||
use fold::DocFolder;
|
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 {
|
pub fn strip_priv_imports(krate: clean::Crate) -> clean::Crate {
|
||||||
ImportStripper.fold_crate(krate)
|
ImportStripper.fold_crate(krate)
|
||||||
|
|
|
@ -12,7 +12,12 @@ use rustc::util::nodemap::DefIdSet;
|
||||||
|
|
||||||
use clean;
|
use clean;
|
||||||
use fold::DocFolder;
|
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
|
/// Strip private items from the point of view of a crate or externally from a
|
||||||
/// crate, specified by the `xcrate` flag.
|
/// crate, specified by the `xcrate` flag.
|
||||||
|
|
|
@ -14,6 +14,11 @@ use std::usize;
|
||||||
|
|
||||||
use clean::{self, DocFragment, Item};
|
use clean::{self, DocFragment, Item};
|
||||||
use fold::{self, DocFolder};
|
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 {
|
pub fn unindent_comments(krate: clean::Crate) -> clean::Crate {
|
||||||
CommentCleaner.fold_crate(krate)
|
CommentCleaner.fold_crate(krate)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue