From 4fe94e0be65865bef1d0283873158baa523afddc Mon Sep 17 00:00:00 2001 From: Jeffrey Seyfried Date: Mon, 29 Aug 2016 05:04:31 +0000 Subject: Future proof the AST for `union`. --- src/libsyntax/ast.rs | 5 +++++ src/libsyntax/config.rs | 3 +++ src/libsyntax/fold.rs | 4 ++++ src/libsyntax/print/pprust.rs | 5 ++++- src/libsyntax/visit.rs | 3 ++- 5 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src/libsyntax') diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index c0994ccb2ac..fcb99444957 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1883,6 +1883,10 @@ pub enum ItemKind { /// /// E.g. `struct Foo { x: A }` Struct(VariantData, Generics), + /// A union definition (`union` or `pub union`). + /// + /// E.g. `union Foo { x: A, y: B }` + Union(VariantData, Generics), // FIXME: not yet implemented /// A Trait declaration (`trait` or `pub trait`). /// /// E.g. `trait Foo { .. }` or `trait Foo { .. }` @@ -1919,6 +1923,7 @@ impl ItemKind { ItemKind::Ty(..) => "type alias", ItemKind::Enum(..) => "enum", ItemKind::Struct(..) => "struct", + ItemKind::Union(..) => "union", ItemKind::Trait(..) => "trait", ItemKind::Mac(..) | ItemKind::Impl(..) | diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs index ff1ecd44371..69a97917652 100644 --- a/src/libsyntax/config.rs +++ b/src/libsyntax/config.rs @@ -180,6 +180,9 @@ impl<'a> fold::Folder for StripUnconfigured<'a> { ast::ItemKind::Struct(def, generics) => { ast::ItemKind::Struct(fold_struct(self, def), generics) } + ast::ItemKind::Union(def, generics) => { + ast::ItemKind::Union(fold_struct(self, def), generics) + } ast::ItemKind::Enum(def, generics) => { let variants = def.variants.into_iter().filter_map(|v| { self.configure(v).map(|v| { diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index fad0b6f65a7..7500bfe9caa 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -885,6 +885,10 @@ pub fn noop_fold_item_kind(i: ItemKind, folder: &mut T) -> ItemKind { let struct_def = folder.fold_variant_data(struct_def); ItemKind::Struct(struct_def, folder.fold_generics(generics)) } + ItemKind::Union(struct_def, generics) => { + let struct_def = folder.fold_variant_data(struct_def); + ItemKind::Union(struct_def, folder.fold_generics(generics)) + } ItemKind::DefaultImpl(unsafety, ref trait_ref) => { ItemKind::DefaultImpl(unsafety, folder.fold_trait_ref((*trait_ref).clone())) } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 99c00789219..8563d27908d 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -1251,7 +1251,10 @@ impl<'a> State<'a> { try!(self.head(&visibility_qualified(&item.vis, "struct"))); try!(self.print_struct(&struct_def, generics, item.ident, item.span, true)); } - + ast::ItemKind::Union(ref struct_def, ref generics) => { + try!(self.head(&visibility_qualified(&item.vis, "union"))); + try!(self.print_struct(&struct_def, generics, item.ident, item.span, true)); + } ast::ItemKind::DefaultImpl(unsafety, ref trait_ref) => { try!(self.head("")); try!(self.print_visibility(&item.vis)); diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index b2d47996659..efd9b027504 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -278,7 +278,8 @@ pub fn walk_item(visitor: &mut V, item: &Item) { visitor.visit_ty(typ); walk_list!(visitor, visit_impl_item, impl_items); } - ItemKind::Struct(ref struct_definition, ref generics) => { + ItemKind::Struct(ref struct_definition, ref generics) | + ItemKind::Union(ref struct_definition, ref generics) => { visitor.visit_generics(generics); visitor.visit_variant_data(struct_definition, item.ident, generics, item.id, item.span); -- cgit 1.4.1-3-g733a5