Remove conflict between flatten and skip

This commit is contained in:
David Tolnay 2019-02-15 18:32:13 -08:00
parent 1668cd19d3
commit ef9028d798
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
9 changed files with 20 additions and 89 deletions

View File

@ -2456,7 +2456,7 @@ fn deserialize_map(
let extract_collected = fields_names
.iter()
.filter(|&&(field, _)| field.attrs.flatten())
.filter(|&&(field, _)| field.attrs.flatten() && !field.attrs.skip_deserializing())
.map(|&(field, ref name)| {
let field_ty = field.ty;
let func = match field.attrs.deserialize_with() {

View File

@ -76,25 +76,6 @@ fn check_flatten_field(cx: &Ctxt, style: Style, field: &Field) {
}
_ => {}
}
if field.attrs.skip_serializing() {
cx.error_spanned_by(
field.original,
"#[serde(flatten)] can not be combined with \
#[serde(skip_serializing)]",
);
} else if field.attrs.skip_serializing_if().is_some() {
cx.error_spanned_by(
field.original,
"#[serde(flatten)] can not be combined with \
#[serde(skip_serializing_if = \"...\")]",
);
} else if field.attrs.skip_deserializing() {
cx.error_spanned_by(
field.original,
"#[serde(flatten)] can not be combined with \
#[serde(skip_deserializing)]",
);
}
}
/// The `other` attribute must be used at most once and it must be the last

View File

@ -665,6 +665,25 @@ fn test_gen() {
ty: &'a str,
id: String,
}
#[derive(Serialize, Deserialize)]
struct FlattenSkipSerializing<T> {
#[serde(flatten, skip_serializing)]
#[allow(dead_code)]
flat: T,
}
#[derive(Serialize, Deserialize)]
struct FlattenSkipSerializingIf<T> {
#[serde(flatten, skip_serializing_if = "StdOption::is_none")]
flat: StdOption<T>,
}
#[derive(Serialize, Deserialize)]
struct FlattenSkipDeserializing<T> {
#[serde(flatten, skip_deserializing)]
flat: T,
}
}
//////////////////////////////////////////////////////////////////////////

View File

@ -1,14 +0,0 @@
use serde_derive::Deserialize;
#[derive(Deserialize)]
struct Foo {
#[serde(flatten, skip_deserializing)]
other: Other,
}
#[derive(Deserialize)]
struct Other {
x: u32,
}
fn main() {}

View File

@ -1,9 +0,0 @@
error: #[serde(flatten)] can not be combined with #[serde(skip_deserializing)]
--> $DIR/flatten-skip-deserializing.rs:5:5
|
5 | / #[serde(flatten, skip_deserializing)]
6 | | other: Other,
| |________________^
error: aborting due to previous error

View File

@ -1,14 +0,0 @@
use serde_derive::Serialize;
#[derive(Serialize)]
struct Foo {
#[serde(flatten, skip_serializing_if = "Option::is_none")]
other: Option<Other>,
}
#[derive(Serialize)]
struct Other {
x: u32,
}
fn main() {}

View File

@ -1,9 +0,0 @@
error: #[serde(flatten)] can not be combined with #[serde(skip_serializing_if = "...")]
--> $DIR/flatten-skip-serializing-if.rs:5:5
|
5 | / #[serde(flatten, skip_serializing_if = "Option::is_none")]
6 | | other: Option<Other>,
| |________________________^
error: aborting due to previous error

View File

@ -1,14 +0,0 @@
use serde_derive::Serialize;
#[derive(Serialize)]
struct Foo {
#[serde(flatten, skip_serializing)]
other: Other,
}
#[derive(Serialize)]
struct Other {
x: u32,
}
fn main() {}

View File

@ -1,9 +0,0 @@
error: #[serde(flatten)] can not be combined with #[serde(skip_serializing)]
--> $DIR/flatten-skip-serializing.rs:5:5
|
5 | / #[serde(flatten, skip_serializing)]
6 | | other: Other,
| |________________^
error: aborting due to previous error