From ef9028d798e0d6e146d8435350e3ae6b7ccf57cb Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Fri, 15 Feb 2019 18:32:13 -0800 Subject: [PATCH] Remove conflict between flatten and skip --- serde_derive/src/de.rs | 2 +- serde_derive/src/internals/check.rs | 19 ------------------- test_suite/tests/test_gen.rs | 19 +++++++++++++++++++ .../ui/conflict/flatten-skip-deserializing.rs | 14 -------------- .../flatten-skip-deserializing.stderr | 9 --------- .../conflict/flatten-skip-serializing-if.rs | 14 -------------- .../flatten-skip-serializing-if.stderr | 9 --------- .../ui/conflict/flatten-skip-serializing.rs | 14 -------------- .../conflict/flatten-skip-serializing.stderr | 9 --------- 9 files changed, 20 insertions(+), 89 deletions(-) delete mode 100644 test_suite/tests/ui/conflict/flatten-skip-deserializing.rs delete mode 100644 test_suite/tests/ui/conflict/flatten-skip-deserializing.stderr delete mode 100644 test_suite/tests/ui/conflict/flatten-skip-serializing-if.rs delete mode 100644 test_suite/tests/ui/conflict/flatten-skip-serializing-if.stderr delete mode 100644 test_suite/tests/ui/conflict/flatten-skip-serializing.rs delete mode 100644 test_suite/tests/ui/conflict/flatten-skip-serializing.stderr diff --git a/serde_derive/src/de.rs b/serde_derive/src/de.rs index cff71d95..c43d1bb7 100644 --- a/serde_derive/src/de.rs +++ b/serde_derive/src/de.rs @@ -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() { diff --git a/serde_derive/src/internals/check.rs b/serde_derive/src/internals/check.rs index 71a4bd94..19d8dd87 100644 --- a/serde_derive/src/internals/check.rs +++ b/serde_derive/src/internals/check.rs @@ -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 diff --git a/test_suite/tests/test_gen.rs b/test_suite/tests/test_gen.rs index d951cc1a..788e91b8 100644 --- a/test_suite/tests/test_gen.rs +++ b/test_suite/tests/test_gen.rs @@ -665,6 +665,25 @@ fn test_gen() { ty: &'a str, id: String, } + + #[derive(Serialize, Deserialize)] + struct FlattenSkipSerializing { + #[serde(flatten, skip_serializing)] + #[allow(dead_code)] + flat: T, + } + + #[derive(Serialize, Deserialize)] + struct FlattenSkipSerializingIf { + #[serde(flatten, skip_serializing_if = "StdOption::is_none")] + flat: StdOption, + } + + #[derive(Serialize, Deserialize)] + struct FlattenSkipDeserializing { + #[serde(flatten, skip_deserializing)] + flat: T, + } } ////////////////////////////////////////////////////////////////////////// diff --git a/test_suite/tests/ui/conflict/flatten-skip-deserializing.rs b/test_suite/tests/ui/conflict/flatten-skip-deserializing.rs deleted file mode 100644 index dea009a8..00000000 --- a/test_suite/tests/ui/conflict/flatten-skip-deserializing.rs +++ /dev/null @@ -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() {} diff --git a/test_suite/tests/ui/conflict/flatten-skip-deserializing.stderr b/test_suite/tests/ui/conflict/flatten-skip-deserializing.stderr deleted file mode 100644 index f9edfde5..00000000 --- a/test_suite/tests/ui/conflict/flatten-skip-deserializing.stderr +++ /dev/null @@ -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 - diff --git a/test_suite/tests/ui/conflict/flatten-skip-serializing-if.rs b/test_suite/tests/ui/conflict/flatten-skip-serializing-if.rs deleted file mode 100644 index 3973654d..00000000 --- a/test_suite/tests/ui/conflict/flatten-skip-serializing-if.rs +++ /dev/null @@ -1,14 +0,0 @@ -use serde_derive::Serialize; - -#[derive(Serialize)] -struct Foo { - #[serde(flatten, skip_serializing_if = "Option::is_none")] - other: Option, -} - -#[derive(Serialize)] -struct Other { - x: u32, -} - -fn main() {} diff --git a/test_suite/tests/ui/conflict/flatten-skip-serializing-if.stderr b/test_suite/tests/ui/conflict/flatten-skip-serializing-if.stderr deleted file mode 100644 index bf608f3a..00000000 --- a/test_suite/tests/ui/conflict/flatten-skip-serializing-if.stderr +++ /dev/null @@ -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, - | |________________________^ - -error: aborting due to previous error - diff --git a/test_suite/tests/ui/conflict/flatten-skip-serializing.rs b/test_suite/tests/ui/conflict/flatten-skip-serializing.rs deleted file mode 100644 index 6983c16a..00000000 --- a/test_suite/tests/ui/conflict/flatten-skip-serializing.rs +++ /dev/null @@ -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() {} diff --git a/test_suite/tests/ui/conflict/flatten-skip-serializing.stderr b/test_suite/tests/ui/conflict/flatten-skip-serializing.stderr deleted file mode 100644 index cdce5d48..00000000 --- a/test_suite/tests/ui/conflict/flatten-skip-serializing.stderr +++ /dev/null @@ -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 -