Skip to content

Commit 19db44f

Browse files
committed
XXX: redoing Enum
1 parent e71c375 commit 19db44f

File tree

23 files changed

+96
-106
lines changed

23 files changed

+96
-106
lines changed

compiler/rustc_ast/src/ast.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2440,10 +2440,6 @@ pub struct ForeignMod {
24402440
pub items: Vec<P<ForeignItem>>,
24412441
}
24422442

2443-
#[derive(Clone, Encodable, Decodable, Debug)]
2444-
pub struct EnumDef {
2445-
pub variants: Vec<Variant>,
2446-
}
24472443
/// Enum variant.
24482444
#[derive(Clone, Encodable, Decodable, Debug)]
24492445
pub struct Variant {
@@ -2808,6 +2804,12 @@ pub struct Fn {
28082804
pub body: Option<P<Block>>,
28092805
}
28102806

2807+
#[derive(Clone, Encodable, Decodable, Debug)]
2808+
pub struct Enum {
2809+
pub variants: Vec<Variant>,
2810+
pub generics: Generics,
2811+
}
2812+
28112813
#[derive(Clone, Encodable, Decodable, Debug)]
28122814
pub enum ItemKind {
28132815
/// An `extern crate` item, with the optional *original* crate name if the crate was renamed.
@@ -2849,7 +2851,7 @@ pub enum ItemKind {
28492851
/// An enum definition (`enum`).
28502852
///
28512853
/// E.g., `enum Foo<A, B> { C<A>, D<B> }`.
2852-
Enum(EnumDef, Box<Generics>),
2854+
Enum(Box<Enum>),
28532855
/// A struct definition (`struct`).
28542856
///
28552857
/// E.g., `struct Foo<A> { x: A }`.
@@ -2915,7 +2917,7 @@ impl ItemKind {
29152917
match self {
29162918
Self::Fn(box Fn { generics, .. })
29172919
| Self::TyAlias(box TyAlias { generics, .. })
2918-
| Self::Enum(_, box generics)
2920+
| Self::Enum(box Enum { generics, .. })
29192921
| Self::Struct(_, box generics)
29202922
| Self::Union(_, box generics)
29212923
| Self::Trait(box Trait { generics, .. })

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1048,7 +1048,7 @@ pub fn noop_visit_item_kind<T: MutVisitor>(kind: &mut ItemKind, vis: &mut T) {
10481048
visit_bounds(bounds, vis);
10491049
visit_opt(ty, |ty| vis.visit_ty(ty));
10501050
}
1051-
ItemKind::Enum(EnumDef { variants }, generics) => {
1051+
ItemKind::Enum(box Enum { variants, generics }) => {
10521052
variants.flat_map_in_place(|variant| vis.flat_map_variant(variant));
10531053
vis.visit_generics(generics);
10541054
}

compiler/rustc_ast/src/visit.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,6 @@ pub trait Visitor<'ast>: Sized {
177177
fn visit_field_def(&mut self, s: &'ast FieldDef) {
178178
walk_field_def(self, s)
179179
}
180-
fn visit_enum_def(&mut self, enum_definition: &'ast EnumDef) {
181-
walk_enum_def(self, enum_definition)
182-
}
183180
fn visit_variant(&mut self, v: &'ast Variant) {
184181
walk_variant(self, v)
185182
}
@@ -326,9 +323,9 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
326323
walk_list!(visitor, visit_param_bound, bounds, BoundKind::Bound);
327324
walk_list!(visitor, visit_ty, ty);
328325
}
329-
ItemKind::Enum(ref enum_definition, ref generics) => {
326+
ItemKind::Enum(box Enum { ref variants, ref generics }) => {
330327
visitor.visit_generics(generics);
331-
visitor.visit_enum_def(enum_definition)
328+
walk_list!(visitor, visit_variant, variants);
332329
}
333330
ItemKind::Impl(box Impl {
334331
defaultness: _,
@@ -371,10 +368,6 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) {
371368
walk_list!(visitor, visit_attribute, &item.attrs);
372369
}
373370

374-
pub fn walk_enum_def<'a, V: Visitor<'a>>(visitor: &mut V, enum_definition: &'a EnumDef) {
375-
walk_list!(visitor, visit_variant, &enum_definition.variants);
376-
}
377-
378371
pub fn walk_variant<'a, V: Visitor<'a>>(visitor: &mut V, variant: &'a Variant)
379372
where
380373
V: Visitor<'a>,

compiler/rustc_ast_lowering/src/item.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -324,15 +324,13 @@ impl<'hir> LoweringContext<'_, 'hir> {
324324
);
325325
hir::ItemKind::TyAlias(ty, generics)
326326
}
327-
ItemKind::Enum(ref enum_definition, ref generics) => {
327+
ItemKind::Enum(box Enum { ref variants, ref generics }) => {
328328
let (generics, variants) = self.lower_generics(
329329
generics,
330330
id,
331331
ImplTraitContext::Disallowed(ImplTraitPosition::Generic),
332332
|this| {
333-
this.arena.alloc_from_iter(
334-
enum_definition.variants.iter().map(|x| this.lower_variant(x)),
335-
)
333+
this.arena.alloc_from_iter(variants.iter().map(|x| this.lower_variant(x)))
336334
},
337335
);
338336
hir::ItemKind::Enum(hir::EnumDef { variants }, generics)

compiler/rustc_ast_passes/src/ast_validation.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1250,8 +1250,8 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
12501250
self.extern_mod = old_item;
12511251
return; // Avoid visiting again.
12521252
}
1253-
ItemKind::Enum(ref def, _) => {
1254-
for variant in &def.variants {
1253+
ItemKind::Enum(box Enum { ref variants, .. }) => {
1254+
for variant in variants {
12551255
self.invalid_visibility(&variant.vis, None);
12561256
for field in variant.data.fields() {
12571257
self.invalid_visibility(&field.vis, None);
@@ -1547,10 +1547,6 @@ impl<'a> Visitor<'a> for AstValidator<'a> {
15471547
self.with_banned_assoc_ty_bound(|this| visit::walk_struct_def(this, s))
15481548
}
15491549

1550-
fn visit_enum_def(&mut self, enum_definition: &'a EnumDef) {
1551-
self.with_banned_assoc_ty_bound(|this| visit::walk_enum_def(this, enum_definition))
1552-
}
1553-
15541550
fn visit_fn(&mut self, fk: FnKind<'a>, span: Span, id: NodeId) {
15551551
// Only associated `fn`s can have `self` parameters.
15561552
let self_semantic = match fk.ctxt() {

compiler/rustc_ast_passes/src/feature_gate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ impl<'a> Visitor<'a> for PostExpansionVisitor<'a> {
465465
}
466466
}
467467

468-
ast::ItemKind::Enum(ast::EnumDef { ref variants, .. }, ..) => {
468+
ast::ItemKind::Enum(box ast::Enum { ref variants, .. }) => {
469469
for variant in variants {
470470
match (&variant.data, &variant.disr_expr) {
471471
(ast::VariantData::Unit(..), _) => {}

compiler/rustc_ast_passes/src/node_count.rs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,6 @@ impl<'ast> Visitor<'ast> for NodeCounter {
9191
self.count += 1;
9292
walk_field_def(self, s)
9393
}
94-
fn visit_enum_def(&mut self, enum_definition: &EnumDef) {
95-
self.count += 1;
96-
walk_enum_def(self, enum_definition)
97-
}
9894
fn visit_variant(&mut self, v: &Variant) {
9995
self.count += 1;
10096
walk_variant(self, v)

compiler/rustc_ast_pretty/src/pprust/state/item.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,8 @@ impl<'a> State<'a> {
240240
defaultness,
241241
);
242242
}
243-
ast::ItemKind::Enum(ref enum_definition, ref params) => {
244-
self.print_enum_def(enum_definition, params, item.ident, item.span, &item.vis);
243+
ast::ItemKind::Enum(box ast::Enum { ref variants, ref generics }) => {
244+
self.print_enum(variants, generics, item.ident, item.span, &item.vis);
245245
}
246246
ast::ItemKind::Struct(ref struct_def, ref generics) => {
247247
self.head(visibility_qualified(&item.vis, "struct"));
@@ -377,9 +377,9 @@ impl<'a> State<'a> {
377377
self.ann.post(self, AnnNode::Item(item))
378378
}
379379

380-
fn print_enum_def(
380+
fn print_enum(
381381
&mut self,
382-
enum_definition: &ast::EnumDef,
382+
variants: &[ast::Variant],
383383
generics: &ast::Generics,
384384
ident: Ident,
385385
span: rustc_span::Span,
@@ -390,7 +390,7 @@ impl<'a> State<'a> {
390390
self.print_generic_params(&generics.params);
391391
self.print_where_clause(&generics.where_clause);
392392
self.space();
393-
self.print_variants(&enum_definition.variants, span)
393+
self.print_variants(variants, span)
394394
}
395395

396396
fn print_variants(&mut self, variants: &[ast::Variant], span: rustc_span::Span) {

compiler/rustc_builtin_macros/src/deriving/clone.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use crate::deriving::generic::ty::*;
22
use crate::deriving::generic::*;
33
use crate::deriving::path_std;
44

5-
use rustc_ast::{self as ast, Generics, ItemKind, MetaItem, VariantData};
5+
use rustc_ast::{self as ast, Enum, Generics, ItemKind, MetaItem, VariantData};
66
use rustc_data_structures::fx::FxHashSet;
77
use rustc_expand::base::{Annotatable, ExtCtxt};
88
use rustc_span::symbol::{kw, sym, Ident};
@@ -34,7 +34,7 @@ pub fn expand_deriving_clone(
3434
match *item {
3535
Annotatable::Item(ref annitem) => match annitem.kind {
3636
ItemKind::Struct(_, box Generics { ref params, .. })
37-
| ItemKind::Enum(_, box Generics { ref params, .. }) => {
37+
| ItemKind::Enum(box Enum { variants: _, generics: Generics { ref params, .. } }) => {
3838
let container_id = cx.current_expansion.id.expn_data().parent.expect_local();
3939
let has_derive_copy = cx.resolver.has_derive_copy(container_id);
4040
if has_derive_copy
@@ -137,8 +137,8 @@ fn cs_clone_simple(
137137
StaticStruct(vdata, ..) => {
138138
process_variant(vdata);
139139
}
140-
StaticEnum(enum_def, ..) => {
141-
for variant in &enum_def.variants {
140+
StaticEnum(variants, ..) => {
141+
for variant in variants {
142142
process_variant(&variant.data);
143143
}
144144
}

compiler/rustc_builtin_macros/src/deriving/cmp/eq.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,8 @@ fn cs_total_eq_assert(
7979
StaticStruct(vdata, ..) => {
8080
process_variant(vdata);
8181
}
82-
StaticEnum(enum_def, ..) => {
83-
for variant in &enum_def.variants {
82+
StaticEnum(variants, ..) => {
83+
for variant in variants {
8484
process_variant(&variant.data);
8585
}
8686
}

compiler/rustc_builtin_macros/src/deriving/default.rs

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ use crate::deriving::generic::*;
33

44
use rustc_ast as ast;
55
use rustc_ast::walk_list;
6-
use rustc_ast::EnumDef;
76
use rustc_ast::VariantData;
87
use rustc_errors::Applicability;
98
use rustc_expand::base::{Annotatable, DummyResult, ExtCtxt};
@@ -43,7 +42,7 @@ pub fn expand_deriving_default(
4342
StaticStruct(_, fields) => {
4443
default_struct_substructure(cx, trait_span, substr, fields)
4544
}
46-
StaticEnum(enum_def, _) => default_enum_substructure(cx, trait_span, enum_def),
45+
StaticEnum(variants, _) => default_enum_substructure(cx, trait_span, variants),
4746
_ => cx.span_bug(trait_span, "method in `derive(Default)`"),
4847
}
4948
})),
@@ -86,9 +85,9 @@ fn default_struct_substructure(
8685
fn default_enum_substructure(
8786
cx: &mut ExtCtxt<'_>,
8887
trait_span: Span,
89-
enum_def: &EnumDef,
88+
variants: &[ast::Variant],
9089
) -> BlockOrExpr {
91-
let expr = if let Ok(default_variant) = extract_default_variant(cx, enum_def, trait_span)
90+
let expr = if let Ok(default_variant) = extract_default_variant(cx, variants, trait_span)
9291
&& let Ok(_) = validate_default_attribute(cx, default_variant)
9392
{
9493
// We now know there is exactly one unit variant with exactly one `#[default]` attribute.
@@ -104,20 +103,18 @@ fn default_enum_substructure(
104103

105104
fn extract_default_variant<'a>(
106105
cx: &mut ExtCtxt<'_>,
107-
enum_def: &'a EnumDef,
106+
variants: &'a [ast::Variant],
108107
trait_span: Span,
109-
) -> Result<&'a rustc_ast::Variant, ()> {
110-
let default_variants: SmallVec<[_; 1]> = enum_def
111-
.variants
108+
) -> Result<&'a ast::Variant, ()> {
109+
let default_variants: SmallVec<[_; 1]> = variants
112110
.iter()
113111
.filter(|variant| cx.sess.contains_name(&variant.attrs, kw::Default))
114112
.collect();
115113

116114
let variant = match default_variants.as_slice() {
117115
[variant] => variant,
118116
[] => {
119-
let possible_defaults = enum_def
120-
.variants
117+
let possible_defaults = variants
121118
.iter()
122119
.filter(|variant| matches!(variant.data, VariantData::Unit(..)))
123120
.filter(|variant| !cx.sess.contains_name(&variant.attrs, sym::non_exhaustive));
@@ -192,7 +189,7 @@ fn extract_default_variant<'a>(
192189

193190
fn validate_default_attribute(
194191
cx: &mut ExtCtxt<'_>,
195-
default_variant: &rustc_ast::Variant,
192+
default_variant: &ast::Variant,
196193
) -> Result<(), ()> {
197194
let attrs: SmallVec<[_; 1]> =
198195
cx.sess.filter_by_name(&default_variant.attrs, kw::Default).collect();
@@ -242,8 +239,8 @@ struct DetectNonVariantDefaultAttr<'a, 'b> {
242239
cx: &'a ExtCtxt<'b>,
243240
}
244241

245-
impl<'a, 'b> rustc_ast::visit::Visitor<'a> for DetectNonVariantDefaultAttr<'a, 'b> {
246-
fn visit_attribute(&mut self, attr: &'a rustc_ast::Attribute) {
242+
impl<'a, 'b> ast::visit::Visitor<'a> for DetectNonVariantDefaultAttr<'a, 'b> {
243+
fn visit_attribute(&mut self, attr: &'a ast::Attribute) {
247244
if attr.has_name(kw::Default) {
248245
self.cx
249246
.struct_span_err(
@@ -253,15 +250,15 @@ impl<'a, 'b> rustc_ast::visit::Visitor<'a> for DetectNonVariantDefaultAttr<'a, '
253250
.emit();
254251
}
255252

256-
rustc_ast::visit::walk_attribute(self, attr);
253+
ast::visit::walk_attribute(self, attr);
257254
}
258-
fn visit_variant(&mut self, v: &'a rustc_ast::Variant) {
255+
fn visit_variant(&mut self, v: &'a ast::Variant) {
259256
self.visit_ident(v.ident);
260257
self.visit_vis(&v.vis);
261258
self.visit_variant_data(&v.data);
262259
walk_list!(self, visit_anon_const, &v.disr_expr);
263260
for attr in &v.attrs {
264-
rustc_ast::visit::walk_attribute(self, attr);
261+
ast::visit::walk_attribute(self, attr);
265262
}
266263
}
267264
}

0 commit comments

Comments
 (0)