Skip to content

Commit 718c13f

Browse files
committed
auto merge of #12195 : kballard/rust/rustdoc-strip-impls-of-stripped, r=cmr
Strip trait impls for types that are stripped either due to the strip-hidden or strip-private passes. This fixes the search index including trait methods on stripped structs (which breaks searching), and it also removes private types from the implementors list of a trait. Fixes #9981 and #11439.
2 parents 3f717bb + 9e6c3f0 commit 718c13f

File tree

1 file changed

+61
-21
lines changed

1 file changed

+61
-21
lines changed

src/librustdoc/passes.rs

+61-21
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

@@ -110,8 +142,16 @@ impl<'a> fold::DocFolder for Stripper<'a> {
110142
// handled below
111143
clean::ModuleItem(..) => {}
112144

113-
// impls/tymethods have no control over privacy
114-
clean::ImplItem(..) | clean::TyMethodItem(..) => {}
145+
// trait impls for private items should be stripped
146+
clean::ImplItem(clean::Impl{ for_: clean::ResolvedPath{ id: ref for_id, .. }, .. }) => {
147+
if !self.exported_items.contains(for_id) {
148+
return None;
149+
}
150+
}
151+
clean::ImplItem(..) => {}
152+
153+
// tymethods have no control over privacy
154+
clean::TyMethodItem(..) => {}
115155
}
116156

117157
let fastreturn = match i.inner {

0 commit comments

Comments
 (0)