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/ext | |
| parent | ec4362da562a4b591a7d120c6677e14ea713481a (diff) | |
| download | rust-ea47c2b6b349d7f252a6a734ced8204e6ef70546.tar.gz rust-ea47c2b6b349d7f252a6a734ced8204e6ef70546.zip | |
Unify structures and enum variants in AST
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/build.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/generic/mod.rs | 50 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/primitive.rs | 60 |
3 files changed, 37 insertions, 84 deletions
diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index efea85f9162..d448eb63204 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -993,15 +993,20 @@ impl<'a> AstBuilder for ExtCtxt<'a> { } fn variant(&self, span: Span, name: Ident, tys: Vec<P<ast::Ty>> ) -> ast::Variant { - let args = tys.into_iter().map(|ty| { - ast::VariantArg { ty: ty, id: ast::DUMMY_NODE_ID } + let fields = tys.into_iter().map(|ty| { + Spanned { span: ty.span, node: ast::StructField_ { + ty: ty, + kind: ast::UnnamedField(ast::Inherited), + attrs: Vec::new(), + id: ast::DUMMY_NODE_ID, + }} }).collect(); respan(span, ast::Variant_ { name: name, attrs: Vec::new(), - kind: ast::TupleVariantKind(args), + def: P(ast::StructDef { fields: fields, ctor_id: Some(ast::DUMMY_NODE_ID) }), id: ast::DUMMY_NODE_ID, disr_expr: None, }) diff --git a/src/libsyntax/ext/deriving/generic/mod.rs b/src/libsyntax/ext/deriving/generic/mod.rs index 9fc2745cf92..f6ea6aef108 100644 --- a/src/libsyntax/ext/deriving/generic/mod.rs +++ b/src/libsyntax/ext/deriving/generic/mod.rs @@ -700,16 +700,8 @@ impl<'a> TraitDef<'a> { let mut field_tys = Vec::new(); for variant in &enum_def.variants { - match variant.node.kind { - ast::VariantKind::TupleVariantKind(ref args) => { - field_tys.extend(args.iter() - .map(|arg| arg.ty.clone())); - } - ast::VariantKind::StructVariantKind(ref args) => { - field_tys.extend(args.fields.iter() - .map(|field| field.node.ty.clone())); - } - } + field_tys.extend(variant.node.def.fields.iter() + .map(|field| field.node.ty.clone())); } let methods = self.methods.iter().map(|method_def| { @@ -1413,14 +1405,7 @@ impl<'a> MethodDef<'a> { -> P<Expr> { let summary = enum_def.variants.iter().map(|v| { let ident = v.node.name; - let summary = match v.node.kind { - ast::TupleVariantKind(ref args) => { - Unnamed(args.iter().map(|va| trait_.set_expn_info(cx, va.ty.span)).collect()) - } - ast::StructVariantKind(ref struct_def) => { - trait_.summarise_struct(cx, &**struct_def) - } - }; + let summary = trait_.summarise_struct(cx, &v.node.def); (ident, v.span, summary) }).collect(); self.call_substructure_method(cx, trait_, type_ident, @@ -1560,34 +1545,7 @@ impl<'a> TraitDef<'a> { -> (P<ast::Pat>, Vec<(Span, Option<Ident>, P<Expr>, &'a [ast::Attribute])>) { let variant_ident = variant.node.name; let variant_path = cx.path(variant.span, vec![enum_ident, variant_ident]); - match variant.node.kind { - ast::TupleVariantKind(ref variant_args) => { - if variant_args.is_empty() { - return (cx.pat_enum(variant.span, variant_path, vec![]), vec![]); - } - - let mut paths = Vec::new(); - let mut ident_expr: Vec<(_, _, _, &'a [ast::Attribute])> = Vec::new(); - for (i, va) in variant_args.iter().enumerate() { - let sp = self.set_expn_info(cx, va.ty.span); - let ident = cx.ident_of(&format!("{}_{}", prefix, i)); - let path1 = codemap::Spanned{span: sp, node: ident}; - paths.push(path1); - let expr_path = cx.expr_path(cx.path_ident(sp, ident)); - let val = cx.expr(sp, ast::ExprParen(cx.expr_deref(sp, expr_path))); - ident_expr.push((sp, None, val, &[])); - } - - let subpats = self.create_subpatterns(cx, paths, mutbl); - - (cx.pat_enum(variant.span, variant_path, subpats), - ident_expr) - } - ast::StructVariantKind(ref struct_def) => { - self.create_struct_pattern(cx, variant_path, &**struct_def, - prefix, mutbl) - } - } + self.create_struct_pattern(cx, variant_path, &variant.node.def, prefix, mutbl) } } diff --git a/src/libsyntax/ext/deriving/primitive.rs b/src/libsyntax/ext/deriving/primitive.rs index 5d3cc50557c..2fdaa9b7550 100644 --- a/src/libsyntax/ext/deriving/primitive.rs +++ b/src/libsyntax/ext/deriving/primitive.rs @@ -94,45 +94,35 @@ fn cs_from(name: &str, cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure let mut arms = Vec::new(); for variant in &enum_def.variants { - match variant.node.kind { - ast::TupleVariantKind(ref args) => { - if !args.is_empty() { - cx.span_err(trait_span, - "`FromPrimitive` cannot be derived for \ - enum variants with arguments"); - return cx.expr_fail(trait_span, - InternedString::new("")); - } - let span = variant.span; + let def = &variant.node.def; + if def.ctor_id.is_none() || !def.fields.is_empty() { + cx.span_err(trait_span, "`FromPrimitive` cannot be derived \ + for enums with non-unit variants"); + return cx.expr_fail(trait_span, + InternedString::new("")); + } - // expr for `$n == $variant as $name` - let path = cx.path(span, vec![substr.type_ident, variant.node.name]); - let variant = cx.expr_path(path); - let ty = cx.ty_ident(span, cx.ident_of(name)); - let cast = cx.expr_cast(span, variant.clone(), ty); - let guard = cx.expr_binary(span, ast::BiEq, n.clone(), cast); + let span = variant.span; - // expr for `Some($variant)` - let body = cx.expr_some(span, variant); + // expr for `$n == $variant as $name` + let path = cx.path(span, vec![substr.type_ident, variant.node.name]); + let variant = cx.expr_path(path); + let ty = cx.ty_ident(span, cx.ident_of(name)); + let cast = cx.expr_cast(span, variant.clone(), ty); + let guard = cx.expr_binary(span, ast::BiEq, n.clone(), cast); - // arm for `_ if $guard => $body` - let arm = ast::Arm { - attrs: vec!(), - pats: vec!(cx.pat_wild(span)), - guard: Some(guard), - body: body, - }; + // expr for `Some($variant)` + let body = cx.expr_some(span, variant); - arms.push(arm); - } - ast::StructVariantKind(_) => { - cx.span_err(trait_span, - "`FromPrimitive` cannot be derived for enums \ - with struct variants"); - return cx.expr_fail(trait_span, - InternedString::new("")); - } - } + // arm for `_ if $guard => $body` + let arm = ast::Arm { + attrs: vec!(), + pats: vec!(cx.pat_wild(span)), + guard: Some(guard), + body: body, + }; + + arms.push(arm); } // arm for `_ => None` |
