mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-23 16:31:05 +00:00
Test duplicates within a single attribute
This commit is contained in:
@@ -64,6 +64,10 @@ impl<'a, 'b, T> Attr<'a, 'b, T> {
|
|||||||
fn get(self) -> Option<T> {
|
fn get(self) -> Option<T> {
|
||||||
self.value.map(|spanned| spanned.node)
|
self.value.map(|spanned| spanned.node)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_spanned(self) -> Option<Spanned<T>> {
|
||||||
|
self.value
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct BoolAttr<'a, 'b: 'a>(Attr<'a, 'b, ()>);
|
struct BoolAttr<'a, 'b: 'a>(Attr<'a, 'b, ()>);
|
||||||
@@ -466,25 +470,27 @@ impl FieldAttrs {
|
|||||||
|
|
||||||
fn get_ser_and_de<T, F>(
|
fn get_ser_and_de<T, F>(
|
||||||
cx: &ExtCtxt,
|
cx: &ExtCtxt,
|
||||||
attribute: &str,
|
attribute: &'static str,
|
||||||
items: &[P<ast::MetaItem>],
|
items: &[P<ast::MetaItem>],
|
||||||
f: F
|
f: F
|
||||||
) -> Result<(Option<Spanned<T>>, Option<Spanned<T>>), Error>
|
) -> Result<(Option<Spanned<T>>, Option<Spanned<T>>), Error>
|
||||||
where F: Fn(&ExtCtxt, &str, &ast::Lit) -> Result<T, Error>,
|
where F: Fn(&ExtCtxt, &str, &ast::Lit) -> Result<T, Error>,
|
||||||
{
|
{
|
||||||
let mut ser_item = None;
|
let mut ser_item = Attr::none(cx, attribute);
|
||||||
let mut de_item = None;
|
let mut de_item = Attr::none(cx, attribute);
|
||||||
|
|
||||||
for item in items {
|
for item in items {
|
||||||
match item.node {
|
match item.node {
|
||||||
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"serialize" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"serialize" => {
|
||||||
let s = try!(f(cx, name, lit));
|
if let Ok(v) = f(cx, name, lit) {
|
||||||
ser_item = Some(respan(item.span, s));
|
ser_item.set(item.span, v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"deserialize" => {
|
ast::MetaItemKind::NameValue(ref name, ref lit) if name == &"deserialize" => {
|
||||||
let s = try!(f(cx, name, lit));
|
if let Ok(v) = f(cx, name, lit) {
|
||||||
de_item = Some(respan(item.span, s));
|
de_item.set(item.span, v);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_ => {
|
_ => {
|
||||||
@@ -499,7 +505,7 @@ fn get_ser_and_de<T, F>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok((ser_item, de_item))
|
Ok((ser_item.get_spanned(), de_item.get_spanned()))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_renames(
|
fn get_renames(
|
||||||
|
|||||||
@@ -18,6 +18,15 @@ struct S {
|
|||||||
#[serde(rename="x")]
|
#[serde(rename="x")]
|
||||||
#[serde(rename(deserialize="y"))] //~ ERROR: duplicate serde attribute `rename`
|
#[serde(rename(deserialize="y"))] //~ ERROR: duplicate serde attribute `rename`
|
||||||
d: (),
|
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() {}
|
fn main() {}
|
||||||
|
|||||||
Reference in New Issue
Block a user