@@ -12,7 +12,6 @@ use rustc_hir::def_id::LocalDefId;
12
12
use rustc_hir:: def_id:: CRATE_DEF_ID ;
13
13
use rustc_middle:: middle:: privacy:: AccessLevel ;
14
14
use rustc_middle:: ty:: { DefIdTree , Visibility } ;
15
- use rustc_span:: sym;
16
15
17
16
pub struct AccessLevelsVisitor < ' r , ' a > {
18
17
r : & ' r mut Resolver < ' a > ,
@@ -156,16 +155,15 @@ impl<'r, 'ast> Visitor<'ast> for AccessLevelsVisitor<'ast, 'r> {
156
155
157
156
// Foreign modules inherit level from parents.
158
157
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 ) ;
162
160
}
163
161
164
162
// Only exported `macro_rules!` items are public, but they always are
165
163
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 ) ;
169
167
}
170
168
171
169
ast:: ItemKind :: Mod ( ..) => {
@@ -177,19 +175,24 @@ impl<'r, 'ast> Visitor<'ast> for AccessLevelsVisitor<'ast, 'r> {
177
175
self . set_bindings_access_level ( def_id) ;
178
176
for variant in variants {
179
177
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) ;
181
178
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
+ ) ;
183
187
}
184
188
}
185
189
}
186
190
187
191
ast:: ItemKind :: Struct ( ref def, _) | ast:: ItemKind :: Union ( ref def, _) => {
188
- let inherited_level = self . r . access_levels . get_access_level ( def_id) ;
189
192
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 ) ;
193
196
}
194
197
}
195
198
0 commit comments