rustdoc: Strip impls of traits on #[doc(hidden)] types
In the strip-hidden pass, record all types that were stripped, and make a second pass stripping all impls of traits for these types.
This commit is contained in:
parent
52a3d38796
commit
9e6c3f03bc
@ -22,30 +22,62 @@ use fold::DocFolder;
|
|||||||
|
|
||||||
/// Strip items marked `#[doc(hidden)]`
|
/// Strip items marked `#[doc(hidden)]`
|
||||||
pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult {
|
pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult {
|
||||||
struct Stripper;
|
let mut stripped = HashSet::new();
|
||||||
impl fold::DocFolder for Stripper {
|
|
||||||
fn fold_item(&mut self, i: Item) -> Option<Item> {
|
// strip all #[doc(hidden)] items
|
||||||
for attr in i.attrs.iter() {
|
let krate = {
|
||||||
match attr {
|
struct Stripper<'a> {
|
||||||
&clean::List(~"doc", ref l) => {
|
stripped: &'a mut HashSet<ast::NodeId>
|
||||||
for innerattr in l.iter() {
|
};
|
||||||
match innerattr {
|
impl<'a> fold::DocFolder for Stripper<'a> {
|
||||||
&clean::Word(ref s) if "hidden" == *s => {
|
fn fold_item(&mut self, i: Item) -> Option<Item> {
|
||||||
debug!("found one in strip_hidden; removing");
|
for attr in i.attrs.iter() {
|
||||||
return None;
|
match attr {
|
||||||
},
|
&clean::List(~"doc", ref l) => {
|
||||||
_ => (),
|
for innerattr in l.iter() {
|
||||||
|
match innerattr {
|
||||||
|
&clean::Word(ref s) if "hidden" == *s => {
|
||||||
|
debug!("found one in strip_hidden; removing");
|
||||||
|
self.stripped.insert(i.id);
|
||||||
|
return None;
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
_ => ()
|
||||||
_ => ()
|
}
|
||||||
}
|
}
|
||||||
|
self.fold_item_recur(i)
|
||||||
}
|
}
|
||||||
self.fold_item_recur(i)
|
|
||||||
}
|
}
|
||||||
}
|
let mut stripper = Stripper{ stripped: &mut stripped };
|
||||||
let mut stripper = Stripper;
|
stripper.fold_crate(krate)
|
||||||
let krate = stripper.fold_crate(krate);
|
};
|
||||||
|
|
||||||
|
// strip any traits implemented on stripped items
|
||||||
|
let krate = {
|
||||||
|
struct ImplStripper<'a> {
|
||||||
|
stripped: &'a mut HashSet<ast::NodeId>
|
||||||
|
};
|
||||||
|
impl<'a> fold::DocFolder for ImplStripper<'a> {
|
||||||
|
fn fold_item(&mut self, i: Item) -> Option<Item> {
|
||||||
|
match i.inner {
|
||||||
|
clean::ImplItem(clean::Impl{ for_: clean::ResolvedPath{ id: for_id, .. },
|
||||||
|
.. }) => {
|
||||||
|
if self.stripped.contains(&for_id) {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
self.fold_item_recur(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut stripper = ImplStripper{ stripped: &mut stripped };
|
||||||
|
stripper.fold_crate(krate)
|
||||||
|
};
|
||||||
|
|
||||||
(krate, None)
|
(krate, None)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user