Skip to content

Commit 76e2349

Browse files
committed
Rollup merge of rust-lang#32674 - jseyfried:1422_groundwork, r=nikomatsakis
Lay groundwork for RFC 1422 and improve `PrivateItemsInPublicInterfacesVisitor` This PR lays groundwork for RFC 1422 (cc rust-lang#32409) and improves `PrivateItemsInPublicInterfacesVisitor`. More specifically, it - Refactors away `hir::Visibility::inherit_from`, the semantics of which are obsolete. - Makes `hir::Visibility` non-`Copy` so that we will be able to add new variants to represent `pub(restricted)` (for example, `Visibility::Restricted(Path)`). - Adds a new `Copy` type `ty::Visibility` that represents a visibility value, i.e. a characterization of where an item is accessible. This is able to represent `pub(restricted)` visibilities. - Improves `PrivateItemsInPublicInterfacesVisitor` so that it checks for items in an interface that are less visible than the interface. This fixes rust-lang#30079 but doesn't change any other behavior. r? @nikomatsakis
2 parents 444a118 + dcd4621 commit 76e2349

File tree

22 files changed

+385
-298
lines changed

22 files changed

+385
-298
lines changed

src/librustc/hir/intravisit.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ use std::u32;
3737
#[derive(Copy, Clone, PartialEq, Eq)]
3838
pub enum FnKind<'a> {
3939
/// fn foo() or extern "Abi" fn foo()
40-
ItemFn(Name, &'a Generics, Unsafety, Constness, Abi, Visibility, &'a [Attribute]),
40+
ItemFn(Name, &'a Generics, Unsafety, Constness, Abi, &'a Visibility, &'a [Attribute]),
4141

4242
/// fn foo(&self)
43-
Method(Name, &'a MethodSig, Option<Visibility>, &'a [Attribute]),
43+
Method(Name, &'a MethodSig, Option<&'a Visibility>, &'a [Attribute]),
4444

4545
/// |x, y| {}
4646
Closure(&'a [Attribute]),
@@ -324,7 +324,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item) {
324324
unsafety,
325325
constness,
326326
abi,
327-
item.vis,
327+
&item.vis,
328328
&item.attrs),
329329
declaration,
330330
body,
@@ -672,7 +672,7 @@ pub fn walk_impl_item<'v, V: Visitor<'v>>(visitor: &mut V, impl_item: &'v ImplIt
672672
ImplItemKind::Method(ref sig, ref body) => {
673673
visitor.visit_fn(FnKind::Method(impl_item.name,
674674
sig,
675-
Some(impl_item.vis),
675+
Some(&impl_item.vis),
676676
&impl_item.attrs),
677677
&sig.decl,
678678
body,

src/librustc/hir/map/blocks.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ struct ItemFnParts<'a> {
113113
unsafety: ast::Unsafety,
114114
constness: ast::Constness,
115115
abi: abi::Abi,
116-
vis: ast::Visibility,
116+
vis: &'a ast::Visibility,
117117
generics: &'a ast::Generics,
118118
body: &'a Block,
119119
id: NodeId,
@@ -208,7 +208,7 @@ impl<'a> FnLikeNode<'a> {
208208
M: FnOnce(NodeId,
209209
Name,
210210
&'a ast::MethodSig,
211-
Option<ast::Visibility>,
211+
Option<&'a ast::Visibility>,
212212
&'a ast::Block,
213213
Span,
214214
&'a [Attribute])
@@ -226,7 +226,7 @@ impl<'a> FnLikeNode<'a> {
226226
body: &block,
227227
generics: generics,
228228
abi: abi,
229-
vis: i.vis,
229+
vis: &i.vis,
230230
constness: constness,
231231
span: i.span,
232232
attrs: &i.attrs,
@@ -242,7 +242,7 @@ impl<'a> FnLikeNode<'a> {
242242
map::NodeImplItem(ii) => {
243243
match ii.node {
244244
ast::ImplItemKind::Method(ref sig, ref body) => {
245-
method(ii.id, ii.name, sig, Some(ii.vis), body, ii.span, &ii.attrs)
245+
method(ii.id, ii.name, sig, Some(&ii.vis), body, ii.span, &ii.attrs)
246246
}
247247
_ => {
248248
bug!("impl method FnLikeNode that is not fn-like")

src/librustc/hir/map/mod.rs

+1-13
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ impl<'ast> Map<'ast> {
430430

431431
/// Returns the NodeId of `id`'s nearest module parent, or `id` itself if no
432432
/// module parent is in this map.
433-
fn get_module_parent(&self, id: NodeId) -> NodeId {
433+
pub fn get_module_parent(&self, id: NodeId) -> NodeId {
434434
match self.walk_parent_nodes(id, |node| match *node {
435435
NodeItem(&Item { node: Item_::ItemMod(_), .. }) => true,
436436
_ => false,
@@ -440,18 +440,6 @@ impl<'ast> Map<'ast> {
440440
}
441441
}
442442

443-
pub fn private_item_is_visible_from(&self, item: NodeId, block: NodeId) -> bool {
444-
// A private item is visible from everything in its nearest module parent.
445-
let visibility = self.get_module_parent(item);
446-
let mut block_ancestor = self.get_module_parent(block);
447-
loop {
448-
if block_ancestor == visibility { return true }
449-
let block_ancestor_parent = self.get_module_parent(block_ancestor);
450-
if block_ancestor_parent == block_ancestor { return false }
451-
block_ancestor = block_ancestor_parent;
452-
}
453-
}
454-
455443
/// Returns the nearest enclosing scope. A scope is an item or block.
456444
/// FIXME it is not clear to me that all items qualify as scopes - statics
457445
/// and associated types probably shouldn't, for example. Behaviour in this

src/librustc/hir/mod.rs

+1-10
Original file line numberDiff line numberDiff line change
@@ -1431,21 +1431,12 @@ pub struct PolyTraitRef {
14311431
pub span: Span,
14321432
}
14331433

1434-
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)]
1434+
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
14351435
pub enum Visibility {
14361436
Public,
14371437
Inherited,
14381438
}
14391439

1440-
impl Visibility {
1441-
pub fn inherit_from(&self, parent_visibility: Visibility) -> Visibility {
1442-
match self {
1443-
&Inherited => parent_visibility,
1444-
&Public => *self,
1445-
}
1446-
}
1447-
}
1448-
14491440
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Debug)]
14501441
pub struct StructField {
14511442
pub span: Span,

src/librustc/hir/print.rs

+31-31
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ pub fn fun_to_string(decl: &hir::FnDecl,
294294
Some(name),
295295
generics,
296296
opt_explicit_self,
297-
hir::Inherited)?;
297+
&hir::Inherited)?;
298298
s.end()?; // Close the head box
299299
s.end() // Close the outer box
300300
})
@@ -322,8 +322,8 @@ pub fn arg_to_string(arg: &hir::Arg) -> String {
322322
to_string(|s| s.print_arg(arg, false))
323323
}
324324

325-
pub fn visibility_qualified(vis: hir::Visibility, s: &str) -> String {
326-
match vis {
325+
pub fn visibility_qualified(vis: &hir::Visibility, s: &str) -> String {
326+
match *vis {
327327
hir::Public => format!("pub {}", s),
328328
hir::Inherited => s.to_string(),
329329
}
@@ -573,13 +573,13 @@ impl<'a> State<'a> {
573573
Some(item.name),
574574
generics,
575575
None,
576-
item.vis)?;
576+
&item.vis)?;
577577
self.end()?; // end head-ibox
578578
word(&mut self.s, ";")?;
579579
self.end() // end the outer fn box
580580
}
581581
hir::ForeignItemStatic(ref t, m) => {
582-
self.head(&visibility_qualified(item.vis, "static"))?;
582+
self.head(&visibility_qualified(&item.vis, "static"))?;
583583
if m {
584584
self.word_space("mut")?;
585585
}
@@ -597,7 +597,7 @@ impl<'a> State<'a> {
597597
name: ast::Name,
598598
ty: &hir::Ty,
599599
default: Option<&hir::Expr>,
600-
vis: hir::Visibility)
600+
vis: &hir::Visibility)
601601
-> io::Result<()> {
602602
word(&mut self.s, &visibility_qualified(vis, ""))?;
603603
self.word_space("const")?;
@@ -648,7 +648,7 @@ impl<'a> State<'a> {
648648
self.ann.pre(self, NodeItem(item))?;
649649
match item.node {
650650
hir::ItemExternCrate(ref optional_path) => {
651-
self.head(&visibility_qualified(item.vis, "extern crate"))?;
651+
self.head(&visibility_qualified(&item.vis, "extern crate"))?;
652652
if let Some(p) = *optional_path {
653653
let val = p.as_str();
654654
if val.contains("-") {
@@ -666,14 +666,14 @@ impl<'a> State<'a> {
666666
self.end()?; // end outer head-block
667667
}
668668
hir::ItemUse(ref vp) => {
669-
self.head(&visibility_qualified(item.vis, "use"))?;
669+
self.head(&visibility_qualified(&item.vis, "use"))?;
670670
self.print_view_path(&vp)?;
671671
word(&mut self.s, ";")?;
672672
self.end()?; // end inner head-block
673673
self.end()?; // end outer head-block
674674
}
675675
hir::ItemStatic(ref ty, m, ref expr) => {
676-
self.head(&visibility_qualified(item.vis, "static"))?;
676+
self.head(&visibility_qualified(&item.vis, "static"))?;
677677
if m == hir::MutMutable {
678678
self.word_space("mut")?;
679679
}
@@ -689,7 +689,7 @@ impl<'a> State<'a> {
689689
self.end()?; // end the outer cbox
690690
}
691691
hir::ItemConst(ref ty, ref expr) => {
692-
self.head(&visibility_qualified(item.vis, "const"))?;
692+
self.head(&visibility_qualified(&item.vis, "const"))?;
693693
self.print_name(item.name)?;
694694
self.word_space(":")?;
695695
self.print_type(&ty)?;
@@ -710,12 +710,12 @@ impl<'a> State<'a> {
710710
Some(item.name),
711711
typarams,
712712
None,
713-
item.vis)?;
713+
&item.vis)?;
714714
word(&mut self.s, " ")?;
715715
self.print_block_with_attrs(&body, &item.attrs)?;
716716
}
717717
hir::ItemMod(ref _mod) => {
718-
self.head(&visibility_qualified(item.vis, "mod"))?;
718+
self.head(&visibility_qualified(&item.vis, "mod"))?;
719719
self.print_name(item.name)?;
720720
self.nbsp()?;
721721
self.bopen()?;
@@ -732,7 +732,7 @@ impl<'a> State<'a> {
732732
hir::ItemTy(ref ty, ref params) => {
733733
self.ibox(indent_unit)?;
734734
self.ibox(0)?;
735-
self.word_nbsp(&visibility_qualified(item.vis, "type"))?;
735+
self.word_nbsp(&visibility_qualified(&item.vis, "type"))?;
736736
self.print_name(item.name)?;
737737
self.print_generics(params)?;
738738
self.end()?; // end the inner ibox
@@ -745,16 +745,16 @@ impl<'a> State<'a> {
745745
self.end()?; // end the outer ibox
746746
}
747747
hir::ItemEnum(ref enum_definition, ref params) => {
748-
self.print_enum_def(enum_definition, params, item.name, item.span, item.vis)?;
748+
self.print_enum_def(enum_definition, params, item.name, item.span, &item.vis)?;
749749
}
750750
hir::ItemStruct(ref struct_def, ref generics) => {
751-
self.head(&visibility_qualified(item.vis, "struct"))?;
751+
self.head(&visibility_qualified(&item.vis, "struct"))?;
752752
self.print_struct(struct_def, generics, item.name, item.span, true)?;
753753
}
754754

755755
hir::ItemDefaultImpl(unsafety, ref trait_ref) => {
756756
self.head("")?;
757-
self.print_visibility(item.vis)?;
757+
self.print_visibility(&item.vis)?;
758758
self.print_unsafety(unsafety)?;
759759
self.word_nbsp("impl")?;
760760
self.print_trait_ref(trait_ref)?;
@@ -771,7 +771,7 @@ impl<'a> State<'a> {
771771
ref ty,
772772
ref impl_items) => {
773773
self.head("")?;
774-
self.print_visibility(item.vis)?;
774+
self.print_visibility(&item.vis)?;
775775
self.print_unsafety(unsafety)?;
776776
self.word_nbsp("impl")?;
777777

@@ -809,7 +809,7 @@ impl<'a> State<'a> {
809809
}
810810
hir::ItemTrait(unsafety, ref generics, ref bounds, ref trait_items) => {
811811
self.head("")?;
812-
self.print_visibility(item.vis)?;
812+
self.print_visibility(&item.vis)?;
813813
self.print_unsafety(unsafety)?;
814814
self.word_nbsp("trait")?;
815815
self.print_name(item.name)?;
@@ -867,7 +867,7 @@ impl<'a> State<'a> {
867867
generics: &hir::Generics,
868868
name: ast::Name,
869869
span: codemap::Span,
870-
visibility: hir::Visibility)
870+
visibility: &hir::Visibility)
871871
-> io::Result<()> {
872872
self.head(&visibility_qualified(visibility, "enum"))?;
873873
self.print_name(name)?;
@@ -895,8 +895,8 @@ impl<'a> State<'a> {
895895
self.bclose(span)
896896
}
897897

898-
pub fn print_visibility(&mut self, vis: hir::Visibility) -> io::Result<()> {
899-
match vis {
898+
pub fn print_visibility(&mut self, vis: &hir::Visibility) -> io::Result<()> {
899+
match *vis {
900900
hir::Public => self.word_nbsp("pub"),
901901
hir::Inherited => Ok(()),
902902
}
@@ -915,7 +915,7 @@ impl<'a> State<'a> {
915915
if struct_def.is_tuple() {
916916
self.popen()?;
917917
self.commasep(Inconsistent, struct_def.fields(), |s, field| {
918-
s.print_visibility(field.vis)?;
918+
s.print_visibility(&field.vis)?;
919919
s.maybe_print_comment(field.span.lo)?;
920920
s.print_type(&field.ty)
921921
})?;
@@ -937,7 +937,7 @@ impl<'a> State<'a> {
937937
self.hardbreak_if_not_bol()?;
938938
self.maybe_print_comment(field.span.lo)?;
939939
self.print_outer_attributes(&field.attrs)?;
940-
self.print_visibility(field.vis)?;
940+
self.print_visibility(&field.vis)?;
941941
self.print_name(field.name)?;
942942
self.word_nbsp(":")?;
943943
self.print_type(&field.ty)?;
@@ -964,7 +964,7 @@ impl<'a> State<'a> {
964964
pub fn print_method_sig(&mut self,
965965
name: ast::Name,
966966
m: &hir::MethodSig,
967-
vis: hir::Visibility)
967+
vis: &hir::Visibility)
968968
-> io::Result<()> {
969969
self.print_fn(&m.decl,
970970
m.unsafety,
@@ -986,13 +986,13 @@ impl<'a> State<'a> {
986986
self.print_associated_const(ti.name,
987987
&ty,
988988
default.as_ref().map(|expr| &**expr),
989-
hir::Inherited)?;
989+
&hir::Inherited)?;
990990
}
991991
hir::MethodTraitItem(ref sig, ref body) => {
992992
if body.is_some() {
993993
self.head("")?;
994994
}
995-
self.print_method_sig(ti.name, sig, hir::Inherited)?;
995+
self.print_method_sig(ti.name, sig, &hir::Inherited)?;
996996
if let Some(ref body) = *body {
997997
self.nbsp()?;
998998
self.print_block_with_attrs(body, &ti.attrs)?;
@@ -1021,11 +1021,11 @@ impl<'a> State<'a> {
10211021

10221022
match ii.node {
10231023
hir::ImplItemKind::Const(ref ty, ref expr) => {
1024-
self.print_associated_const(ii.name, &ty, Some(&expr), ii.vis)?;
1024+
self.print_associated_const(ii.name, &ty, Some(&expr), &ii.vis)?;
10251025
}
10261026
hir::ImplItemKind::Method(ref sig, ref body) => {
10271027
self.head("")?;
1028-
self.print_method_sig(ii.name, sig, ii.vis)?;
1028+
self.print_method_sig(ii.name, sig, &ii.vis)?;
10291029
self.nbsp()?;
10301030
self.print_block_with_attrs(body, &ii.attrs)?;
10311031
}
@@ -1910,7 +1910,7 @@ impl<'a> State<'a> {
19101910
name: Option<ast::Name>,
19111911
generics: &hir::Generics,
19121912
opt_explicit_self: Option<&hir::ExplicitSelf_>,
1913-
vis: hir::Visibility)
1913+
vis: &hir::Visibility)
19141914
-> io::Result<()> {
19151915
self.print_fn_header_info(unsafety, constness, abi, vis)?;
19161916

@@ -2267,7 +2267,7 @@ impl<'a> State<'a> {
22672267
name,
22682268
&generics,
22692269
opt_explicit_self,
2270-
hir::Inherited)?;
2270+
&hir::Inherited)?;
22712271
self.end()
22722272
}
22732273

@@ -2347,7 +2347,7 @@ impl<'a> State<'a> {
23472347
unsafety: hir::Unsafety,
23482348
constness: hir::Constness,
23492349
abi: Abi,
2350-
vis: hir::Visibility)
2350+
vis: &hir::Visibility)
23512351
-> io::Result<()> {
23522352
word(&mut self.s, &visibility_qualified(vis, ""))?;
23532353
self.print_unsafety(unsafety)?;

src/librustc/middle/cstore.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ pub const LOCAL_CRATE: ast::CrateNum = 0;
116116
pub struct ChildItem {
117117
pub def: DefLike,
118118
pub name: ast::Name,
119-
pub vis: hir::Visibility
119+
pub vis: ty::Visibility,
120120
}
121121

122122
pub enum FoundAst<'ast> {
@@ -157,7 +157,7 @@ pub trait CrateStore<'tcx> : Any {
157157
// item info
158158
fn stability(&self, def: DefId) -> Option<attr::Stability>;
159159
fn deprecation(&self, def: DefId) -> Option<attr::Deprecation>;
160-
fn visibility(&self, def: DefId) -> hir::Visibility;
160+
fn visibility(&self, def: DefId) -> ty::Visibility;
161161
fn closure_kind(&self, tcx: &TyCtxt<'tcx>, def_id: DefId)
162162
-> ty::ClosureKind;
163163
fn closure_ty(&self, tcx: &TyCtxt<'tcx>, def_id: DefId)
@@ -334,7 +334,7 @@ impl<'tcx> CrateStore<'tcx> for DummyCrateStore {
334334
// item info
335335
fn stability(&self, def: DefId) -> Option<attr::Stability> { bug!("stability") }
336336
fn deprecation(&self, def: DefId) -> Option<attr::Deprecation> { bug!("deprecation") }
337-
fn visibility(&self, def: DefId) -> hir::Visibility { bug!("visibility") }
337+
fn visibility(&self, def: DefId) -> ty::Visibility { bug!("visibility") }
338338
fn closure_kind(&self, tcx: &TyCtxt<'tcx>, def_id: DefId)
339339
-> ty::ClosureKind { bug!("closure_kind") }
340340
fn closure_ty(&self, tcx: &TyCtxt<'tcx>, def_id: DefId)

0 commit comments

Comments
 (0)