@@ -258,16 +258,16 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
258
258
Ok ( ty:: Visibility :: Restricted ( DefId :: local ( CRATE_DEF_INDEX ) ) )
259
259
}
260
260
ast:: VisibilityKind :: Inherited => {
261
- if matches ! ( self . parent_scope. module. kind, ModuleKind :: Def ( DefKind :: Enum , _ , _ ) ) {
262
- // Any inherited visibility resolved directly inside an enum
263
- // (e.g. variants or fields) inherits from the visibility of the enum.
264
- let parent_enum = self . parent_scope . module . def_id ( ) . unwrap ( ) . expect_local ( ) ;
265
- Ok ( self . r . visibilities [ & parent_enum ] )
266
- } else {
267
- // If it's not in an enum, its visibility is restricted to the `mod` item
268
- // that it's defined in .
269
- Ok ( ty:: Visibility :: Restricted ( self . parent_scope . module . nearest_parent_mod ) )
270
- }
261
+ Ok ( match self . parent_scope . module . kind {
262
+ // Any inherited visibility resolved directly inside an enum or trait
263
+ // (i.e. variants, fields, and trait items ) inherits from the visibility
264
+ // of the enum or trait.
265
+ ModuleKind :: Def ( DefKind :: Enum | DefKind :: Trait , def_id , _ ) => {
266
+ self . r . visibilities [ & def_id . expect_local ( ) ]
267
+ }
268
+ // Otherwise, the visibility is restricted to the nearest parent `mod` item .
269
+ _ => ty:: Visibility :: Restricted ( self . parent_scope . module . nearest_parent_mod ) ,
270
+ } )
271
271
}
272
272
ast:: VisibilityKind :: Restricted { ref path, id, .. } => {
273
273
// For visibilities we are not ready to provide correct implementation of "uniform
@@ -1365,58 +1365,43 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
1365
1365
return ;
1366
1366
}
1367
1367
1368
+ let vis = self . resolve_visibility ( & item. vis ) ;
1368
1369
let local_def_id = self . r . local_def_id ( item. id ) ;
1369
1370
let def_id = local_def_id. to_def_id ( ) ;
1370
- let vis = match ctxt {
1371
- AssocCtxt :: Trait => {
1372
- let ( def_kind, ns) = match item. kind {
1373
- AssocItemKind :: Const ( ..) => ( DefKind :: AssocConst , ValueNS ) ,
1374
- AssocItemKind :: Fn ( box FnKind ( _, ref sig, _, _) ) => {
1375
- if sig. decl . has_self ( ) {
1376
- self . r . has_self . insert ( def_id) ;
1377
- }
1378
- ( DefKind :: AssocFn , ValueNS )
1379
- }
1380
- AssocItemKind :: TyAlias ( ..) => ( DefKind :: AssocTy , TypeNS ) ,
1381
- AssocItemKind :: MacCall ( _) => bug ! ( ) , // handled above
1382
- } ;
1383
1371
1384
- let parent = self . parent_scope . module ;
1385
- let expansion = self . parent_scope . expansion ;
1386
- let res = Res :: Def ( def_kind, def_id) ;
1387
- // Trait item visibility is inherited from its trait when not specified explicitly.
1388
- let vis = match & item. vis . kind {
1389
- ast:: VisibilityKind :: Inherited => {
1390
- self . r . visibilities [ & parent. def_id ( ) . unwrap ( ) . expect_local ( ) ]
1372
+ if !( ctxt == AssocCtxt :: Impl
1373
+ && matches ! ( item. vis. kind, ast:: VisibilityKind :: Inherited )
1374
+ && self
1375
+ . r
1376
+ . trait_impl_items
1377
+ . contains ( & ty:: DefIdTree :: parent ( & * self . r , def_id) . unwrap ( ) . expect_local ( ) ) )
1378
+ {
1379
+ // Trait impl item visibility is inherited from its trait when not specified
1380
+ // explicitly. In that case we cannot determine it here in early resolve,
1381
+ // so we leave a hole in the visibility table to be filled later.
1382
+ self . r . visibilities . insert ( local_def_id, vis) ;
1383
+ }
1384
+
1385
+ if ctxt == AssocCtxt :: Trait {
1386
+ let ( def_kind, ns) = match item. kind {
1387
+ AssocItemKind :: Const ( ..) => ( DefKind :: AssocConst , ValueNS ) ,
1388
+ AssocItemKind :: Fn ( box FnKind ( _, ref sig, _, _) ) => {
1389
+ if sig. decl . has_self ( ) {
1390
+ self . r . has_self . insert ( def_id) ;
1391
1391
}
1392
- _ => self . resolve_visibility ( & item. vis ) ,
1393
- } ;
1394
- // FIXME: For historical reasons the binding visibility is set to public,
1395
- // use actual visibility here instead, using enum variants as an example.
1396
- let vis_hack = ty:: Visibility :: Public ;
1397
- self . r . define ( parent, item. ident , ns, ( res, vis_hack, item. span , expansion) ) ;
1398
- Some ( vis)
1399
- }
1400
- AssocCtxt :: Impl => {
1401
- // Trait impl item visibility is inherited from its trait when not specified
1402
- // explicitly. In that case we cannot determine it here in early resolve,
1403
- // so we leave a hole in the visibility table to be filled later.
1404
- // Inherent impl item visibility is never inherited from other items.
1405
- if matches ! ( item. vis. kind, ast:: VisibilityKind :: Inherited )
1406
- && self
1407
- . r
1408
- . trait_impl_items
1409
- . contains ( & ty:: DefIdTree :: parent ( & * self . r , def_id) . unwrap ( ) . expect_local ( ) )
1410
- {
1411
- None
1412
- } else {
1413
- Some ( self . resolve_visibility ( & item. vis ) )
1392
+ ( DefKind :: AssocFn , ValueNS )
1414
1393
}
1415
- }
1416
- } ;
1394
+ AssocItemKind :: TyAlias ( ..) => ( DefKind :: AssocTy , TypeNS ) ,
1395
+ AssocItemKind :: MacCall ( _) => bug ! ( ) , // handled above
1396
+ } ;
1417
1397
1418
- if let Some ( vis) = vis {
1419
- self . r . visibilities . insert ( local_def_id, vis) ;
1398
+ let parent = self . parent_scope . module ;
1399
+ let expansion = self . parent_scope . expansion ;
1400
+ let res = Res :: Def ( def_kind, def_id) ;
1401
+ // FIXME: For historical reasons the binding visibility is set to public,
1402
+ // use actual visibility here instead, using enum variants as an example.
1403
+ let vis_hack = ty:: Visibility :: Public ;
1404
+ self . r . define ( parent, item. ident , ns, ( res, vis_hack, item. span , expansion) ) ;
1420
1405
}
1421
1406
1422
1407
visit:: walk_assoc_item ( self , item, ctxt) ;
@@ -1490,19 +1475,13 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> {
1490
1475
}
1491
1476
1492
1477
let parent = self . parent_scope . module ;
1493
- let vis = match variant. vis . kind {
1494
- // Variant visibility is inherited from its enum when not specified explicitly.
1495
- ast:: VisibilityKind :: Inherited => {
1496
- self . r . visibilities [ & parent. def_id ( ) . unwrap ( ) . expect_local ( ) ]
1497
- }
1498
- _ => self . resolve_visibility ( & variant. vis ) ,
1499
- } ;
1500
1478
let expn_id = self . parent_scope . expansion ;
1501
1479
let ident = variant. ident ;
1502
1480
1503
1481
// Define a name in the type namespace.
1504
1482
let def_id = self . r . local_def_id ( variant. id ) ;
1505
1483
let res = Res :: Def ( DefKind :: Variant , def_id. to_def_id ( ) ) ;
1484
+ let vis = self . resolve_visibility ( & variant. vis ) ;
1506
1485
self . r . define ( parent, ident, TypeNS , ( res, vis, variant. span , expn_id) ) ;
1507
1486
self . r . visibilities . insert ( def_id, vis) ;
1508
1487
0 commit comments