@@ -12,7 +12,6 @@ use rustc_hir::def_id::LocalDefId;
1212use rustc_hir:: def_id:: CRATE_DEF_ID ;
1313use rustc_middle:: middle:: privacy:: AccessLevel ;
1414use rustc_middle:: ty:: { DefIdTree , Visibility } ;
15- use rustc_span:: sym;
1615
1716pub struct AccessLevelsVisitor < ' r , ' a > {
1817 r : & ' r mut Resolver < ' a > ,
@@ -156,16 +155,15 @@ impl<'r, 'ast> Visitor<'ast> for AccessLevelsVisitor<'ast, 'r> {
156155
157156 // Foreign modules inherit level from parents.
158157 ast:: ItemKind :: ForeignMod ( ..) => {
159- let parent_level =
160- self . r . access_levels . get_access_level ( self . r . local_parent ( def_id) ) ;
161- self . set_access_level ( item. id , parent_level) ;
158+ let parent_id = self . r . local_parent ( def_id) ;
159+ self . update_effective_vis ( def_id, Visibility :: Public , parent_id, AccessLevel :: Public ) ;
162160 }
163161
164162 // Only exported `macro_rules!` items are public, but they always are
165163 ast:: ItemKind :: MacroDef ( ref macro_def) if macro_def. macro_rules => {
166- if item . attrs . iter ( ) . any ( |attr| attr . has_name ( sym :: macro_export ) ) {
167- self . set_access_level ( item . id , Some ( AccessLevel :: Public ) ) ;
168- }
164+ let parent_id = self . r . local_parent ( def_id ) ;
165+ let vis = self . r . visibilities . get ( & def_id ) . unwrap ( ) . clone ( ) ;
166+ self . update_effective_vis ( def_id , vis , parent_id , AccessLevel :: Public ) ;
169167 }
170168
171169 ast:: ItemKind :: Mod ( ..) => {
@@ -177,19 +175,24 @@ impl<'r, 'ast> Visitor<'ast> for AccessLevelsVisitor<'ast, 'r> {
177175 self . set_bindings_access_level ( def_id) ;
178176 for variant in variants {
179177 let variant_def_id = self . r . local_def_id ( variant. id ) ;
180- let variant_level = self . r . access_levels . get_access_level ( variant_def_id) ;
181178 for field in variant. data . fields ( ) {
182- self . set_access_level ( field. id , variant_level) ;
179+ let field_def_id = self . r . local_def_id ( field. id ) ;
180+ let vis = self . r . visibilities . get ( & field_def_id) . unwrap ( ) . clone ( ) ;
181+ self . update_effective_vis (
182+ field_def_id,
183+ vis,
184+ variant_def_id,
185+ AccessLevel :: Public ,
186+ ) ;
183187 }
184188 }
185189 }
186190
187191 ast:: ItemKind :: Struct ( ref def, _) | ast:: ItemKind :: Union ( ref def, _) => {
188- let inherited_level = self . r . access_levels . get_access_level ( def_id) ;
189192 for field in def. fields ( ) {
190- if field . vis . kind . is_pub ( ) {
191- self . set_access_level ( field . id , inherited_level ) ;
192- }
193+ let field_def_id = self . r . local_def_id ( field . id ) ;
194+ let vis = self . r . visibilities . get ( & field_def_id ) . unwrap ( ) ;
195+ self . update_effective_vis ( field_def_id , * vis , def_id , AccessLevel :: Public ) ;
193196 }
194197 }
195198
0 commit comments