@@ -1760,19 +1760,15 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx>
17601760pub fn provide ( providers : & mut Providers < ' _ > ) {
17611761 * providers = Providers {
17621762 privacy_access_levels,
1763+ check_privacy,
17631764 check_mod_privacy,
17641765 ..* providers
17651766 } ;
17661767}
17671768
1768- pub fn check_crate < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ) -> Lrc < AccessLevels > {
1769- tcx. privacy_access_levels ( LOCAL_CRATE )
1770- }
1771-
17721769fn check_mod_privacy < ' tcx > ( tcx : TyCtxt < ' _ , ' tcx , ' tcx > , module_def_id : DefId ) {
17731770 let empty_tables = ty:: TypeckTables :: empty ( None ) ;
17741771
1775-
17761772 // Check privacy of names not checked in previous compilation stages.
17771773 let mut visitor = NamePrivacyVisitor {
17781774 tcx,
@@ -1803,18 +1799,6 @@ fn privacy_access_levels<'tcx>(
18031799) -> Lrc < AccessLevels > {
18041800 assert_eq ! ( krate, LOCAL_CRATE ) ;
18051801
1806- let krate = tcx. hir ( ) . krate ( ) ;
1807-
1808- for & module in krate. modules . keys ( ) {
1809- tcx. ensure ( ) . check_mod_privacy ( tcx. hir ( ) . local_def_id ( module) ) ;
1810- }
1811-
1812- let private_crates: FxHashSet < CrateNum > = tcx. sess . opts . extern_private . iter ( )
1813- . flat_map ( |c| {
1814- tcx. crates ( ) . iter ( ) . find ( |& & krate| & tcx. crate_name ( krate) == c) . cloned ( )
1815- } ) . collect ( ) ;
1816-
1817-
18181802 // Build up a set of all exported items in the AST. This is a set of all
18191803 // items which are reachable from external crates based on visibility.
18201804 let mut visitor = EmbargoVisitor {
@@ -1824,7 +1808,7 @@ fn privacy_access_levels<'tcx>(
18241808 changed : false ,
18251809 } ;
18261810 loop {
1827- intravisit:: walk_crate ( & mut visitor, krate) ;
1811+ intravisit:: walk_crate ( & mut visitor, tcx . hir ( ) . krate ( ) ) ;
18281812 if visitor. changed {
18291813 visitor. changed = false ;
18301814 } else {
@@ -1833,36 +1817,46 @@ fn privacy_access_levels<'tcx>(
18331817 }
18341818 visitor. update ( hir:: CRATE_HIR_ID , Some ( AccessLevel :: Public ) ) ;
18351819
1836- {
1837- let mut visitor = ObsoleteVisiblePrivateTypesVisitor {
1838- tcx,
1839- access_levels : & visitor. access_levels ,
1840- in_variant : false ,
1841- old_error_set : Default :: default ( ) ,
1842- } ;
1843- intravisit:: walk_crate ( & mut visitor, krate) ;
1820+ Lrc :: new ( visitor. access_levels )
1821+ }
18441822
1823+ fn check_privacy < ' tcx > ( tcx : TyCtxt < ' _ , ' tcx , ' tcx > , krate : CrateNum ) {
1824+ assert_eq ! ( krate, LOCAL_CRATE ) ;
18451825
1846- let has_pub_restricted = {
1847- let mut pub_restricted_visitor = PubRestrictedVisitor {
1848- tcx,
1849- has_pub_restricted : false
1850- } ;
1851- intravisit:: walk_crate ( & mut pub_restricted_visitor, krate) ;
1852- pub_restricted_visitor. has_pub_restricted
1853- } ;
1826+ let access_levels = tcx. privacy_access_levels ( LOCAL_CRATE ) ;
18541827
1855- // Check for private types and traits in public interfaces.
1856- let mut visitor = PrivateItemsInPublicInterfacesVisitor {
1828+ let krate = tcx. hir ( ) . krate ( ) ;
1829+
1830+ let mut visitor = ObsoleteVisiblePrivateTypesVisitor {
1831+ tcx,
1832+ access_levels : & access_levels,
1833+ in_variant : false ,
1834+ old_error_set : Default :: default ( ) ,
1835+ } ;
1836+ intravisit:: walk_crate ( & mut visitor, krate) ;
1837+
1838+ let has_pub_restricted = {
1839+ let mut pub_restricted_visitor = PubRestrictedVisitor {
18571840 tcx,
1858- has_pub_restricted,
1859- old_error_set : & visitor. old_error_set ,
1860- private_crates
1841+ has_pub_restricted : false
18611842 } ;
1862- krate. visit_all_item_likes ( & mut DeepVisitor :: new ( & mut visitor) ) ;
1863- }
1843+ intravisit:: walk_crate ( & mut pub_restricted_visitor, krate) ;
1844+ pub_restricted_visitor. has_pub_restricted
1845+ } ;
18641846
1865- Lrc :: new ( visitor. access_levels )
1847+ let private_crates: FxHashSet < CrateNum > = tcx. sess . opts . extern_private . iter ( )
1848+ . flat_map ( |c| {
1849+ tcx. crates ( ) . iter ( ) . find ( |& & krate| & tcx. crate_name ( krate) == c) . cloned ( )
1850+ } ) . collect ( ) ;
1851+
1852+ // Check for private types and traits in public interfaces.
1853+ let mut visitor = PrivateItemsInPublicInterfacesVisitor {
1854+ tcx,
1855+ has_pub_restricted,
1856+ old_error_set : & visitor. old_error_set ,
1857+ private_crates
1858+ } ;
1859+ krate. visit_all_item_likes ( & mut DeepVisitor :: new ( & mut visitor) ) ;
18661860}
18671861
18681862__build_diagnostic_array ! { librustc_privacy, DIAGNOSTICS }
0 commit comments