@@ -1731,7 +1731,7 @@ impl Clean<Item> for hir::StructField<'_> {
1731
1731
cx,
1732
1732
) ;
1733
1733
// Don't show `pub` for fields on enum variants; they are always public
1734
- Item { visibility : self . vis . clean ( cx) , ..what_rustc_thinks }
1734
+ Item { visibility : hir_visibility ( & self . vis , self . hir_id , cx) , ..what_rustc_thinks }
1735
1735
}
1736
1736
}
1737
1737
@@ -1744,34 +1744,34 @@ impl Clean<Item> for ty::FieldDef {
1744
1744
cx,
1745
1745
) ;
1746
1746
// Don't show `pub` for fields on enum variants; they are always public
1747
- Item { visibility : self . vis . clean ( cx ) , ..what_rustc_thinks }
1748
- }
1749
- }
1750
-
1751
- impl Clean < Visibility > for hir :: Visibility < ' _ > {
1752
- fn clean ( & self , cx : & DocContext < ' _ > ) -> Visibility {
1753
- match self . node {
1754
- hir:: VisibilityKind :: Public => Visibility :: Public ,
1755
- hir :: VisibilityKind :: Inherited => Visibility :: Inherited ,
1756
- hir :: VisibilityKind :: Crate ( _ ) => {
1757
- let krate = DefId :: local ( CRATE_DEF_INDEX ) ;
1758
- Visibility :: Restricted ( krate , cx. tcx . def_path ( krate ) )
1759
- }
1760
- hir :: VisibilityKind :: Restricted { ref path , .. } => {
1761
- let path = path . clean ( cx ) ;
1762
- let did = register_res ( cx , path . res ) ;
1763
- Visibility :: Restricted ( did , cx . tcx . def_path ( did ) )
1764
- }
1765
- }
1766
- }
1767
- }
1768
-
1769
- impl Clean < Visibility > for ty:: Visibility {
1770
- fn clean ( & self , cx : & DocContext < ' _ > ) -> Visibility {
1771
- match * self {
1772
- ty :: Visibility :: Public => Visibility :: Public ,
1773
- ty :: Visibility :: Invisible => Visibility :: Inherited ,
1774
- ty :: Visibility :: Restricted ( module ) => {
1747
+ let hir_id = self . did . as_local ( ) . map ( |local| cx . tcx . hir ( ) . local_def_id_to_hir_id ( local ) ) ;
1748
+ Item { visibility : ty_visibility ( self . vis , hir_id , cx ) , ..what_rustc_thinks }
1749
+ }
1750
+ }
1751
+
1752
+ fn hir_visibility (
1753
+ vis : & hir :: Visibility < ' _ > ,
1754
+ hir_id : hir:: HirId ,
1755
+ cx : & DocContext < ' _ > ,
1756
+ ) -> Visibility {
1757
+ // FIXME: I think this handles `Inherited` wrong
1758
+ ty_visibility ( ty :: Visibility :: from_hir ( vis , hir_id , cx. tcx ) , Some ( hir_id ) , cx )
1759
+ }
1760
+
1761
+ fn ty_visibility (
1762
+ vis : ty :: Visibility ,
1763
+ hir_id : Option < hir :: HirId > ,
1764
+ cx : & DocContext < ' _ > ,
1765
+ ) -> Visibility {
1766
+ match vis {
1767
+ ty :: Visibility :: Public => Visibility :: Public ,
1768
+ ty :: Visibility :: Invisible => Visibility :: Inherited ,
1769
+ ty:: Visibility :: Restricted ( module ) => {
1770
+ let hir_id = hir_id . unwrap_or_else ( || panic ! ( "only local items can have restricted visibility (while calculating vis of {:?})" , module ) ) ;
1771
+ let parent = cx . tcx . parent_module ( hir_id ) . to_def_id ( ) ;
1772
+ if parent == module {
1773
+ Visibility :: RestrictSelf
1774
+ } else {
1775
1775
Visibility :: Restricted ( module, cx. tcx . def_path ( module) )
1776
1776
}
1777
1777
}
@@ -2093,7 +2093,7 @@ impl Clean<Vec<Item>> for doctree::Impl<'_> {
2093
2093
attrs : self . attrs . clean ( cx) ,
2094
2094
source : self . span . clean ( cx) ,
2095
2095
def_id : def_id. to_def_id ( ) ,
2096
- visibility : self . vis . clean ( cx) ,
2096
+ visibility : hir_visibility ( self . vis , self . id , cx) ,
2097
2097
stability : cx. stability ( self . id ) ,
2098
2098
deprecation : cx. deprecation ( self . id ) . clean ( cx) ,
2099
2099
inner : ImplItem ( Impl {
@@ -2149,7 +2149,7 @@ impl Clean<Vec<Item>> for doctree::ExternCrate<'_> {
2149
2149
attrs: self . attrs. clean( cx) ,
2150
2150
source: self . span. clean( cx) ,
2151
2151
def_id: DefId { krate: self . cnum, index: CRATE_DEF_INDEX } ,
2152
- visibility: self . vis. clean ( cx) ,
2152
+ visibility: hir_visibility ( self . vis, self . hir_id , cx) ,
2153
2153
stability: None ,
2154
2154
deprecation: None ,
2155
2155
inner: ExternCrateItem ( self . name. clean( cx) , self . path. clone( ) ) ,
@@ -2220,7 +2220,7 @@ impl Clean<Vec<Item>> for doctree::Import<'_> {
2220
2220
attrs : self . attrs . clean ( cx) ,
2221
2221
source : self . span . clean ( cx) ,
2222
2222
def_id : cx. tcx . hir ( ) . local_def_id ( self . id ) . to_def_id ( ) ,
2223
- visibility : self . vis . clean ( cx) ,
2223
+ visibility : hir_visibility ( self . vis , self . id , cx) ,
2224
2224
stability : None ,
2225
2225
deprecation : None ,
2226
2226
inner : ImportItem ( Import :: new_simple (
@@ -2240,7 +2240,7 @@ impl Clean<Vec<Item>> for doctree::Import<'_> {
2240
2240
attrs: self . attrs. clean( cx) ,
2241
2241
source: self . span. clean( cx) ,
2242
2242
def_id: DefId :: local( CRATE_DEF_INDEX ) ,
2243
- visibility: self . vis. clean ( cx) ,
2243
+ visibility: hir_visibility ( self . vis, self . id , cx) ,
2244
2244
stability: None ,
2245
2245
deprecation: None ,
2246
2246
inner: ImportItem ( inner) ,
0 commit comments