Un-feature gate struct variants

Struct variant field visibility is now inherited. Remove `pub` keywords
from declarations.

Closes #18641

[breaking-change]
This commit is contained in:
Steven Fackler 2014-11-15 17:57:54 -08:00
parent 7e43f419cb
commit 579c65da1b
65 changed files with 60 additions and 114 deletions

View File

@ -37,7 +37,6 @@ TEMPLATE = """// Copyright {year} The Rust Project Developers. See the COPYRIGHT
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
{error_deriving}

View File

@ -1399,6 +1399,9 @@ pub struct MissingDoc {
/// Stack of IDs of struct definitions.
struct_def_stack: Vec<ast::NodeId>,
/// True if inside variant definition
in_variant: bool,
/// Stack of whether #[doc(hidden)] is set
/// at each level which has lint attributes.
doc_hidden_stack: Vec<bool>,
@ -1408,6 +1411,7 @@ impl MissingDoc {
pub fn new() -> MissingDoc {
MissingDoc {
struct_def_stack: vec!(),
in_variant: false,
doc_hidden_stack: vec!(false),
}
}
@ -1522,7 +1526,7 @@ impl LintPass for MissingDoc {
fn check_struct_field(&mut self, cx: &Context, sf: &ast::StructField) {
match sf.node.kind {
ast::NamedField(_, vis) if vis == ast::Public => {
ast::NamedField(_, vis) if vis == ast::Public || self.in_variant => {
let cur_struct_def = *self.struct_def_stack.last()
.expect("empty struct_def_stack");
self.check_missing_docs_attrs(cx, Some(cur_struct_def),
@ -1536,6 +1540,13 @@ impl LintPass for MissingDoc {
fn check_variant(&mut self, cx: &Context, v: &ast::Variant, _: &ast::Generics) {
self.check_missing_docs_attrs(cx, Some(v.node.id), v.node.attrs.as_slice(),
v.span, "a variant");
assert!(!self.in_variant);
self.in_variant = true;
}
fn check_variant_post(&mut self, _: &Context, _: &ast::Variant, _: &ast::Generics) {
assert!(self.in_variant);
self.in_variant = false;
}
}

View File

@ -665,6 +665,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for Context<'a, 'tcx> {
self.with_lint_attrs(v.node.attrs.as_slice(), |cx| {
run_lints!(cx, check_variant, v, g);
visit::walk_variant(cx, v, g);
run_lints!(cx, check_variant_post, v, g);
})
}

View File

@ -149,6 +149,7 @@ pub trait LintPass {
_: &ast::StructDef, _: ast::Ident, _: &ast::Generics, _: ast::NodeId) { }
fn check_struct_field(&mut self, _: &Context, _: &ast::StructField) { }
fn check_variant(&mut self, _: &Context, _: &ast::Variant, _: &ast::Generics) { }
fn check_variant_post(&mut self, _: &Context, _: &ast::Variant, _: &ast::Generics) { }
fn check_opt_lifetime_ref(&mut self, _: &Context, _: Span, _: &Option<ast::Lifetime>) { }
fn check_lifetime_ref(&mut self, _: &Context, _: &ast::Lifetime) { }
fn check_lifetime_decl(&mut self, _: &Context, _: &ast::LifetimeDef) { }

View File

@ -1239,6 +1239,7 @@ struct VisiblePrivateTypesVisitor<'a, 'tcx: 'a> {
tcx: &'a ty::ctxt<'tcx>,
exported_items: &'a ExportedItems,
public_items: &'a PublicItems,
in_variant: bool,
}
struct CheckTypeForPrivatenessVisitor<'a, 'b: 'a, 'tcx: 'b> {
@ -1514,13 +1515,15 @@ impl<'a, 'tcx, 'v> Visitor<'v> for VisiblePrivateTypesVisitor<'a, 'tcx> {
fn visit_variant(&mut self, v: &ast::Variant, g: &ast::Generics) {
if self.exported_items.contains(&v.node.id) {
self.in_variant = true;
visit::walk_variant(self, v, g);
self.in_variant = false;
}
}
fn visit_struct_field(&mut self, s: &ast::StructField) {
match s.node.kind {
ast::NamedField(_, ast::Public) => {
ast::NamedField(_, vis) if vis == ast::Public || self.in_variant => {
visit::walk_struct_field(self, s);
}
_ => {}
@ -1598,7 +1601,8 @@ pub fn check_crate(tcx: &ty::ctxt,
let mut visitor = VisiblePrivateTypesVisitor {
tcx: tcx,
exported_items: &exported_items,
public_items: &public_items
public_items: &public_items,
in_variant: false,
};
visit::walk_crate(&mut visitor, krate);
}

View File

@ -102,10 +102,10 @@ pub enum LastPrivate {
// and whether the import is in fact used for each.
// If the Option<PrivateDep> fields are None, it means there is no definition
// in that namespace.
LastImport{pub value_priv: Option<PrivateDep>,
pub value_used: ImportUse,
pub type_priv: Option<PrivateDep>,
pub type_used: ImportUse},
LastImport{value_priv: Option<PrivateDep>,
value_used: ImportUse,
type_priv: Option<PrivateDep>,
type_used: ImportUse},
}
#[deriving(Show)]

View File

@ -101,9 +101,9 @@ pub enum Repr {
* otherwise it indicates the other case.
*/
RawNullablePointer {
pub nndiscr: Disr,
pub nnty: ty::t,
pub nullfields: Vec<ty::t>
nndiscr: Disr,
nnty: ty::t,
nullfields: Vec<ty::t>
},
/**
* Two cases distinguished by a nullable pointer: the case with discriminant
@ -117,10 +117,10 @@ pub enum Repr {
* identity function.
*/
StructWrappedNullablePointer {
pub nonnull: Struct,
pub nndiscr: Disr,
pub ptrfield: PointerField,
pub nullfields: Vec<ty::t>,
nonnull: Struct,
nndiscr: Disr,
ptrfield: PointerField,
nullfields: Vec<ty::t>,
}
}

View File

@ -1085,9 +1085,9 @@ impl Clean<Item> for ty::ImplOrTraitItem {
pub enum Type {
/// structs/enums/traits (anything that'd be an ast::TyPath)
ResolvedPath {
pub path: Path,
pub typarams: Option<Vec<TyParamBound>>,
pub did: ast::DefId,
path: Path,
typarams: Option<Vec<TyParamBound>>,
did: ast::DefId,
},
// I have no idea how to usefully use this.
TyParamBinder(ast::NodeId),
@ -1110,9 +1110,9 @@ pub enum Type {
Unique(Box<Type>),
RawPointer(Mutability, Box<Type>),
BorrowedRef {
pub lifetime: Option<Lifetime>,
pub mutability: Mutability,
pub type_: Box<Type>,
lifetime: Option<Lifetime>,
mutability: Mutability,
type_: Box<Type>,
},
// region, raw, other boxes, mutable
}

View File

@ -1292,8 +1292,8 @@ pub type Variant = Spanned<Variant_>;
#[deriving(Clone, PartialEq, Eq, Encodable, Decodable, Hash, Show)]
pub enum PathListItem_ {
PathListIdent { pub name: Ident, pub id: NodeId },
PathListMod { pub id: NodeId }
PathListIdent { name: Ident, id: NodeId },
PathListMod { id: NodeId }
}
impl PathListItem_ {

View File

@ -37,7 +37,7 @@ use std::slice;
static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[
("globs", Active),
("macro_rules", Active),
("struct_variant", Active),
("struct_variant", Accepted),
("asm", Active),
("managed_boxes", Removed),
("non_ascii_idents", Active),
@ -184,19 +184,6 @@ impl<'a, 'v> Visitor<'v> for Context<'a> {
}
}
match i.node {
ast::ItemEnum(ref def, _) => {
for variant in def.variants.iter() {
match variant.node.kind {
ast::StructVariantKind(..) => {
self.gate_feature("struct_variant", variant.span,
"enum struct variants are \
experimental and possibly buggy");
}
_ => {}
}
}
}
ast::ItemForeignMod(ref foreign_module) => {
if attr::contains_name(i.attrs.as_slice(), "link_args") {
self.gate_feature("link_args", i.span,

View File

@ -4648,7 +4648,7 @@ impl<'a> Parser<'a> {
is_tuple_like = false;
fields = Vec::new();
while self.token != token::CloseDelim(token::Brace) {
fields.push(self.parse_struct_decl_field());
fields.push(self.parse_struct_decl_field(true));
}
if fields.len() == 0 {
self.fatal(format!("unit-like struct definition should be \
@ -4725,12 +4725,16 @@ impl<'a> Parser<'a> {
}
/// Parse an element of a struct definition
fn parse_struct_decl_field(&mut self) -> StructField {
fn parse_struct_decl_field(&mut self, allow_pub: bool) -> StructField {
let attrs = self.parse_outer_attributes();
if self.eat_keyword(keywords::Pub) {
return self.parse_single_struct_field(Public, attrs);
if !allow_pub {
let span = self.last_span;
self.span_err(span, "`pub` is not allowed here");
}
return self.parse_single_struct_field(Public, attrs);
}
return self.parse_single_struct_field(Inherited, attrs);
@ -5178,7 +5182,7 @@ impl<'a> Parser<'a> {
fn parse_struct_def(&mut self) -> P<StructDef> {
let mut fields: Vec<StructField> = Vec::new();
while self.token != token::CloseDelim(token::Brace) {
fields.push(self.parse_struct_decl_field());
fields.push(self.parse_struct_decl_field(false));
}
self.bump();

View File

@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
use std::num::FromPrimitive;
use std::int;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(Eq,PartialOrd,PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(Eq,PartialOrd,PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(Eq,PartialOrd,PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;
#[deriving(Eq,PartialOrd,PartialEq)]

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -10,7 +10,6 @@
// This file was auto-generated using 'src/etc/generate-deriving-span-tests.py'
#![feature(struct_variant)]
extern crate rand;

View File

@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
enum Foo { C { a: int, b: int } }
struct C { a: int, b: int } //~ ERROR error: duplicate definition of type or module `C`

View File

@ -8,9 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
extern crate bäz; //~ ERROR non-ascii idents
use föö::bar; //~ ERROR non-ascii idents

View File

@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
mod a {
pub enum Enum {
EnumStructVariant { x: u8, y: u8, z: u8 }

View File

@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
enum Foo {
Variant { x: uint }
}

View File

@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
#![allow(unused_variables)]
#![allow(non_camel_case_types)]
#![deny(dead_code)]

View File

@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
#![allow(unused_variables)]
#![deny(dead_code)]

View File

@ -10,7 +10,6 @@
// When denying at the crate level, be sure to not get random warnings from the
// injected intrinsics by the compiler.
#![feature(struct_variant)]
#![feature(globs)]
#![deny(missing_docs)]
#![allow(dead_code)]
@ -106,8 +105,7 @@ enum Baz {
pub enum PubBaz { //~ ERROR: missing documentation
PubBazA { //~ ERROR: missing documentation
pub a: int, //~ ERROR: missing documentation
b: int
a: int, //~ ERROR: missing documentation
},
}
@ -116,15 +114,13 @@ pub enum PubBaz2 {
/// dox
PubBaz2A {
/// dox
pub a: int,
b: int
a: int,
},
}
#[allow(missing_docs)]
pub enum PubBaz3 {
PubBaz3A {
pub a: int,
b: int
},
}

View File

@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
#![allow(dead_code)]
#![deny(raw_pointer_deriving)]

View File

@ -8,7 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
#![deny(visible_private_types)]
#![allow(dead_code)]
#![crate_type="lib"]
@ -57,8 +56,7 @@ struct Bar {
pub enum Baz {
Baz1(Private<int>), //~ ERROR private type in exported type signature
Baz2 {
pub x: Private<int>, //~ ERROR private type in exported type signature
y: Private<int>
y: Private<int> //~ ERROR private type in exported type signature
},
}

View File

@ -9,7 +9,7 @@
// except according to those terms.
// aux-build:namespaced_enums.rs
#![feature(struct_variant, globs)]
#![feature(globs)]
extern crate namespaced_enums;

View File

@ -7,7 +7,7 @@
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant, globs)]
#![feature(globs)]
mod m2 {
pub enum Foo {

View File

@ -8,7 +8,7 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(advanced_slice_patterns, struct_variant)]
#![feature(advanced_slice_patterns)]
struct Foo {
first: bool,

View File

@ -8,8 +8,6 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
enum A {
B { x: Option<int> },
C

View File

@ -1,4 +1,4 @@
// Copyright 2013 The Rust Project Developers. See the COPYRIGHT
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
@ -8,8 +8,10 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.
enum A { B { foo: int } }
//~^ ERROR: enum struct variants are experimental
enum Foo {
Bar {
pub a: int //~ ERROR: `pub` is not allowed here
}
}
fn main() {}

View File

@ -9,8 +9,6 @@
// except according to those terms.
// aux-build:struct_variant_privacy.rs
#![feature(struct_variant)]
extern crate struct_variant_privacy;
fn f(b: struct_variant_privacy::Bar) { //~ ERROR enum `Bar` is private

View File

@ -7,8 +7,6 @@
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
mod foo {
enum Bar {
Baz { a: int }

View File

@ -7,7 +7,6 @@
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
#![feature(struct_variant)]
// Test `Sized?` types not allowed in fields (except the last one).