Merge pull request #210 from erickt/v0.6.x

feat(errors): Don't panic if annotating a non-struct/enum
This commit is contained in:
Erick Tryzelaar 2016-01-16 15:06:07 -08:00
commit fbcf905c9f
2 changed files with 40 additions and 14 deletions

View File

@ -29,7 +29,7 @@ pub fn expand_derive_deserialize(
_ => { _ => {
cx.span_err( cx.span_err(
meta_item.span, meta_item.span,
"`derive` may only be applied to structs and enums"); "`#[derive(Deserialize)]` may only be applied to structs and enums");
return; return;
} }
}; };
@ -39,7 +39,12 @@ pub fn expand_derive_deserialize(
let generics = match item.node { let generics = match item.node {
ast::ItemStruct(_, ref generics) => generics, ast::ItemStruct(_, ref generics) => generics,
ast::ItemEnum(_, ref generics) => generics, ast::ItemEnum(_, ref generics) => generics,
_ => cx.bug("expected ItemStruct or ItemEnum in #[derive(Deserialize)]") _ => {
cx.span_err(
meta_item.span,
"`#[derive(Deserialize)]` may only be applied to structs and enums");
return;
}
}; };
let impl_generics = builder.from_generics(generics.clone()) let impl_generics = builder.from_generics(generics.clone())
@ -90,6 +95,7 @@ fn deserialize_body(
item, item,
impl_generics, impl_generics,
ty, ty,
item.span,
variant_data, variant_data,
) )
} }
@ -103,7 +109,10 @@ fn deserialize_body(
enum_def, enum_def,
) )
} }
_ => cx.bug("expected ItemStruct or ItemEnum in #[derive(Deserialize)]") _ => {
cx.span_bug(item.span,
"expected ItemStruct or ItemEnum in #[derive(Deserialize)]")
}
} }
} }
@ -113,6 +122,7 @@ fn deserialize_item_struct(
item: &Item, item: &Item,
impl_generics: &ast::Generics, impl_generics: &ast::Generics,
ty: P<ast::Ty>, ty: P<ast::Ty>,
span: Span,
variant_data: &ast::VariantData, variant_data: &ast::VariantData,
) -> P<ast::Expr> { ) -> P<ast::Expr> {
match *variant_data { match *variant_data {
@ -134,7 +144,7 @@ fn deserialize_item_struct(
} }
ast::VariantData::Tuple(ref fields, _) => { ast::VariantData::Tuple(ref fields, _) => {
if fields.iter().any(|field| !field.node.kind.is_unnamed()) { if fields.iter().any(|field| !field.node.kind.is_unnamed()) {
cx.bug("tuple struct has named fields") cx.span_bug(span, "tuple struct has named fields")
} }
deserialize_tuple_struct( deserialize_tuple_struct(
@ -148,7 +158,7 @@ fn deserialize_item_struct(
} }
ast::VariantData::Struct(ref fields, _) => { ast::VariantData::Struct(ref fields, _) => {
if fields.iter().any(|field| field.node.kind.is_unnamed()) { if fields.iter().any(|field| field.node.kind.is_unnamed()) {
cx.bug("struct has unnamed fields") cx.span_bug(span, "struct has unnamed fields")
} }
deserialize_struct( deserialize_struct(
@ -437,7 +447,9 @@ fn deserialize_struct_as_seq(
( (
match field.node.kind { match field.node.kind {
ast::NamedField(name, _) => name.clone(), ast::NamedField(name, _) => name.clone(),
ast::UnnamedField(_) => cx.bug("struct contains unnamed fields"), ast::UnnamedField(_) => {
cx.span_bug(field.span, "struct contains unnamed fields")
}
}, },
builder.expr().id(format!("__field{}", i)), builder.expr().id(format!("__field{}", i)),
) )
@ -940,7 +952,9 @@ fn deserialize_struct_visitor(
.map(|field| { .map(|field| {
match field.node.kind { match field.node.kind {
ast::NamedField(name, _) => builder.expr().str(name), ast::NamedField(name, _) => builder.expr().str(name),
ast::UnnamedField(_) => panic!("struct contains unnamed fields"), ast::UnnamedField(_) => {
cx.span_bug(field.span, "struct contains unnamed fields")
}
} }
}) })
) )
@ -1024,7 +1038,9 @@ fn deserialize_map(
( (
match field.node.kind { match field.node.kind {
ast::NamedField(name, _) => name.clone(), ast::NamedField(name, _) => name.clone(),
ast::UnnamedField(_) => panic!("struct contains unnamed fields"), ast::UnnamedField(_) => {
cx.span_bug(field.span, "struct contains unnamed fields")
}
}, },
builder.expr().id(field_name), builder.expr().id(field_name),
) )

View File

@ -25,7 +25,7 @@ pub fn expand_derive_serialize(
_ => { _ => {
cx.span_err( cx.span_err(
meta_item.span, meta_item.span,
"`derive` may only be applied to structs and enums"); "`#[derive(Serialize)]` may only be applied to structs and enums");
return; return;
} }
}; };
@ -35,7 +35,12 @@ pub fn expand_derive_serialize(
let generics = match item.node { let generics = match item.node {
ast::ItemStruct(_, ref generics) => generics, ast::ItemStruct(_, ref generics) => generics,
ast::ItemEnum(_, ref generics) => generics, ast::ItemEnum(_, ref generics) => generics,
_ => cx.bug("expected ItemStruct or ItemEnum in #[derive(Serialize)]") _ => {
cx.span_err(
meta_item.span,
"`#[derive(Serialize)]` may only be applied to structs and enums");
return;
}
}; };
let impl_generics = builder.from_generics(generics.clone()) let impl_generics = builder.from_generics(generics.clone())
@ -86,6 +91,7 @@ fn serialize_body(
item, item,
impl_generics, impl_generics,
ty, ty,
item.span,
variant_data, variant_data,
) )
} }
@ -99,7 +105,10 @@ fn serialize_body(
enum_def, enum_def,
) )
} }
_ => cx.bug("expected ItemStruct or ItemEnum in #[derive(Serialize)]") _ => {
cx.span_bug(item.span,
"expected ItemStruct or ItemEnum in #[derive(Serialize)]")
}
} }
} }
@ -109,6 +118,7 @@ fn serialize_item_struct(
item: &Item, item: &Item,
impl_generics: &ast::Generics, impl_generics: &ast::Generics,
ty: P<ast::Ty>, ty: P<ast::Ty>,
span: Span,
variant_data: &ast::VariantData, variant_data: &ast::VariantData,
) -> P<ast::Expr> { ) -> P<ast::Expr> {
match *variant_data { match *variant_data {
@ -128,7 +138,7 @@ fn serialize_item_struct(
} }
ast::VariantData::Tuple(ref fields, _) => { ast::VariantData::Tuple(ref fields, _) => {
if fields.iter().any(|field| !field.node.kind.is_unnamed()) { if fields.iter().any(|field| !field.node.kind.is_unnamed()) {
cx.bug("tuple struct has named fields") cx.span_bug(span, "tuple struct has named fields")
} }
serialize_tuple_struct( serialize_tuple_struct(
@ -142,7 +152,7 @@ fn serialize_item_struct(
} }
ast::VariantData::Struct(ref fields, _) => { ast::VariantData::Struct(ref fields, _) => {
if fields.iter().any(|field| field.node.kind.is_unnamed()) { if fields.iter().any(|field| field.node.kind.is_unnamed()) {
cx.bug("struct has unnamed fields") cx.span_bug(span, "struct has unnamed fields")
} }
serialize_struct( serialize_struct(
@ -367,7 +377,7 @@ fn serialize_variant(
let name = match field.node.kind { let name = match field.node.kind {
ast::NamedField(name, _) => name, ast::NamedField(name, _) => name,
ast::UnnamedField(_) => { ast::UnnamedField(_) => {
cx.bug("struct variant has unnamed fields") cx.span_bug(field.span, "struct variant has unnamed fields")
} }
}; };