diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2015-10-01 18:47:27 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2015-10-13 15:19:15 +0300 |
| commit | ea47c2b6b349d7f252a6a734ced8204e6ef70546 (patch) | |
| tree | ded8a90ea9cac7d2899257365cec7305c130c0e5 /src/libsyntax/parse/parser.rs | |
| parent | ec4362da562a4b591a7d120c6677e14ea713481a (diff) | |
| download | rust-ea47c2b6b349d7f252a6a734ced8204e6ef70546.tar.gz rust-ea47c2b6b349d7f252a6a734ced8204e6ef70546.zip | |
Unify structures and enum variants in AST
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 35 |
1 files changed, 16 insertions, 19 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 443cea696b6..0748c898a82 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -46,11 +46,11 @@ use ast::PatWildSingle; use ast::{PolyTraitRef, QSelf}; use ast::{Return, BiShl, BiShr, Stmt, StmtDecl}; use ast::{StmtExpr, StmtSemi, StmtMac, StructDef, StructField}; -use ast::{StructVariantKind, BiSub, StrStyle}; +use ast::{BiSub, StrStyle}; use ast::{SelfExplicit, SelfRegion, SelfStatic, SelfValue}; use ast::{Delimited, SequenceRepetition, TokenTree, TraitItem, TraitRef}; use ast::{TtDelimited, TtSequence, TtToken}; -use ast::{TupleVariantKind, Ty, Ty_, TypeBinding}; +use ast::{Ty, Ty_, TypeBinding}; use ast::{TyMac}; use ast::{TyFixedLengthVec, TyBareFn, TyTypeof, TyInfer}; use ast::{TyParam, TyParamBound, TyParen, TyPath, TyPolyTraitRef, TyPtr}; @@ -5131,22 +5131,13 @@ impl<'a> Parser<'a> { let variant_attrs = self.parse_outer_attributes(); let vlo = self.span.lo; - let kind; - let mut args = Vec::new(); + let struct_def; let mut disr_expr = None; let ident = try!(self.parse_ident()); if try!(self.eat(&token::OpenDelim(token::Brace)) ){ // Parse a struct variant. all_nullary = false; - let start_span = self.span; - let struct_def = try!(self.parse_struct_def()); - if struct_def.fields.is_empty() { - self.span_err(start_span, - &format!("unit-like struct variant should be written \ - without braces, as `{},`", - ident)); - } - kind = StructVariantKind(struct_def); + struct_def = try!(self.parse_struct_def()); } else if self.check(&token::OpenDelim(token::Paren)) { all_nullary = false; let arg_tys = try!(self.parse_enum_variant_seq( @@ -5155,25 +5146,31 @@ impl<'a> Parser<'a> { seq_sep_trailing_allowed(token::Comma), |p| p.parse_ty_sum() )); + let mut fields = Vec::new(); for ty in arg_tys { - args.push(ast::VariantArg { + fields.push(Spanned { span: ty.span, node: ast::StructField_ { ty: ty, + kind: ast::UnnamedField(ast::Inherited), + attrs: Vec::new(), id: ast::DUMMY_NODE_ID, - }); + }}); } - kind = TupleVariantKind(args); + struct_def = P(StructDef { fields: fields, + ctor_id: Some(ast::DUMMY_NODE_ID) }); } else if try!(self.eat(&token::Eq) ){ disr_expr = Some(try!(self.parse_expr_nopanic())); any_disr = disr_expr.as_ref().map(|expr| expr.span); - kind = TupleVariantKind(args); + struct_def = P(StructDef { fields: Vec::new(), + ctor_id: Some(ast::DUMMY_NODE_ID) }); } else { - kind = TupleVariantKind(Vec::new()); + struct_def = P(StructDef { fields: Vec::new(), + ctor_id: Some(ast::DUMMY_NODE_ID) }); } let vr = ast::Variant_ { name: ident, attrs: variant_attrs, - kind: kind, + def: struct_def, id: ast::DUMMY_NODE_ID, disr_expr: disr_expr, }; |
