Skip to content

Commit 4f98e80

Browse files
committed
rustc: Do some plumbing work in preparation for common fields in enums
1 parent 35db5b7 commit 4f98e80

File tree

21 files changed

+134
-116
lines changed

21 files changed

+134
-116
lines changed

src/libsyntax/ast.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -637,9 +637,12 @@ type variant_arg = {ty: @ty, id: node_id};
637637
enum variant_kind {
638638
tuple_variant_kind(~[variant_arg]),
639639
struct_variant_kind(@struct_def),
640-
enum_variant_kind(~[variant])
640+
enum_variant_kind(enum_def)
641641
}
642642

643+
#[auto_serialize]
644+
enum enum_def = { variants: ~[variant] };
645+
643646
#[auto_serialize]
644647
type variant_ = {name: ident, attrs: ~[attribute], kind: variant_kind,
645648
id: node_id, disr_expr: option<@expr>, vis: visibility};
@@ -736,7 +739,7 @@ enum item_ {
736739
item_mod(_mod),
737740
item_foreign_mod(foreign_mod),
738741
item_ty(@ty, ~[ty_param]),
739-
item_enum(~[variant], ~[ty_param]),
742+
item_enum(enum_def, ~[ty_param]),
740743
item_class(@struct_def, ~[ty_param]),
741744
item_trait(~[ty_param], ~[@trait_ref], ~[trait_method]),
742745
item_impl(~[ty_param],

src/libsyntax/ast_map.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,8 +197,8 @@ fn map_item(i: @item, cx: ctx, v: vt) {
197197
cx);
198198
}
199199
}
200-
item_enum(vs, _) => {
201-
for vs.each |v| {
200+
item_enum(enum_definition, _) => {
201+
for enum_definition.variants.each |v| {
202202
cx.map.insert(v.node.id, node_variant(
203203
/* FIXME (#2543) */ copy v, i,
204204
extend(cx, i.ident)));

src/libsyntax/ast_util.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ fn is_exported(i: ident, m: _mod) -> bool {
187187
for m.items.each |it| {
188188
if it.ident == i { local = true; }
189189
match it.node {
190-
item_enum(variants, _) =>
191-
for variants.each |v| {
190+
item_enum(enum_definition, _) =>
191+
for enum_definition.variants.each |v| {
192192
if v.node.name == i {
193193
local = true;
194194
parent_enum = some(/* FIXME (#2543) */ copy it.ident);
@@ -477,7 +477,8 @@ fn id_visitor(vfn: fn@(node_id)) -> visit::vt<()> {
477477
visit_item: fn@(i: @item) {
478478
vfn(i.id);
479479
match i.node {
480-
item_enum(vs, _) => for vs.each |v| { vfn(v.node.id); },
480+
item_enum(enum_definition, _) =>
481+
for enum_definition.variants.each |v| { vfn(v.node.id); },
481482
_ => ()
482483
}
483484
},

src/libsyntax/ext/auto_serialize.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,10 +107,10 @@ fn expand(cx: ext_ctxt,
107107
ty_fns(cx, in_item.ident, ty, tps))
108108
}
109109

110-
ast::item_enum(variants, tps) => {
110+
ast::item_enum(enum_definition, tps) => {
111111
vec::append(~[filter_attrs(in_item)],
112112
enum_fns(cx, in_item.ident,
113-
in_item.span, variants, tps))
113+
in_item.span, enum_definition.variants, tps))
114114
}
115115

116116
_ => {

src/libsyntax/ext/pipes/ast_builder.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ trait ext_ctxt_ast_builder {
6666
output: @ast::ty,
6767
+body: ast::blk) -> @ast::item;
6868
fn item_enum_poly(name: ident,
69-
+variants: ~[ast::variant],
69+
+enum_definition: ast::enum_def,
7070
+ty_params: ~[ast::ty_param]) -> @ast::item;
71-
fn item_enum(name: ident, +variants: ~[ast::variant]) -> @ast::item;
71+
fn item_enum(name: ident, +enum_definition: ast::enum_def) -> @ast::item;
7272
fn variant(name: ident, +tys: ~[@ast::ty]) -> ast::variant;
7373
fn item_mod(name: ident, +items: ~[@ast::item]) -> @ast::item;
7474
fn ty_path_ast_builder(path: @ast::path) -> @ast::ty;
@@ -236,16 +236,13 @@ impl ast_builder of ext_ctxt_ast_builder for ext_ctxt {
236236
}
237237

238238
fn item_enum_poly(name: ident,
239-
+variants: ~[ast::variant],
239+
+enum_definition: ast::enum_def,
240240
+ty_params: ~[ast::ty_param]) -> @ast::item {
241-
self.item(name,
242-
ast::item_enum(variants,
243-
ty_params))
241+
self.item(name, ast::item_enum(enum_definition, ty_params))
244242
}
245243

246-
fn item_enum(name: ident,
247-
+variants: ~[ast::variant]) -> @ast::item {
248-
self.item_enum_poly(name, variants, ~[])
244+
fn item_enum(name: ident, +enum_definition: ast::enum_def) -> @ast::item {
245+
self.item_enum_poly(name, enum_definition, ~[])
249246
}
250247

251248
fn variant(name: ident,

src/libsyntax/ext/pipes/pipec.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ impl compile of to_type_decls for state {
237237
vec::push(items_msg, v);
238238
}
239239
240-
~[cx.item_enum_poly(name, items_msg, self.ty_params)]
240+
~[cx.item_enum_poly(name, ast::enum_def({ variants: items_msg }),
241+
self.ty_params)]
241242
}
242243
243244
fn to_endpoint_decls(cx: ext_ctxt, dir: direction) -> ~[@ast::item] {

src/libsyntax/fold.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -238,9 +238,11 @@ fn noop_fold_item_underscore(i: item_, fld: ast_fold) -> item_ {
238238
item_foreign_mod(nm) => item_foreign_mod(fld.fold_foreign_mod(nm)),
239239
item_ty(t, typms) => item_ty(fld.fold_ty(t),
240240
fold_ty_params(typms, fld)),
241-
item_enum(variants, typms) => {
242-
item_enum(vec::map(variants, |x| fld.fold_variant(x)),
243-
fold_ty_params(typms, fld))
241+
item_enum(enum_definition, typms) => {
242+
item_enum(ast::enum_def({
243+
variants: vec::map(enum_definition.variants,
244+
|x| fld.fold_variant(x)),
245+
}), fold_ty_params(typms, fld))
244246
}
245247
item_class(struct_def, typms) => {
246248
let resulting_optional_constructor;
@@ -565,9 +567,10 @@ fn noop_fold_variant(v: variant_, fld: ast_fold) -> variant_ {
565567
})
566568
}
567569

568-
enum_variant_kind(variants) => {
569-
let variants = vec::map(variants, |x| fld.fold_variant(x));
570-
kind = enum_variant_kind(variants);
570+
enum_variant_kind(enum_definition) => {
571+
let variants = vec::map(enum_definition.variants,
572+
|x| fld.fold_variant(x));
573+
kind = enum_variant_kind(ast::enum_def({ variants: variants }));
571574
}
572575
}
573576

src/libsyntax/parse/parser.rs

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,15 @@ import ast::{_mod, add, alt_check, alt_exhaustive, arg, arm, attribute,
2323
capture_item, cdir_dir_mod, cdir_src_mod, cdir_view_item,
2424
class_immutable, class_member, class_method, class_mutable,
2525
crate, crate_cfg, crate_directive, decl, decl_item, decl_local,
26-
default_blk, deref, div, enum_variant_kind, expl, expr, expr_,
27-
expr_addr_of, expr_match, expr_again, expr_assert, expr_assign,
28-
expr_assign_op, expr_binary, expr_block, expr_break, expr_call,
29-
expr_cast, expr_copy, expr_do_body, expr_fail, expr_field,
30-
expr_fn, expr_fn_block, expr_if, expr_index, expr_lit, expr_log,
31-
expr_loop, expr_loop_body, expr_mac, expr_move, expr_path,
32-
expr_rec, expr_repeat, expr_ret, expr_swap, expr_struct,
33-
expr_tup, expr_unary, expr_unary_move, expr_vec, expr_vstore,
34-
expr_while, extern_fn, field, fn_decl, foreign_item,
26+
default_blk, deref, div, enum_def, enum_variant_kind, expl, expr,
27+
expr_, expr_addr_of, expr_match, expr_again, expr_assert,
28+
expr_assign, expr_assign_op, expr_binary, expr_block, expr_break,
29+
expr_call, expr_cast, expr_copy, expr_do_body, expr_fail,
30+
expr_field, expr_fn, expr_fn_block, expr_if, expr_index,
31+
expr_lit, expr_log, expr_loop, expr_loop_body, expr_mac,
32+
expr_move, expr_path, expr_rec, expr_repeat, expr_ret, expr_swap,
33+
expr_struct, expr_tup, expr_unary, expr_unary_move, expr_vec,
34+
expr_vstore, expr_while, extern_fn, field, fn_decl, foreign_item,
3535
foreign_item_fn, foreign_mod, ident, impure_fn, infer, inherited,
3636
init_assign, init_move, initializer, instance_var, item, item_,
3737
item_class, item_const, item_enum, item_fn, item_foreign_mod,
@@ -2841,7 +2841,7 @@ class parser {
28412841
}
28422842
}
28432843

2844-
fn parse_enum_body(ty_params: ~[ast::ty_param]) -> ~[ast::variant] {
2844+
fn parse_enum_def(ty_params: ~[ast::ty_param]) -> enum_def {
28452845
let mut variants: ~[variant] = ~[];
28462846
let mut all_nullary = true, have_disr = false;
28472847

@@ -2932,7 +2932,7 @@ class parser {
29322932
enum");
29332933
}
29342934

2935-
return variants;
2935+
return enum_def({ variants: variants });
29362936
}
29372937

29382938
fn parse_item_enum() -> item_info {
@@ -2954,12 +2954,13 @@ class parser {
29542954
id: self.get_id(),
29552955
disr_expr: none,
29562956
vis: public});
2957-
return (id, item_enum(~[variant], ty_params), none);
2957+
return (id, item_enum(enum_def({ variants: ~[variant] }),
2958+
ty_params), none);
29582959
}
29592960
self.expect(token::LBRACE);
29602961

2961-
let variants = self.parse_enum_body(ty_params);
2962-
(id, item_enum(variants, ty_params), none)
2962+
let enum_definition = self.parse_enum_def(ty_params);
2963+
(id, item_enum(enum_definition, ty_params), none)
29632964
}
29642965

29652966
fn parse_fn_ty_proto() -> proto {

src/libsyntax/print/pprust.rs

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -487,37 +487,8 @@ fn print_item(s: ps, &&item: @ast::item) {
487487
word(s.s, ~";");
488488
end(s); // end the outer ibox
489489
}
490-
ast::item_enum(variants, params) => {
491-
let mut newtype =
492-
vec::len(variants) == 1u &&
493-
str::eq(item.ident, variants[0].node.name);
494-
if newtype {
495-
match variants[0].node.kind {
496-
ast::tuple_variant_kind(args) if args.len() == 1 => {}
497-
_ => newtype = false
498-
}
499-
}
500-
if newtype {
501-
ibox(s, indent_unit);
502-
word_space(s, ~"enum");
503-
} else {
504-
head(s, ~"enum");
505-
}
506-
507-
word(s.s, *item.ident);
508-
print_type_params(s, params);
509-
space(s.s);
510-
if newtype {
511-
word_space(s, ~"=");
512-
match variants[0].node.kind {
513-
ast::tuple_variant_kind(args) => print_type(s, args[0].ty),
514-
_ => fail ~"newtype syntax with struct?"
515-
}
516-
word(s.s, ~";");
517-
end(s);
518-
} else {
519-
print_variants(s, variants, item.span);
520-
}
490+
ast::item_enum(enum_definition, params) => {
491+
print_enum_def(s, enum_definition, params, item.ident, item.span);
521492
}
522493
ast::item_class(struct_def, tps) => {
523494
head(s, ~"class");
@@ -571,6 +542,41 @@ fn print_item(s: ps, &&item: @ast::item) {
571542
s.ann.post(ann_node);
572543
}
573544

545+
fn print_enum_def(s: ps, enum_definition: ast::enum_def,
546+
params: ~[ast::ty_param], ident: ast::ident,
547+
span: ast::span) {
548+
let mut newtype =
549+
vec::len(enum_definition.variants) == 1u &&
550+
str::eq(ident, enum_definition.variants[0].node.name);
551+
if newtype {
552+
match enum_definition.variants[0].node.kind {
553+
ast::tuple_variant_kind(args) if args.len() == 1 => {}
554+
_ => newtype = false
555+
}
556+
}
557+
if newtype {
558+
ibox(s, indent_unit);
559+
word_space(s, ~"enum");
560+
} else {
561+
head(s, ~"enum");
562+
}
563+
564+
word(s.s, *ident);
565+
print_type_params(s, params);
566+
space(s.s);
567+
if newtype {
568+
word_space(s, ~"=");
569+
match enum_definition.variants[0].node.kind {
570+
ast::tuple_variant_kind(args) => print_type(s, args[0].ty),
571+
_ => fail ~"newtype syntax with struct?"
572+
}
573+
word(s.s, ~";");
574+
end(s);
575+
} else {
576+
print_variants(s, enum_definition.variants, span);
577+
}
578+
}
579+
574580
fn print_variants(s: ps, variants: ~[ast::variant], span: ast::span) {
575581
bopen(s);
576582
for variants.each |v| {
@@ -714,8 +720,8 @@ fn print_variant(s: ps, v: ast::variant) {
714720
head(s, ~"");
715721
print_struct(s, struct_def, ~[], v.node.name, v.span);
716722
}
717-
ast::enum_variant_kind(variants) => {
718-
print_variants(s, variants, v.span);
723+
ast::enum_variant_kind(enum_definition) => {
724+
print_variants(s, enum_definition.variants, v.span);
719725
}
720726
}
721727
match v.node.disr_expr {

src/libsyntax/visit.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -136,9 +136,9 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) {
136136
v.visit_ty(t, e, v);
137137
v.visit_ty_params(tps, e, v);
138138
}
139-
item_enum(variants, tps) => {
139+
item_enum(enum_definition, tps) => {
140140
v.visit_ty_params(tps, e, v);
141-
visit_variants(variants, tps, e, v);
141+
visit_enum_def(enum_definition, tps, e, v);
142142
}
143143
item_impl(tps, traits, ty, methods) => {
144144
v.visit_ty_params(tps, e, v);
@@ -165,9 +165,9 @@ fn visit_item<E>(i: @item, e: E, v: vt<E>) {
165165
}
166166
}
167167

168-
fn visit_variants<E>(variants: ~[ast::variant], tps: ~[ast::ty_param], e: E,
169-
v: vt<E>) {
170-
for variants.each |vr| {
168+
fn visit_enum_def<E>(enum_definition: ast::enum_def, tps: ~[ast::ty_param],
169+
e: E, v: vt<E>) {
170+
for enum_definition.variants.each |vr| {
171171
match vr.node.kind {
172172
tuple_variant_kind(variant_args) => {
173173
for variant_args.each |va| { v.visit_ty(va.ty, e, v); }
@@ -176,8 +176,8 @@ fn visit_variants<E>(variants: ~[ast::variant], tps: ~[ast::ty_param], e: E,
176176
v.visit_struct_def(struct_def, vr.node.name, tps,
177177
vr.node.id, e, v);
178178
}
179-
enum_variant_kind(variants) => {
180-
visit_variants(variants, tps, e, v);
179+
enum_variant_kind(enum_definition) => {
180+
visit_enum_def(enum_definition, tps, e, v);
181181
}
182182
}
183183
}

src/rustc/metadata/encoder.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,12 @@ fn encode_module_item_paths(ebml_w: ebml::writer, ecx: @encode_ctxt,
223223
encode_struct_def(ebml_w, struct_def, path, it.ident, index);
224224
}
225225
}
226-
item_enum(variants, _) => {
226+
item_enum(enum_definition, _) => {
227227
do ebml_w.wr_tag(tag_paths_data_item) {
228228
encode_name_and_def_id(ebml_w, it.ident, it.id);
229229
}
230-
encode_enum_variant_paths(ebml_w, variants, path, index);
230+
encode_enum_variant_paths(ebml_w, enum_definition.variants,
231+
path, index);
231232
}
232233
item_trait(_, _, methods) => {
233234
do ebml_w.wr_tag(tag_paths_data_item) {
@@ -723,23 +724,23 @@ fn encode_info_for_item(ecx: @encode_ctxt, ebml_w: ebml::writer, item: @item,
723724
encode_region_param(ecx, ebml_w, item);
724725
ebml_w.end_tag();
725726
}
726-
item_enum(variants, tps) => {
727+
item_enum(enum_definition, tps) => {
727728
add_to_index();
728729
do ebml_w.wr_tag(tag_items_data_item) {
729730
encode_def_id(ebml_w, local_def(item.id));
730731
encode_family(ebml_w, 't');
731732
encode_type_param_bounds(ebml_w, ecx, tps);
732733
encode_type(ecx, ebml_w, node_id_to_type(tcx, item.id));
733734
encode_name(ebml_w, item.ident);
734-
for variants.each |v| {
735+
for enum_definition.variants.each |v| {
735736
encode_variant_id(ebml_w, local_def(v.node.id));
736737
}
737738
ecx.encode_inlined_item(ecx, ebml_w, path, ii_item(item));
738739
encode_path(ebml_w, path, ast_map::path_name(item.ident));
739740
encode_region_param(ecx, ebml_w, item);
740741
}
741-
encode_enum_variant_info(ecx, ebml_w, item.id, variants,
742-
path, index, tps);
742+
encode_enum_variant_info(ecx, ebml_w, item.id,
743+
enum_definition.variants, path, index, tps);
743744
}
744745
item_class(struct_def, tps) => {
745746
/* First, encode the fields and methods

src/rustc/middle/check_const.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ fn check_item(sess: session, ast_map: ast_map::map,
2525
v.visit_expr(ex, true, v);
2626
check_item_recursion(sess, ast_map, def_map, it);
2727
}
28-
item_enum(vs, _) => {
29-
for vs.each |var| {
28+
item_enum(enum_definition, _) => {
29+
for enum_definition.variants.each |var| {
3030
do option::iter(var.node.disr_expr) |ex| {
3131
v.visit_expr(ex, true, v);
3232
}

src/rustc/middle/lint.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,9 +482,9 @@ fn check_item_non_camel_case_types(cx: ty::ctxt, it: @ast::item) {
482482
ast::item_trait(*) | ast::item_impl(*) => {
483483
check_case(cx, it.ident, it.id, it.id, it.span)
484484
}
485-
ast::item_enum(variants, _) => {
485+
ast::item_enum(enum_definition, _) => {
486486
check_case(cx, it.ident, it.id, it.id, it.span);
487-
for variants.each |variant| {
487+
for enum_definition.variants.each |variant| {
488488
check_case(cx, variant.node.name,
489489
variant.node.id, it.id, variant.span);
490490
}

0 commit comments

Comments
 (0)