@@ -7,7 +7,8 @@ use rustc_ast::EnumDef;
77use rustc_data_structures:: intern:: Interned ;
88use rustc_hir:: def_id:: LocalDefId ;
99use rustc_hir:: def_id:: CRATE_DEF_ID ;
10- use rustc_middle:: middle:: privacy:: { EffectiveVisibilities , EffectiveVisibility , Level } ;
10+ use rustc_middle:: middle:: privacy:: { EffectiveVisibilities , EffectiveVisibility } ;
11+ use rustc_middle:: middle:: privacy:: { IntoDefIdTree , Level } ;
1112use rustc_middle:: ty:: Visibility ;
1213
1314type ImportId < ' a > = Interned < ' a , NameBinding < ' a > > ;
@@ -29,20 +30,35 @@ impl ParentId<'_> {
2930
3031pub struct EffectiveVisibilitiesVisitor < ' r , ' a > {
3132 r : & ' r mut Resolver < ' a > ,
33+ def_effective_visibilities : EffectiveVisibilities ,
3234 /// While walking import chains we need to track effective visibilities per-binding, and def id
3335 /// keys in `Resolver::effective_visibilities` are not enough for that, because multiple
3436 /// bindings can correspond to a single def id in imports. So we keep a separate table.
3537 import_effective_visibilities : EffectiveVisibilities < ImportId < ' a > > ,
3638 changed : bool ,
3739}
3840
41+ impl Resolver < ' _ > {
42+ fn nearest_normal_mod ( & mut self , def_id : LocalDefId ) -> LocalDefId {
43+ self . get_nearest_non_block_module ( def_id. to_def_id ( ) ) . nearest_parent_mod ( ) . expect_local ( )
44+ }
45+ }
46+
47+ impl < ' a , ' b > IntoDefIdTree for & ' b mut Resolver < ' a > {
48+ type Tree = & ' b Resolver < ' a > ;
49+ fn tree ( self ) -> Self :: Tree {
50+ self
51+ }
52+ }
53+
3954impl < ' r , ' a > EffectiveVisibilitiesVisitor < ' r , ' a > {
4055 /// Fills the `Resolver::effective_visibilities` table with public & exported items
4156 /// For now, this doesn't resolve macros (FIXME) and cannot resolve Impl, as we
4257 /// need access to a TyCtxt for that.
4358 pub fn compute_effective_visibilities < ' c > ( r : & ' r mut Resolver < ' a > , krate : & ' c Crate ) {
4459 let mut visitor = EffectiveVisibilitiesVisitor {
4560 r,
61+ def_effective_visibilities : Default :: default ( ) ,
4662 import_effective_visibilities : Default :: default ( ) ,
4763 changed : false ,
4864 } ;
@@ -54,6 +70,7 @@ impl<'r, 'a> EffectiveVisibilitiesVisitor<'r, 'a> {
5470 visitor. changed = false ;
5571 visit:: walk_crate ( & mut visitor, krate) ;
5672 }
73+ visitor. r . effective_visibilities = visitor. def_effective_visibilities ;
5774
5875 // Update visibilities for import def ids. These are not used during the
5976 // `EffectiveVisibilitiesVisitor` pass, because we have more detailed binding-based
@@ -90,10 +107,6 @@ impl<'r, 'a> EffectiveVisibilitiesVisitor<'r, 'a> {
90107 info ! ( "resolve::effective_visibilities: {:#?}" , r. effective_visibilities) ;
91108 }
92109
93- fn nearest_normal_mod ( & mut self , def_id : LocalDefId ) -> LocalDefId {
94- self . r . get_nearest_non_block_module ( def_id. to_def_id ( ) ) . nearest_parent_mod ( ) . expect_local ( )
95- }
96-
97110 /// Update effective visibilities of bindings in the given module,
98111 /// including their whole reexport chains.
99112 fn set_bindings_effective_visibilities ( & mut self , module_id : LocalDefId ) {
@@ -124,7 +137,7 @@ impl<'r, 'a> EffectiveVisibilitiesVisitor<'r, 'a> {
124137
125138 fn effective_vis ( & self , parent_id : ParentId < ' a > ) -> Option < EffectiveVisibility > {
126139 match parent_id {
127- ParentId :: Def ( def_id) => self . r . effective_visibilities . effective_vis ( def_id) ,
140+ ParentId :: Def ( def_id) => self . def_effective_visibilities . effective_vis ( def_id) ,
128141 ParentId :: Import ( binding) => self . import_effective_visibilities . effective_vis ( binding) ,
129142 }
130143 . copied ( )
@@ -150,7 +163,7 @@ impl<'r, 'a> EffectiveVisibilitiesVisitor<'r, 'a> {
150163 let default_vis = Visibility :: Restricted (
151164 import
152165 . id ( )
153- . map ( |id| self . nearest_normal_mod ( self . r . local_def_id ( id) ) )
166+ . map ( |id| self . r . nearest_normal_mod ( self . r . local_def_id ( id) ) )
154167 . unwrap_or ( CRATE_DEF_ID ) ,
155168 ) ;
156169 if self . is_noop_update ( parent_id, nominal_vis, default_vis) {
@@ -159,25 +172,25 @@ impl<'r, 'a> EffectiveVisibilitiesVisitor<'r, 'a> {
159172 self . changed |= self . import_effective_visibilities . update (
160173 binding,
161174 nominal_vis,
162- default_vis,
175+ |r| ( default_vis, r ) ,
163176 self . effective_vis ( parent_id) ,
164177 parent_id. level ( ) ,
165- ResolverTree ( & self . r . definitions , & self . r . crate_loader ) ,
178+ & mut * self . r ,
166179 ) ;
167180 }
168181
169182 fn update_def ( & mut self , def_id : LocalDefId , nominal_vis : Visibility , parent_id : ParentId < ' a > ) {
170- let default_vis = Visibility :: Restricted ( self . nearest_normal_mod ( def_id) ) ;
183+ let default_vis = Visibility :: Restricted ( self . r . nearest_normal_mod ( def_id) ) ;
171184 if self . is_noop_update ( parent_id, nominal_vis, default_vis) {
172185 return ;
173186 }
174- self . changed |= self . r . effective_visibilities . update (
187+ self . changed |= self . def_effective_visibilities . update (
175188 def_id,
176189 nominal_vis,
177- if def_id == CRATE_DEF_ID { Visibility :: Public } else { default_vis } ,
190+ |r| ( if def_id == CRATE_DEF_ID { Visibility :: Public } else { default_vis } , r ) ,
178191 self . effective_vis ( parent_id) ,
179192 parent_id. level ( ) ,
180- ResolverTree ( & self . r . definitions , & self . r . crate_loader ) ,
193+ & mut * self . r ,
181194 ) ;
182195 }
183196
0 commit comments