@@ -22,12 +22,12 @@ use rustc::lint;
22
22
use rustc:: middle:: privacy:: { AccessLevel , AccessLevels } ;
23
23
use rustc:: ty:: { self , TyCtxt , Ty , TraitRef , TypeFoldable , GenericParamDefKind } ;
24
24
use rustc:: ty:: fold:: TypeVisitor ;
25
- use rustc:: ty:: query:: Providers ;
25
+ use rustc:: ty:: query:: { Providers , queries } ;
26
26
use rustc:: ty:: subst:: Substs ;
27
27
use rustc:: util:: nodemap:: NodeSet ;
28
28
use rustc_data_structures:: fx:: FxHashSet ;
29
29
use rustc_data_structures:: sync:: Lrc ;
30
- use syntax:: ast:: { self , CRATE_NODE_ID , Ident } ;
30
+ use syntax:: ast:: { self , DUMMY_NODE_ID , Ident } ;
31
31
use syntax:: attr;
32
32
use syntax:: symbol:: keywords;
33
33
use syntax_pos:: Span ;
@@ -782,6 +782,11 @@ impl<'a, 'tcx> Visitor<'tcx> for NamePrivacyVisitor<'a, 'tcx> {
782
782
NestedVisitorMap :: All ( & self . tcx . hir ( ) )
783
783
}
784
784
785
+ fn visit_mod ( & mut self , _m : & ' tcx hir:: Mod , _s : Span , _n : ast:: NodeId ) {
786
+ // Don't visit nested modules, since we run a separate visitor walk
787
+ // for each module in `privacy_access_levels`
788
+ }
789
+
785
790
fn visit_nested_body ( & mut self , body : hir:: BodyId ) {
786
791
let orig_tables = mem:: replace ( & mut self . tables , self . tcx . body_tables ( body) ) ;
787
792
let body = self . tcx . hir ( ) . body ( body) ;
@@ -917,6 +922,11 @@ impl<'a, 'tcx> Visitor<'tcx> for TypePrivacyVisitor<'a, 'tcx> {
917
922
NestedVisitorMap :: All ( & self . tcx . hir ( ) )
918
923
}
919
924
925
+ fn visit_mod ( & mut self , _m : & ' tcx hir:: Mod , _s : Span , _n : ast:: NodeId ) {
926
+ // Don't visit nested modules, since we run a separate visitor walk
927
+ // for each module in `privacy_access_levels`
928
+ }
929
+
920
930
fn visit_nested_body ( & mut self , body : hir:: BodyId ) {
921
931
let orig_tables = mem:: replace ( & mut self . tables , self . tcx . body_tables ( body) ) ;
922
932
let orig_in_body = mem:: replace ( & mut self . in_body , true ) ;
@@ -1659,6 +1669,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx>
1659
1669
pub fn provide ( providers : & mut Providers ) {
1660
1670
* providers = Providers {
1661
1671
privacy_access_levels,
1672
+ check_mod_privacy,
1662
1673
..* providers
1663
1674
} ;
1664
1675
}
@@ -1667,34 +1678,43 @@ pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> Lrc<AccessLevels> {
1667
1678
tcx. privacy_access_levels ( LOCAL_CRATE )
1668
1679
}
1669
1680
1670
- fn privacy_access_levels < ' a , ' tcx > ( tcx : TyCtxt < ' a , ' tcx , ' tcx > ,
1671
- krate : CrateNum )
1672
- -> Lrc < AccessLevels > {
1673
- assert_eq ! ( krate, LOCAL_CRATE ) ;
1674
-
1675
- let krate = tcx. hir ( ) . krate ( ) ;
1681
+ fn check_mod_privacy < ' tcx > ( tcx : TyCtxt < ' _ , ' tcx , ' tcx > , module_def_id : DefId ) {
1676
1682
let empty_tables = ty:: TypeckTables :: empty ( None ) ;
1677
1683
1678
1684
// Check privacy of names not checked in previous compilation stages.
1679
1685
let mut visitor = NamePrivacyVisitor {
1680
1686
tcx,
1681
1687
tables : & empty_tables,
1682
- current_item : CRATE_NODE_ID ,
1688
+ current_item : DUMMY_NODE_ID ,
1683
1689
empty_tables : & empty_tables,
1684
1690
} ;
1685
- intravisit:: walk_crate ( & mut visitor, krate) ;
1691
+ let ( module, span, node_id) = tcx. hir ( ) . get_module ( module_def_id) ;
1692
+ intravisit:: walk_mod ( & mut visitor, module, node_id) ;
1686
1693
1687
1694
// Check privacy of explicitly written types and traits as well as
1688
1695
// inferred types of expressions and patterns.
1689
1696
let mut visitor = TypePrivacyVisitor {
1690
1697
tcx,
1691
1698
tables : & empty_tables,
1692
- current_item : DefId :: local ( CRATE_DEF_INDEX ) ,
1699
+ current_item : module_def_id ,
1693
1700
in_body : false ,
1694
- span : krate . span ,
1701
+ span,
1695
1702
empty_tables : & empty_tables,
1696
1703
} ;
1697
- intravisit:: walk_crate ( & mut visitor, krate) ;
1704
+ intravisit:: walk_mod ( & mut visitor, module, node_id) ;
1705
+ }
1706
+
1707
+ fn privacy_access_levels < ' tcx > (
1708
+ tcx : TyCtxt < ' _ , ' tcx , ' tcx > ,
1709
+ krate : CrateNum ,
1710
+ ) -> Lrc < AccessLevels > {
1711
+ assert_eq ! ( krate, LOCAL_CRATE ) ;
1712
+
1713
+ let krate = tcx. hir ( ) . krate ( ) ;
1714
+
1715
+ for & module in krate. modules . keys ( ) {
1716
+ queries:: check_mod_privacy:: ensure ( tcx, tcx. hir ( ) . local_def_id ( module) ) ;
1717
+ }
1698
1718
1699
1719
// Build up a set of all exported items in the AST. This is a set of all
1700
1720
// items which are reachable from external crates based on visibility.
0 commit comments