Skip to content

Commit e8ddbba

Browse files
committed
syntax/rustc_front: Simplify VariantData::fields
And use VariantData instead of P<VariantData> in Item_ and Variant_
1 parent f68cd9a commit e8ddbba

File tree

24 files changed

+90
-124
lines changed

24 files changed

+90
-124
lines changed

src/librustc/front/map/collector.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
152152
// If this is a tuple-like struct, register the constructor.
153153
if !struct_def.is_struct() {
154154
self.insert_def(struct_def.id(),
155-
NodeStructCtor(&**struct_def),
155+
NodeStructCtor(struct_def),
156156
DefPathData::StructCtor);
157157
}
158158

src/librustc/middle/dead.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl<'a, 'tcx, 'v> Visitor<'v> for MarkSymbolVisitor<'a, 'tcx> {
219219
_: &hir::Generics, _: ast::NodeId, _: codemap::Span) {
220220
let has_extern_repr = self.struct_has_extern_repr;
221221
let inherited_pub_visibility = self.inherited_pub_visibility;
222-
let live_fields = def.fields().filter(|f| {
222+
let live_fields = def.fields().iter().filter(|f| {
223223
has_extern_repr || inherited_pub_visibility || match f.node.kind {
224224
hir::NamedField(_, hir::Public) => true,
225225
_ => false

src/librustc_front/fold.rs

+11-13
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ pub trait Folder : Sized {
223223
noop_fold_poly_trait_ref(p, self)
224224
}
225225

226-
fn fold_variant_data(&mut self, struct_def: P<VariantData>) -> P<VariantData> {
227-
noop_fold_struct_def(struct_def, self)
226+
fn fold_variant_data(&mut self, vdata: VariantData) -> VariantData {
227+
noop_fold_variant_data(vdata, self)
228228
}
229229

230230
fn fold_lifetimes(&mut self, lts: Vec<Lifetime>) -> Vec<Lifetime> {
@@ -693,18 +693,16 @@ pub fn noop_fold_where_predicate<T: Folder>(pred: WherePredicate, fld: &mut T) -
693693
}
694694
}
695695

696-
pub fn noop_fold_struct_def<T: Folder>(struct_def: P<VariantData>, fld: &mut T) -> P<VariantData> {
697-
struct_def.map(|vdata| {
698-
match vdata {
699-
VariantData::Struct(fields, id) => {
700-
VariantData::Struct(fields.move_map(|f| fld.fold_struct_field(f)), fld.new_id(id))
701-
}
702-
VariantData::Tuple(fields, id) => {
703-
VariantData::Tuple(fields.move_map(|f| fld.fold_struct_field(f)), fld.new_id(id))
704-
}
705-
VariantData::Unit(id) => VariantData::Unit(fld.new_id(id))
696+
pub fn noop_fold_variant_data<T: Folder>(vdata: VariantData, fld: &mut T) -> VariantData {
697+
match vdata {
698+
VariantData::Struct(fields, id) => {
699+
VariantData::Struct(fields.move_map(|f| fld.fold_struct_field(f)), fld.new_id(id))
706700
}
707-
})
701+
VariantData::Tuple(fields, id) => {
702+
VariantData::Tuple(fields.move_map(|f| fld.fold_struct_field(f)), fld.new_id(id))
703+
}
704+
VariantData::Unit(id) => VariantData::Unit(fld.new_id(id))
705+
}
708706
}
709707

710708
pub fn noop_fold_trait_ref<T: Folder>(p: TraitRef, fld: &mut T) -> TraitRef {

src/librustc_front/hir.rs

+6-12
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ use print::pprust;
4949
use util;
5050

5151
use std::fmt;
52-
use std::{iter, option, slice};
5352
use serialize::{Encodable, Encoder, Decoder};
5453

5554
#[derive(Clone, PartialEq, Eq, RustcEncodable, RustcDecodable, Hash, Copy)]
@@ -1024,7 +1023,7 @@ pub struct EnumDef {
10241023
pub struct Variant_ {
10251024
pub name: Name,
10261025
pub attrs: Vec<Attribute>,
1027-
pub data: P<VariantData>,
1026+
pub data: VariantData,
10281027
/// Explicit discriminant, eg `Foo = 1`
10291028
pub disr_expr: Option<P<Expr>>,
10301029
}
@@ -1179,17 +1178,12 @@ pub enum VariantData {
11791178
Unit(NodeId),
11801179
}
11811180

1182-
pub type FieldIter<'a> = iter::FlatMap<option::IntoIter<&'a Vec<StructField>>,
1183-
slice::Iter<'a, StructField>,
1184-
fn(&Vec<StructField>) -> slice::Iter<StructField>>;
1185-
11861181
impl VariantData {
1187-
pub fn fields(&self) -> FieldIter {
1188-
fn vec_iter<T>(v: &Vec<T>) -> slice::Iter<T> { v.iter() }
1182+
pub fn fields(&self) -> &[StructField] {
11891183
match *self {
1190-
VariantData::Struct(ref fields, _) | VariantData::Tuple(ref fields, _) => Some(fields),
1191-
_ => None,
1192-
}.into_iter().flat_map(vec_iter)
1184+
VariantData::Struct(ref fields, _) | VariantData::Tuple(ref fields, _) => fields,
1185+
_ => &[],
1186+
}
11931187
}
11941188
pub fn id(&self) -> NodeId {
11951189
match *self {
@@ -1248,7 +1242,7 @@ pub enum Item_ {
12481242
/// An enum definition, e.g. `enum Foo<A, B> {C<A>, D<B>}`
12491243
ItemEnum(EnumDef, Generics),
12501244
/// A struct definition, e.g. `struct Foo<A> {x: A}`
1251-
ItemStruct(P<VariantData>, Generics),
1245+
ItemStruct(VariantData, Generics),
12521246
/// Represents a Trait Declaration
12531247
ItemTrait(Unsafety, Generics, TyParamBounds, Vec<P<TraitItem>>),
12541248

src/librustc_front/lowering.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ pub fn lower_variant(_lctx: &LoweringContext, v: &Variant) -> P<hir::Variant> {
266266
node: hir::Variant_ {
267267
name: v.node.name.name,
268268
attrs: v.node.attrs.clone(),
269-
data: lower_struct_def(_lctx, &v.node.data),
269+
data: lower_variant_data(_lctx, &v.node.data),
270270
disr_expr: v.node.disr_expr.as_ref().map(|e| lower_expr(_lctx, e)),
271271
},
272272
span: v.span,
@@ -498,8 +498,8 @@ pub fn lower_where_predicate(_lctx: &LoweringContext,
498498
}
499499
}
500500

501-
pub fn lower_struct_def(_lctx: &LoweringContext, sd: &VariantData) -> P<hir::VariantData> {
502-
P(match *sd {
501+
pub fn lower_variant_data(_lctx: &LoweringContext, vdata: &VariantData) -> hir::VariantData {
502+
match *vdata {
503503
VariantData::Struct(ref fields, id) => {
504504
hir::VariantData::Struct(fields.iter()
505505
.map(|f| lower_struct_field(_lctx, f)).collect(), id)
@@ -509,7 +509,7 @@ pub fn lower_struct_def(_lctx: &LoweringContext, sd: &VariantData) -> P<hir::Var
509509
.map(|f| lower_struct_field(_lctx, f)).collect(), id)
510510
}
511511
VariantData::Unit(id) => hir::VariantData::Unit(id)
512-
})
512+
}
513513
}
514514

515515
pub fn lower_trait_ref(_lctx: &LoweringContext, p: &TraitRef) -> hir::TraitRef {
@@ -611,7 +611,7 @@ pub fn lower_item_underscore(_lctx: &LoweringContext, i: &Item_) -> hir::Item_ {
611611
lower_generics(_lctx, generics))
612612
}
613613
ItemStruct(ref struct_def, ref generics) => {
614-
let struct_def = lower_struct_def(_lctx, struct_def);
614+
let struct_def = lower_variant_data(_lctx, struct_def);
615615
hir::ItemStruct(struct_def, lower_generics(_lctx, generics))
616616
}
617617
ItemDefaultImpl(unsafety, ref trait_ref) => {

src/librustc_front/print/pprust.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,7 @@ impl<'a> State<'a> {
734734
}
735735
hir::ItemStruct(ref struct_def, ref generics) => {
736736
try!(self.head(&visibility_qualified(item.vis, "struct")));
737-
try!(self.print_struct(&**struct_def, generics, item.name, item.span, true));
737+
try!(self.print_struct(struct_def, generics, item.name, item.span, true));
738738
}
739739

740740
hir::ItemDefaultImpl(unsafety, ref trait_ref) => {
@@ -899,7 +899,7 @@ impl<'a> State<'a> {
899899
if !struct_def.is_struct() {
900900
if struct_def.is_tuple() {
901901
try!(self.popen());
902-
try!(self.commasep_iter(Inconsistent,
902+
try!(self.commasep(Inconsistent,
903903
struct_def.fields(),
904904
|s, field| {
905905
match field.node.kind {

src/librustc_privacy/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,7 @@ impl<'a, 'tcx> SanePrivacyVisitor<'a, 'tcx> {
11141114
}
11151115
}
11161116

1117-
hir::ItemStruct(ref def, _) => check_struct(&**def),
1117+
hir::ItemStruct(ref def, _) => check_struct(def),
11181118

11191119
hir::ItemEnum(..) |
11201120
hir::ItemExternCrate(_) | hir::ItemUse(_) |

src/librustc_resolve/build_reduced_graph.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ impl<'a, 'b:'a, 'tcx:'b> GraphBuilder<'a, 'b, 'tcx> {
514514
}
515515

516516
// Record the def ID and fields of this struct.
517-
let named_fields = struct_def.fields().filter_map(|f| {
517+
let named_fields = struct_def.fields().iter().filter_map(|f| {
518518
match f.node.kind {
519519
NamedField(name, _) => Some(name),
520520
UnnamedField(_) => None

src/librustc_trans/save/dump_csv.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -918,7 +918,7 @@ impl<'l, 'tcx, 'v> Visitor<'v> for DumpCsvVisitor<'l, 'tcx> {
918918
self.process_static_or_const_item(item, typ, expr),
919919
ast::ItemConst(ref typ, ref expr) =>
920920
self.process_static_or_const_item(item, &typ, &expr),
921-
ast::ItemStruct(ref def, ref ty_params) => self.process_struct(item, &**def, ty_params),
921+
ast::ItemStruct(ref def, ref ty_params) => self.process_struct(item, def, ty_params),
922922
ast::ItemEnum(ref def, ref ty_params) => self.process_enum(item, def, ty_params),
923923
ast::ItemImpl(_, _,
924924
ref ty_params,

src/librustc_trans/trans/base.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2435,7 +2435,7 @@ pub fn get_item_val(ccx: &CrateContext, id: ast::NodeId) -> ValueRef {
24352435
} else {
24362436
v.node.data.fields()
24372437
};
2438-
assert!(fields.count() != 0);
2438+
assert!(!fields.is_empty());
24392439
let ty = ccx.tcx().node_id_to_type(id);
24402440
let parent = ccx.tcx().map.get_parent(id);
24412441
let enm = ccx.tcx().map.expect_item(parent);

src/librustc_typeck/check/wf.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl<'ccx, 'tcx> CheckTypeWellFormedVisitor<'ccx, 'tcx> {
103103
}
104104
hir::ItemStruct(ref struct_def, ref ast_generics) => {
105105
self.check_type_defn(item, |fcx| {
106-
vec![struct_variant(fcx, &**struct_def)]
106+
vec![struct_variant(fcx, struct_def)]
107107
});
108108

109109
self.check_variances_for_type_defn(item, ast_generics);
@@ -627,7 +627,7 @@ fn struct_variant<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
627627
struct_def: &hir::VariantData)
628628
-> AdtVariant<'tcx> {
629629
let fields =
630-
struct_def.fields()
630+
struct_def.fields().iter()
631631
.map(|field| {
632632
let field_ty = fcx.tcx().node_id_to_type(field.node.id);
633633
let field_ty = fcx.instantiate_type_scheme(field.span,

src/librustc_typeck/check/wfcheck.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ impl<'ccx, 'tcx> CheckTypeWellFormedVisitor<'ccx, 'tcx> {
112112
}
113113
hir::ItemStruct(ref struct_def, ref ast_generics) => {
114114
self.check_type_defn(item, |fcx| {
115-
vec![struct_variant(fcx, &**struct_def)]
115+
vec![struct_variant(fcx, struct_def)]
116116
});
117117

118118
self.check_variances_for_type_defn(item, ast_generics);
@@ -524,7 +524,7 @@ fn struct_variant<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
524524
struct_def: &hir::VariantData)
525525
-> AdtVariant<'tcx> {
526526
let fields =
527-
struct_def.fields()
527+
struct_def.fields().iter()
528528
.map(|field| {
529529
let field_ty = fcx.tcx().node_id_to_type(field.node.id);
530530
let field_ty = fcx.instantiate_type_scheme(field.span,

src/librustc_typeck/collect.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1010,7 +1010,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
10101010
let it_def_id = ccx.tcx.map.local_def_id(it.id);
10111011
let variant = tcx.lookup_adt_def_master(it_def_id).struct_variant();
10121012

1013-
for (f, ty_f) in struct_def.fields().zip(variant.fields.iter()) {
1013+
for (f, ty_f) in struct_def.fields().iter().zip(variant.fields.iter()) {
10141014
convert_field(ccx, &scheme.generics, &predicates, f, ty_f)
10151015
}
10161016

@@ -1067,7 +1067,7 @@ fn convert_enum_variant_types<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
10671067
variants: &[P<hir::Variant>]) {
10681068
// fill the field types
10691069
for (variant, ty_variant) in variants.iter().zip(def.variants.iter()) {
1070-
for (f, ty_f) in variant.node.data.fields().zip(ty_variant.fields.iter()) {
1070+
for (f, ty_f) in variant.node.data.fields().iter().zip(ty_variant.fields.iter()) {
10711071
convert_field(ccx, &scheme.generics, &predicates, f, ty_f)
10721072
}
10731073

@@ -1089,7 +1089,7 @@ fn convert_struct_variant<'tcx>(tcx: &ty::ctxt<'tcx>,
10891089
disr_val: ty::Disr,
10901090
def: &hir::VariantData) -> ty::VariantDefData<'tcx, 'tcx> {
10911091
let mut seen_fields: FnvHashMap<ast::Name, Span> = FnvHashMap();
1092-
let fields = def.fields().map(|f| {
1092+
let fields = def.fields().iter().map(|f| {
10931093
let fid = tcx.map.local_def_id(f.node.id);
10941094
match f.node.kind {
10951095
hir::NamedField(name, vis) => {

src/librustdoc/clean/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1809,7 +1809,7 @@ impl Clean<VariantStruct> for ::rustc_front::hir::VariantData {
18091809
fn clean(&self, cx: &DocContext) -> VariantStruct {
18101810
VariantStruct {
18111811
struct_type: doctree::struct_type_from_def(self),
1812-
fields: self.fields().map(|x| x.clean(cx)).collect(),
1812+
fields: self.fields().iter().map(|x| x.clean(cx)).collect(),
18131813
fields_stripped: false,
18141814
}
18151815
}
@@ -1923,7 +1923,7 @@ fn struct_def_to_variant_kind(struct_def: &hir::VariantData, cx: &DocContext) ->
19231923
} else if struct_def.is_unit() {
19241924
CLikeVariant
19251925
} else {
1926-
TupleVariant(struct_def.fields().map(|x| x.node.ty.clean(cx)).collect())
1926+
TupleVariant(struct_def.fields().iter().map(|x| x.node.ty.clean(cx)).collect())
19271927
}
19281928
}
19291929

src/librustdoc/doctree.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ pub struct Enum {
119119
pub struct Variant {
120120
pub name: Name,
121121
pub attrs: Vec<ast::Attribute>,
122-
pub def: P<hir::VariantData>,
122+
pub def: hir::VariantData,
123123
pub stab: Option<attr::Stability>,
124124
pub whence: Span,
125125
}
@@ -236,7 +236,7 @@ pub struct Import {
236236
pub fn struct_type_from_def(sd: &hir::VariantData) -> StructType {
237237
if !sd.is_struct() {
238238
// We are in a tuple-struct
239-
match sd.fields().count() {
239+
match sd.fields().len() {
240240
0 => Unit,
241241
1 => Newtype,
242242
_ => Tuple

src/librustdoc/visit_ast.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
9797
stab: self.stability(item.id),
9898
attrs: item.attrs.clone(),
9999
generics: generics.clone(),
100-
fields: sd.fields().cloned().collect(),
100+
fields: sd.fields().iter().cloned().collect(),
101101
whence: item.span
102102
}
103103
}
@@ -298,7 +298,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> {
298298
hir::ItemEnum(ref ed, ref gen) =>
299299
om.enums.push(self.visit_enum_def(item, name, ed, gen)),
300300
hir::ItemStruct(ref sd, ref gen) =>
301-
om.structs.push(self.visit_variant_data(item, name, &**sd, gen)),
301+
om.structs.push(self.visit_variant_data(item, name, sd, gen)),
302302
hir::ItemFn(ref fd, ref unsafety, constness, ref abi, ref gen, _) =>
303303
om.fns.push(self.visit_fn(item, name, &**fd, unsafety,
304304
constness, abi, gen)),

src/libsyntax/ast.rs

+6-12
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ use std::fmt;
6565
use std::rc::Rc;
6666
use std::borrow::Cow;
6767
use std::hash::{Hash, Hasher};
68-
use std::{iter, option, slice};
6968
use serialize::{Encodable, Decodable, Encoder, Decoder};
7069

7170
/// A name is a part of an identifier, representing a string or gensym. It's
@@ -1578,7 +1577,7 @@ pub struct EnumDef {
15781577
pub struct Variant_ {
15791578
pub name: Ident,
15801579
pub attrs: Vec<Attribute>,
1581-
pub data: P<VariantData>,
1580+
pub data: VariantData,
15821581
/// Explicit discriminant, eg `Foo = 1`
15831582
pub disr_expr: Option<P<Expr>>,
15841583
}
@@ -1757,17 +1756,12 @@ pub enum VariantData {
17571756
Unit(NodeId),
17581757
}
17591758

1760-
pub type FieldIter<'a> = iter::FlatMap<option::IntoIter<&'a Vec<StructField>>,
1761-
slice::Iter<'a, StructField>,
1762-
fn(&Vec<StructField>) -> slice::Iter<StructField>>;
1763-
17641759
impl VariantData {
1765-
pub fn fields(&self) -> FieldIter {
1766-
fn vec_iter<T>(v: &Vec<T>) -> slice::Iter<T> { v.iter() }
1760+
pub fn fields(&self) -> &[StructField] {
17671761
match *self {
1768-
VariantData::Struct(ref fields, _) | VariantData::Tuple(ref fields, _) => Some(fields),
1769-
_ => None,
1770-
}.into_iter().flat_map(vec_iter)
1762+
VariantData::Struct(ref fields, _) | VariantData::Tuple(ref fields, _) => fields,
1763+
_ => &[],
1764+
}
17711765
}
17721766
pub fn id(&self) -> NodeId {
17731767
match *self {
@@ -1826,7 +1820,7 @@ pub enum Item_ {
18261820
/// An enum definition, e.g. `enum Foo<A, B> {C<A>, D<B>}`
18271821
ItemEnum(EnumDef, Generics),
18281822
/// A struct definition, e.g. `struct Foo<A> {x: A}`
1829-
ItemStruct(P<VariantData>, Generics),
1823+
ItemStruct(VariantData, Generics),
18301824
/// Represents a Trait Declaration
18311825
ItemTrait(Unsafety,
18321826
Generics,

src/libsyntax/config.rs

+13-15
Original file line numberDiff line numberDiff line change
@@ -164,24 +164,22 @@ fn fold_item_underscore<F>(cx: &mut Context<F>, item: ast::Item_) -> ast::Item_
164164
fold::noop_fold_item_underscore(item, cx)
165165
}
166166

167-
fn fold_struct<F>(cx: &mut Context<F>, def: P<ast::VariantData>) -> P<ast::VariantData> where
167+
fn fold_struct<F>(cx: &mut Context<F>, vdata: ast::VariantData) -> ast::VariantData where
168168
F: FnMut(&[ast::Attribute]) -> bool
169169
{
170-
def.map(|vdata| {
171-
match vdata {
172-
ast::VariantData::Struct(fields, id) => {
173-
ast::VariantData::Struct(fields.into_iter().filter(|m| {
174-
(cx.in_cfg)(&m.node.attrs)
175-
}).collect(), id)
176-
}
177-
ast::VariantData::Tuple(fields, id) => {
178-
ast::VariantData::Tuple(fields.into_iter().filter(|m| {
179-
(cx.in_cfg)(&m.node.attrs)
180-
}).collect(), id)
181-
}
182-
ast::VariantData::Unit(id) => ast::VariantData::Unit(id)
170+
match vdata {
171+
ast::VariantData::Struct(fields, id) => {
172+
ast::VariantData::Struct(fields.into_iter().filter(|m| {
173+
(cx.in_cfg)(&m.node.attrs)
174+
}).collect(), id)
183175
}
184-
})
176+
ast::VariantData::Tuple(fields, id) => {
177+
ast::VariantData::Tuple(fields.into_iter().filter(|m| {
178+
(cx.in_cfg)(&m.node.attrs)
179+
}).collect(), id)
180+
}
181+
ast::VariantData::Unit(id) => ast::VariantData::Unit(id)
182+
}
185183
}
186184

187185
fn retain_stmt<F>(cx: &mut Context<F>, stmt: &ast::Stmt) -> bool where

0 commit comments

Comments
 (0)