@@ -22,30 +22,62 @@ use fold::DocFolder;
22
22
23
23
/// Strip items marked `#[doc(hidden)]`
24
24
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
+ }
38
46
}
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 ;
39
70
}
40
- } ,
41
- _ => ( )
71
+ }
72
+ _ => { }
42
73
}
74
+ self . fold_item_recur ( i)
43
75
}
44
- self . fold_item_recur ( i)
45
76
}
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
+
49
81
( krate, None )
50
82
}
51
83
@@ -110,8 +142,16 @@ impl<'a> fold::DocFolder for Stripper<'a> {
110
142
// handled below
111
143
clean:: ModuleItem ( ..) => { }
112
144
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 ( ..) => { }
115
155
}
116
156
117
157
let fastreturn = match i. inner {
0 commit comments