@@ -53,10 +53,10 @@ impl<'a> ToNameBinding<'a> for (Module<'a>, Span) {
53
53
}
54
54
}
55
55
56
- impl < ' a > ToNameBinding < ' a > for ( Def , Span , DefModifiers ) {
56
+ impl < ' a > ToNameBinding < ' a > for ( Def , Span , DefModifiers , ty :: Visibility ) {
57
57
fn to_name_binding ( self ) -> NameBinding < ' a > {
58
58
let kind = NameBindingKind :: Def ( self . 0 ) ;
59
- NameBinding { modifiers : self . 2 , kind : kind, span : Some ( self . 1 ) }
59
+ NameBinding { modifiers : self . 2 , kind : kind, span : Some ( self . 1 ) , vis : self . 3 }
60
60
}
61
61
}
62
62
@@ -105,12 +105,9 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
105
105
let parent = * parent_ref;
106
106
let name = item. name ;
107
107
let sp = item. span ;
108
- let is_public = item. vis == hir:: Public ;
109
- let modifiers = if is_public {
110
- DefModifiers :: PUBLIC
111
- } else {
112
- DefModifiers :: empty ( )
113
- } | DefModifiers :: IMPORTABLE ;
108
+ let modifiers = DefModifiers :: IMPORTABLE ;
109
+ self . current_module = parent;
110
+ let vis = self . resolve_visibility ( & item. vis ) ;
114
111
115
112
match item. node {
116
113
ItemUse ( ref view_path) => {
@@ -172,7 +169,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
172
169
subclass,
173
170
view_path. span ,
174
171
item. id ,
175
- is_public ,
172
+ vis ,
176
173
is_prelude) ;
177
174
}
178
175
ViewPathList ( _, ref source_items) => {
@@ -223,7 +220,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
223
220
subclass,
224
221
source_item. span ,
225
222
source_item. node . id ( ) ,
226
- is_public ,
223
+ vis ,
227
224
is_prelude) ;
228
225
}
229
226
}
@@ -233,7 +230,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
233
230
GlobImport ,
234
231
view_path. span ,
235
232
item. id ,
236
- is_public ,
233
+ vis ,
237
234
is_prelude) ;
238
235
}
239
236
}
@@ -249,7 +246,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
249
246
} ;
250
247
let parent_link = ModuleParentLink ( parent, name) ;
251
248
let def = Def :: Mod ( def_id) ;
252
- let module = self . new_extern_crate_module ( parent_link, def, is_public , item. id ) ;
249
+ let module = self . new_extern_crate_module ( parent_link, def, vis , item. id ) ;
253
250
self . define ( parent, name, TypeNS , ( module, sp) ) ;
254
251
255
252
self . build_reduced_graph_for_external_crate ( module) ;
@@ -259,7 +256,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
259
256
ItemMod ( ..) => {
260
257
let parent_link = ModuleParentLink ( parent, name) ;
261
258
let def = Def :: Mod ( self . ast_map . local_def_id ( item. id ) ) ;
262
- let module = self . new_module ( parent_link, Some ( def) , false , is_public ) ;
259
+ let module = self . new_module ( parent_link, Some ( def) , false , vis ) ;
263
260
self . define ( parent, name, TypeNS , ( module, sp) ) ;
264
261
parent. module_children . borrow_mut ( ) . insert ( item. id , module) ;
265
262
* parent_ref = module;
@@ -271,33 +268,32 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
271
268
ItemStatic ( _, m, _) => {
272
269
let mutbl = m == hir:: MutMutable ;
273
270
let def = Def :: Static ( self . ast_map . local_def_id ( item. id ) , mutbl) ;
274
- self . define ( parent, name, ValueNS , ( def, sp, modifiers) ) ;
271
+ self . define ( parent, name, ValueNS , ( def, sp, modifiers, vis ) ) ;
275
272
}
276
273
ItemConst ( _, _) => {
277
274
let def = Def :: Const ( self . ast_map . local_def_id ( item. id ) ) ;
278
- self . define ( parent, name, ValueNS , ( def, sp, modifiers) ) ;
275
+ self . define ( parent, name, ValueNS , ( def, sp, modifiers, vis ) ) ;
279
276
}
280
277
ItemFn ( _, _, _, _, _, _) => {
281
278
let def = Def :: Fn ( self . ast_map . local_def_id ( item. id ) ) ;
282
- self . define ( parent, name, ValueNS , ( def, sp, modifiers) ) ;
279
+ self . define ( parent, name, ValueNS , ( def, sp, modifiers, vis ) ) ;
283
280
}
284
281
285
282
// These items live in the type namespace.
286
283
ItemTy ( ..) => {
287
284
let def = Def :: TyAlias ( self . ast_map . local_def_id ( item. id ) ) ;
288
- self . define ( parent, name, TypeNS , ( def, sp, modifiers) ) ;
285
+ self . define ( parent, name, TypeNS , ( def, sp, modifiers, vis ) ) ;
289
286
}
290
287
291
288
ItemEnum ( ref enum_definition, _) => {
292
289
let parent_link = ModuleParentLink ( parent, name) ;
293
290
let def = Def :: Enum ( self . ast_map . local_def_id ( item. id ) ) ;
294
- let module = self . new_module ( parent_link, Some ( def) , false , is_public ) ;
291
+ let module = self . new_module ( parent_link, Some ( def) , false , vis ) ;
295
292
self . define ( parent, name, TypeNS , ( module, sp) ) ;
296
293
297
- let variant_modifiers = if is_public {
298
- DefModifiers :: empty ( )
299
- } else {
300
- DefModifiers :: PRIVATE_VARIANT
294
+ let variant_modifiers = match vis {
295
+ ty:: Visibility :: Public => DefModifiers :: empty ( ) ,
296
+ _ => DefModifiers :: PRIVATE_VARIANT ,
301
297
} ;
302
298
for variant in & ( * enum_definition) . variants {
303
299
let item_def_id = self . ast_map . local_def_id ( item. id ) ;
@@ -310,20 +306,20 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
310
306
ItemStruct ( ref struct_def, _) => {
311
307
// Define a name in the type namespace.
312
308
let def = Def :: Struct ( self . ast_map . local_def_id ( item. id ) ) ;
313
- self . define ( parent, name, TypeNS , ( def, sp, modifiers) ) ;
309
+ self . define ( parent, name, TypeNS , ( def, sp, modifiers, vis ) ) ;
314
310
315
311
// If this is a newtype or unit-like struct, define a name
316
312
// in the value namespace as well
317
313
if !struct_def. is_struct ( ) {
318
314
let def = Def :: Struct ( self . ast_map . local_def_id ( struct_def. id ( ) ) ) ;
319
- self . define ( parent, name, ValueNS , ( def, sp, modifiers) ) ;
315
+ self . define ( parent, name, ValueNS , ( def, sp, modifiers, vis ) ) ;
320
316
}
321
317
322
318
// Record the def ID and fields of this struct.
323
- let field_names = struct_def. fields ( )
324
- . iter ( )
325
- . map ( |f| f . name )
326
- . collect ( ) ;
319
+ let field_names = struct_def. fields ( ) . iter ( ) . map ( |field| {
320
+ self . resolve_visibility ( & field . vis ) ;
321
+ field . name
322
+ } ) . collect ( ) ;
327
323
let item_def_id = self . ast_map . local_def_id ( item. id ) ;
328
324
self . structs . insert ( item_def_id, field_names) ;
329
325
}
@@ -336,7 +332,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
336
332
// Add all the items within to a new module.
337
333
let parent_link = ModuleParentLink ( parent, name) ;
338
334
let def = Def :: Trait ( def_id) ;
339
- let module_parent = self . new_module ( parent_link, Some ( def) , false , is_public ) ;
335
+ let module_parent = self . new_module ( parent_link, Some ( def) , false , vis ) ;
340
336
self . define ( parent, name, TypeNS , ( module_parent, sp) ) ;
341
337
342
338
// Add the names of all the items to the trait info.
@@ -348,8 +344,8 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
348
344
hir:: TypeTraitItem ( ..) => ( Def :: AssociatedTy ( def_id, item_def_id) , TypeNS ) ,
349
345
} ;
350
346
351
- let modifiers = DefModifiers :: PUBLIC ; // NB: not DefModifiers::IMPORTABLE
352
- self . define ( module_parent, item. name , ns, ( def, item. span , modifiers) ) ;
347
+ let modifiers = DefModifiers :: empty ( ) ; // NB: not DefModifiers::IMPORTABLE
348
+ self . define ( module_parent, item. name , ns, ( def, item. span , modifiers, vis ) ) ;
353
349
354
350
self . trait_item_map . insert ( ( item. name , def_id) , item_def_id) ;
355
351
}
@@ -373,24 +369,20 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
373
369
374
370
// Variants are always treated as importable to allow them to be glob used.
375
371
// All variants are defined in both type and value namespaces as future-proofing.
376
- let modifiers = DefModifiers :: PUBLIC | DefModifiers :: IMPORTABLE | variant_modifiers;
372
+ let modifiers = DefModifiers :: IMPORTABLE | variant_modifiers;
377
373
let def = Def :: Variant ( item_id, self . ast_map . local_def_id ( variant. node . data . id ( ) ) ) ;
374
+ let vis = ty:: Visibility :: Public ;
378
375
379
- self . define ( parent, name, ValueNS , ( def, variant. span , modifiers) ) ;
380
- self . define ( parent, name, TypeNS , ( def, variant. span , modifiers) ) ;
376
+ self . define ( parent, name, ValueNS , ( def, variant. span , modifiers, vis ) ) ;
377
+ self . define ( parent, name, TypeNS , ( def, variant. span , modifiers, vis ) ) ;
381
378
}
382
379
383
380
/// Constructs the reduced graph for one foreign item.
384
381
fn build_reduced_graph_for_foreign_item ( & mut self ,
385
382
foreign_item : & ForeignItem ,
386
383
parent : Module < ' b > ) {
387
384
let name = foreign_item. name ;
388
- let is_public = foreign_item. vis == hir:: Public ;
389
- let modifiers = if is_public {
390
- DefModifiers :: PUBLIC
391
- } else {
392
- DefModifiers :: empty ( )
393
- } | DefModifiers :: IMPORTABLE ;
385
+ let modifiers = DefModifiers :: IMPORTABLE ;
394
386
395
387
let def = match foreign_item. node {
396
388
ForeignItemFn ( ..) => {
@@ -400,7 +392,9 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
400
392
Def :: Static ( self . ast_map . local_def_id ( foreign_item. id ) , m)
401
393
}
402
394
} ;
403
- self . define ( parent, name, ValueNS , ( def, foreign_item. span , modifiers) ) ;
395
+ self . current_module = parent;
396
+ let vis = self . resolve_visibility ( & foreign_item. vis ) ;
397
+ self . define ( parent, name, ValueNS , ( def, foreign_item. span , modifiers, vis) ) ;
404
398
}
405
399
406
400
fn build_reduced_graph_for_block ( & mut self , block : & Block , parent : & mut Module < ' b > ) {
@@ -412,7 +406,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
412
406
block_id) ;
413
407
414
408
let parent_link = BlockParentLink ( parent, block_id) ;
415
- let new_module = self . new_module ( parent_link, None , false , false ) ;
409
+ let new_module = self . new_module ( parent_link, None , false , parent . vis ) ;
416
410
parent. module_children . borrow_mut ( ) . insert ( block_id, new_module) ;
417
411
* parent = new_module;
418
412
}
@@ -434,32 +428,27 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
434
428
}
435
429
436
430
let name = xcdef. name ;
437
- let is_public = xcdef. vis == ty:: Visibility :: Public || parent. is_trait ( ) ;
438
-
439
- let mut modifiers = DefModifiers :: empty ( ) ;
440
- if is_public {
441
- modifiers = modifiers | DefModifiers :: PUBLIC ;
442
- }
443
- if parent. is_normal ( ) {
444
- modifiers = modifiers | DefModifiers :: IMPORTABLE ;
445
- }
431
+ let vis = if parent. is_trait ( ) { ty:: Visibility :: Public } else { xcdef. vis } ;
432
+ let modifiers = match parent. is_normal ( ) {
433
+ true => DefModifiers :: IMPORTABLE ,
434
+ false => DefModifiers :: empty ( ) ,
435
+ } ;
446
436
447
437
match def {
448
438
Def :: Mod ( _) | Def :: ForeignMod ( _) | Def :: Enum ( ..) => {
449
- debug ! ( "(building reduced graph for external crate) building module {} {}" ,
450
- name,
451
- is_public) ;
439
+ debug ! ( "(building reduced graph for external crate) building module {} {:?}" ,
440
+ name, vis) ;
452
441
let parent_link = ModuleParentLink ( parent, name) ;
453
- let module = self . new_module ( parent_link, Some ( def) , true , is_public ) ;
442
+ let module = self . new_module ( parent_link, Some ( def) , true , vis ) ;
454
443
self . try_define ( parent, name, TypeNS , ( module, DUMMY_SP ) ) ;
455
444
}
456
445
Def :: Variant ( _, variant_id) => {
457
446
debug ! ( "(building reduced graph for external crate) building variant {}" , name) ;
458
447
// Variants are always treated as importable to allow them to be glob used.
459
448
// All variants are defined in both type and value namespaces as future-proofing.
460
- let modifiers = DefModifiers :: PUBLIC | DefModifiers :: IMPORTABLE ;
461
- self . try_define ( parent, name, TypeNS , ( def, DUMMY_SP , modifiers) ) ;
462
- self . try_define ( parent, name, ValueNS , ( def, DUMMY_SP , modifiers) ) ;
449
+ let modifiers = DefModifiers :: IMPORTABLE ;
450
+ self . try_define ( parent, name, TypeNS , ( def, DUMMY_SP , modifiers, vis ) ) ;
451
+ self . try_define ( parent, name, ValueNS , ( def, DUMMY_SP , modifiers, vis ) ) ;
463
452
if self . session . cstore . variant_kind ( variant_id) == Some ( VariantKind :: Struct ) {
464
453
// Not adding fields for variants as they are not accessed with a self receiver
465
454
self . structs . insert ( variant_id, Vec :: new ( ) ) ;
@@ -472,7 +461,7 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
472
461
Def :: Method ( ..) => {
473
462
debug ! ( "(building reduced graph for external crate) building value (fn/static) {}" ,
474
463
name) ;
475
- self . try_define ( parent, name, ValueNS , ( def, DUMMY_SP , modifiers) ) ;
464
+ self . try_define ( parent, name, ValueNS , ( def, DUMMY_SP , modifiers, vis ) ) ;
476
465
}
477
466
Def :: Trait ( def_id) => {
478
467
debug ! ( "(building reduced graph for external crate) building type {}" , name) ;
@@ -493,21 +482,21 @@ impl<'b, 'tcx:'b> Resolver<'b, 'tcx> {
493
482
}
494
483
495
484
let parent_link = ModuleParentLink ( parent, name) ;
496
- let module = self . new_module ( parent_link, Some ( def) , true , is_public ) ;
485
+ let module = self . new_module ( parent_link, Some ( def) , true , vis ) ;
497
486
self . try_define ( parent, name, TypeNS , ( module, DUMMY_SP ) ) ;
498
487
}
499
488
Def :: TyAlias ( ..) | Def :: AssociatedTy ( ..) => {
500
489
debug ! ( "(building reduced graph for external crate) building type {}" , name) ;
501
- self . try_define ( parent, name, TypeNS , ( def, DUMMY_SP , modifiers) ) ;
490
+ self . try_define ( parent, name, TypeNS , ( def, DUMMY_SP , modifiers, vis ) ) ;
502
491
}
503
492
Def :: Struct ( def_id)
504
493
if self . session . cstore . tuple_struct_definition_if_ctor ( def_id) . is_none ( ) => {
505
494
debug ! ( "(building reduced graph for external crate) building type and value for {}" ,
506
495
name) ;
507
- self . try_define ( parent, name, TypeNS , ( def, DUMMY_SP , modifiers) ) ;
496
+ self . try_define ( parent, name, TypeNS , ( def, DUMMY_SP , modifiers, vis ) ) ;
508
497
if let Some ( ctor_def_id) = self . session . cstore . struct_ctor_def_id ( def_id) {
509
498
let def = Def :: Struct ( ctor_def_id) ;
510
- self . try_define ( parent, name, ValueNS , ( def, DUMMY_SP , modifiers) ) ;
499
+ self . try_define ( parent, name, ValueNS , ( def, DUMMY_SP , modifiers, vis ) ) ;
511
500
}
512
501
513
502
// Record the def ID and fields of this struct.
0 commit comments