chore(codegen): Clean up error handling

This commit is contained in:
Erick Tryzelaar
2016-02-05 18:11:58 -08:00
parent 8c8fcdbc54
commit a926cb62f0
6 changed files with 75 additions and 73 deletions
+15 -14
View File
@@ -11,7 +11,8 @@ use syntax::ext::base::{Annotatable, ExtCtxt};
use syntax::ext::build::AstBuilder;
use syntax::ptr::P;
use field;
use attr;
use error::Error;
pub fn expand_derive_serialize(
cx: &mut ExtCtxt,
@@ -55,7 +56,7 @@ pub fn expand_derive_serialize(
let body = match serialize_body(cx, &builder, &item, &impl_generics, ty.clone()) {
Ok(body) => body,
Err(()) => {
Err(Error) => {
// An error occured, but it should have been reported already.
return;
}
@@ -82,10 +83,10 @@ fn serialize_body(
item: &Item,
impl_generics: &ast::Generics,
ty: P<ast::Ty>,
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
// Note: While we don't have any container attributes, we still want to try to
// parse them so we can report a proper error if we get passed an unknown attribute.
let _ = try!(field::container_attrs(cx, item));
let _ = try!(attr::get_container_attrs(cx, item));
match item.node {
ast::ItemStruct(ref variant_data, _) => {
@@ -124,7 +125,7 @@ fn serialize_item_struct(
ty: P<ast::Ty>,
span: Span,
variant_data: &ast::VariantData,
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
match *variant_data {
ast::VariantData::Unit(_) => {
serialize_unit_struct(
@@ -175,7 +176,7 @@ fn serialize_unit_struct(
cx: &ExtCtxt,
builder: &aster::AstBuilder,
type_ident: Ident
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
let type_name = builder.expr().str(type_ident);
Ok(quote_expr!(cx,
@@ -187,7 +188,7 @@ fn serialize_newtype_struct(
cx: &ExtCtxt,
builder: &aster::AstBuilder,
type_ident: Ident
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
let type_name = builder.expr().str(type_ident);
Ok(quote_expr!(cx,
@@ -202,7 +203,7 @@ fn serialize_tuple_struct(
impl_generics: &ast::Generics,
ty: P<ast::Ty>,
fields: usize,
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
let (visitor_struct, visitor_impl) = serialize_tuple_struct_visitor(
cx,
builder,
@@ -235,7 +236,7 @@ fn serialize_struct(
impl_generics: &ast::Generics,
ty: P<ast::Ty>,
fields: &[ast::StructField],
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
let value_exprs = fields.iter().map(|field| {
let name = field.node.ident().expect("struct has unnamed field");
quote_expr!(cx, &self.value.$name)
@@ -274,7 +275,7 @@ fn serialize_item_enum(
impl_generics: &ast::Generics,
ty: P<ast::Ty>,
enum_def: &ast::EnumDef,
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
let mut arms = vec![];
for (variant_index, variant) in enum_def.variants.iter().enumerate() {
@@ -306,7 +307,7 @@ fn serialize_variant(
ty: P<ast::Ty>,
variant: &ast::Variant,
variant_index: usize,
) -> Result<ast::Arm, ()> {
) -> Result<ast::Arm, Error> {
let type_name = builder.expr().str(type_ident);
let variant_ident = variant.node.name;
let variant_name = builder.expr().str(variant_ident);
@@ -479,7 +480,7 @@ fn serialize_struct_variant(
structure_ty: P<ast::Ty>,
fields: &[ast::StructField],
field_names: Vec<Ident>,
) -> Result<P<ast::Expr>, ()> {
) -> Result<P<ast::Expr>, Error> {
let value_ty = builder.ty().tuple()
.with_tys(
fields.iter().map(|field| {
@@ -599,12 +600,12 @@ fn serialize_struct_visitor<I>(
fields: &[ast::StructField],
generics: &ast::Generics,
value_exprs: I,
) -> Result<(P<ast::Item>, P<ast::Item>), ()>
) -> Result<(P<ast::Item>, P<ast::Item>), Error>
where I: Iterator<Item=P<ast::Expr>>,
{
let value_exprs = value_exprs.collect::<Vec<_>>();
let field_attrs = try!(field::struct_field_attrs(cx, builder, fields));
let field_attrs = try!(attr::get_struct_field_attrs(cx, builder, fields));
let arms: Vec<ast::Arm> = field_attrs.iter()
.zip(value_exprs.iter())