diff --git a/serde_codegen/src/attr.rs b/serde_codegen/src/attr.rs index 9bcf7719..4ee45270 100644 --- a/serde_codegen/src/attr.rs +++ b/serde_codegen/src/attr.rs @@ -64,6 +64,10 @@ impl<'a, 'b, T> Attr<'a, 'b, T> { fn get(self) -> Option { self.value.map(|spanned| spanned.node) } + + fn get_spanned(self) -> Option> { + self.value + } } struct BoolAttr<'a, 'b: 'a>(Attr<'a, 'b, ()>); @@ -466,25 +470,27 @@ impl FieldAttrs { fn get_ser_and_de( cx: &ExtCtxt, - attribute: &str, + attribute: &'static str, items: &[P], f: F ) -> Result<(Option>, Option>), Error> where F: Fn(&ExtCtxt, &str, &ast::Lit) -> Result, { - let mut ser_item = None; - let mut de_item = None; + let mut ser_item = Attr::none(cx, attribute); + let mut de_item = Attr::none(cx, attribute); for item in items { match item.node { ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"serialize" => { - let s = try!(f(cx, name, lit)); - ser_item = Some(respan(item.span, s)); + if let Ok(v) = f(cx, name, lit) { + ser_item.set(item.span, v); + } } ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"deserialize" => { - let s = try!(f(cx, name, lit)); - de_item = Some(respan(item.span, s)); + if let Ok(v) = f(cx, name, lit) { + de_item.set(item.span, v); + } } _ => { @@ -499,7 +505,7 @@ fn get_ser_and_de( } } - Ok((ser_item, de_item)) + Ok((ser_item.get_spanned(), de_item.get_spanned())) } fn get_renames( diff --git a/serde_macros/tests/compile-fail/duplicate_attributes.rs b/serde_macros/tests/compile-fail/duplicate_attributes.rs index 17e603b9..4c1caab2 100644 --- a/serde_macros/tests/compile-fail/duplicate_attributes.rs +++ b/serde_macros/tests/compile-fail/duplicate_attributes.rs @@ -18,6 +18,15 @@ struct S { #[serde(rename="x")] #[serde(rename(deserialize="y"))] //~ ERROR: duplicate serde attribute `rename` d: (), + + #[serde(rename(serialize="x", serialize="y"))] //~ ERROR: duplicate serde attribute `rename` + e: (), + + #[serde(rename="x", serialize="y")] //~ ERROR: unknown serde field attribute `serialize = "y"` + f: (), + + #[serde(rename(serialize="x"), rename(serialize="y"))] //~ ERROR: duplicate serde attribute `rename` + g: (), } fn main() {}