@@ -3,14 +3,29 @@ use rustc_hir::def_id::DefId;
33use rustc_middle:: middle:: privacy:: AccessLevels ;
44use std:: mem;
55
6- use crate :: clean:: { self , Item , ItemIdSet } ;
6+ use crate :: clean:: { self , Item , ItemId , ItemIdSet } ;
77use crate :: fold:: { strip_item, DocFolder } ;
88use crate :: formats:: cache:: Cache ;
99
1010pub ( crate ) struct Stripper < ' a > {
1111 pub ( crate ) retained : & ' a mut ItemIdSet ,
1212 pub ( crate ) access_levels : & ' a AccessLevels < DefId > ,
1313 pub ( crate ) update_retained : bool ,
14+ pub ( crate ) is_json_output : bool ,
15+ }
16+
17+ impl < ' a > Stripper < ' a > {
18+ // We need to handle this differently for the JSON output because some non exported items could
19+ // be used in public API. And so, we need these items as well. `is_exported` only checks if they
20+ // are in the public API, which is not enough.
21+ #[ inline]
22+ fn is_item_reachable ( & self , item_id : ItemId ) -> bool {
23+ if self . is_json_output {
24+ self . access_levels . is_reachable ( item_id. expect_def_id ( ) )
25+ } else {
26+ self . access_levels . is_exported ( item_id. expect_def_id ( ) )
27+ }
28+ }
1429}
1530
1631impl < ' a > DocFolder for Stripper < ' a > {
@@ -45,9 +60,8 @@ impl<'a> DocFolder for Stripper<'a> {
4560 | clean:: TraitAliasItem ( ..)
4661 | clean:: MacroItem ( ..)
4762 | clean:: ForeignTypeItem => {
48- if i. item_id . is_local ( )
49- && !self . access_levels . is_exported ( i. item_id . expect_def_id ( ) )
50- {
63+ let item_id = i. item_id ;
64+ if item_id. is_local ( ) && !self . is_item_reachable ( item_id) {
5165 debug ! ( "Stripper: stripping {:?} {:?}" , i. type_( ) , i. name) ;
5266 return None ;
5367 }
0 commit comments