Skip to content

Commit 9e6c3f0

Browse files
committed
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.
1 parent 52a3d38 commit 9e6c3f0

File tree

1 file changed

+51
-19
lines changed

1 file changed

+51
-19
lines changed

src/librustdoc/passes.rs

+51-19
Original file line numberDiff line numberDiff line change
@@ -22,30 +22,62 @@ use fold::DocFolder;
2222

2323
/// Strip items marked `#[doc(hidden)]`
2424
pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult {
25-
struct Stripper;
26-
impl fold::DocFolder for Stripper {
27-
fn fold_item(&mut self, i: Item) -> Option<Item> {
28-
for attr in i.attrs.iter() {
29-
match attr {
30-
&clean::List(~"doc", ref l) => {
31-
for innerattr in l.iter() {
32-
match innerattr {
33-
&clean::Word(ref s) if "hidden" == *s => {
34-
debug!("found one in strip_hidden; removing");
35-
return None;
36-
},
37-
_ => (),
25+
let mut stripped = HashSet::new();
26+
27+
// strip all #[doc(hidden)] items
28+
let krate = {
29+
struct Stripper<'a> {
30+
stripped: &'a mut HashSet<ast::NodeId>
31+
};
32+
impl<'a> fold::DocFolder for Stripper<'a> {
33+
fn fold_item(&mut self, i: Item) -> Option<Item> {
34+
for attr in i.attrs.iter() {
35+
match attr {
36+
&clean::List(~"doc", ref l) => {
37+
for innerattr in l.iter() {
38+
match innerattr {
39+
&clean::Word(ref s) if "hidden" == *s => {
40+
debug!("found one in strip_hidden; removing");
41+
self.stripped.insert(i.id);
42+
return None;
43+
},
44+
_ => (),
45+
}
3846
}
47+
},
48+
_ => ()
49+
}
50+
}
51+
self.fold_item_recur(i)
52+
}
53+
}
54+
let mut stripper = Stripper{ stripped: &mut stripped };
55+
stripper.fold_crate(krate)
56+
};
57+
58+
// strip any traits implemented on stripped items
59+
let krate = {
60+
struct ImplStripper<'a> {
61+
stripped: &'a mut HashSet<ast::NodeId>
62+
};
63+
impl<'a> fold::DocFolder for ImplStripper<'a> {
64+
fn fold_item(&mut self, i: Item) -> Option<Item> {
65+
match i.inner {
66+
clean::ImplItem(clean::Impl{ for_: clean::ResolvedPath{ id: for_id, .. },
67+
.. }) => {
68+
if self.stripped.contains(&for_id) {
69+
return None;
3970
}
40-
},
41-
_ => ()
71+
}
72+
_ => {}
4273
}
74+
self.fold_item_recur(i)
4375
}
44-
self.fold_item_recur(i)
4576
}
46-
}
47-
let mut stripper = Stripper;
48-
let krate = stripper.fold_crate(krate);
77+
let mut stripper = ImplStripper{ stripped: &mut stripped };
78+
stripper.fold_crate(krate)
79+
};
80+
4981
(krate, None)
5082
}
5183

0 commit comments

Comments
 (0)