@@ -3,14 +3,29 @@ use rustc_hir::def_id::DefId;
3
3
use rustc_middle:: middle:: privacy:: AccessLevels ;
4
4
use std:: mem;
5
5
6
- use crate :: clean:: { self , Item , ItemIdSet } ;
6
+ use crate :: clean:: { self , Item , ItemId , ItemIdSet } ;
7
7
use crate :: fold:: { strip_item, DocFolder } ;
8
8
use crate :: formats:: cache:: Cache ;
9
9
10
10
pub ( crate ) struct Stripper < ' a > {
11
11
pub ( crate ) retained : & ' a mut ItemIdSet ,
12
12
pub ( crate ) access_levels : & ' a AccessLevels < DefId > ,
13
13
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
+ }
14
29
}
15
30
16
31
impl < ' a > DocFolder for Stripper < ' a > {
@@ -45,9 +60,8 @@ impl<'a> DocFolder for Stripper<'a> {
45
60
| clean:: TraitAliasItem ( ..)
46
61
| clean:: MacroItem ( ..)
47
62
| 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) {
51
65
debug ! ( "Stripper: stripping {:?} {:?}" , i. type_( ) , i. name) ;
52
66
return None ;
53
67
}
0 commit comments