Skip to content

Commit bd7b0e2

Browse files
committed
Touch up PR 2553
1 parent 7393169 commit bd7b0e2

File tree

8 files changed

+62
-66
lines changed

8 files changed

+62
-66
lines changed

serde_derive/src/internals/attr.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -400,16 +400,16 @@ impl Container {
400400
default.set(&meta.path, Default::Path(path));
401401
}
402402
syn::Fields::Unit => {
403-
let msg = "#[serde(default = \"...\")] can only be used on structs with fields";
403+
let msg = "#[serde(default = \"...\")] can only be used on structs that have fields";
404404
cx.syn_error(meta.error(msg));
405405
}
406406
},
407407
syn::Data::Enum(_) => {
408-
let msg = "#[serde(default = \"...\")] can only be used on structs with fields";
408+
let msg = "#[serde(default = \"...\")] can only be used on structs";
409409
cx.syn_error(meta.error(msg));
410410
}
411411
syn::Data::Union(_) => {
412-
let msg = "#[serde(default = \"...\")] can only be used on structs with fields";
412+
let msg = "#[serde(default = \"...\")] can only be used on structs";
413413
cx.syn_error(meta.error(msg));
414414
}
415415
}
@@ -422,16 +422,16 @@ impl Container {
422422
default.set(meta.path, Default::Default);
423423
}
424424
syn::Fields::Unit => {
425-
let msg = "#[serde(default)] can only be used on structs with fields";
425+
let msg = "#[serde(default)] can only be used on structs that have fields";
426426
cx.error_spanned_by(fields, msg);
427427
}
428428
},
429429
syn::Data::Enum(_) => {
430-
let msg = "#[serde(default)] can only be used on structs with fields";
430+
let msg = "#[serde(default)] can only be used on structs";
431431
cx.syn_error(meta.error(msg));
432432
}
433433
syn::Data::Union(_) => {
434-
let msg = "#[serde(default)] can only be used on structs with fields";
434+
let msg = "#[serde(default)] can only be used on structs";
435435
cx.syn_error(meta.error(msg));
436436
}
437437
}

serde_derive/src/internals/check.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,39 +18,37 @@ pub fn check(cx: &Ctxt, cont: &mut Container, derive: Derive) {
1818
check_from_and_try_from(cx, cont);
1919
}
2020

21-
/// If some field of tuple is marked as `#[serde(default)]` then all subsequent
22-
/// fields also should be marked with that attribute or the struct itself should
23-
/// have this attribute. This is because using default value for a field is
24-
/// possible only if the sequence is exhausted that means that all subsequent
25-
/// fields will fail to deserialize and should provide a default value if we want
26-
/// the successful deserialization.
21+
// If some field of a tuple struct is marked #[serde(default)] then all fields
22+
// after it must also be marked with that attribute, or the struct must have a
23+
// container-level serde(default) attribute. A field's default value is only
24+
// used for tuple fields if the sequence is exhausted at that point; that means
25+
// all subsequent fields will fail to deserialize if they don't have their own
26+
// default.
2727
fn check_default_on_tuple(cx: &Ctxt, cont: &Container) {
2828
if let Default::None = cont.attrs.default() {
2929
if let Data::Struct(Style::Tuple, fields) = &cont.data {
3030
let mut first_default_index = None;
3131
for (i, field) in fields.iter().enumerate() {
32-
// Skipped fields automatically get the #[serde(default)] attribute
33-
// We interested only on non-skipped fields here
32+
// Skipped fields automatically get the #[serde(default)]
33+
// attribute. We are interested only on non-skipped fields here.
3434
if field.attrs.skip_deserializing() {
3535
continue;
3636
}
3737
if let Default::None = field.attrs.default() {
3838
if let Some(first) = first_default_index {
3939
cx.error_spanned_by(
4040
field.ty,
41-
format!("struct or field must have #[serde(default)] because previous field {} have #[serde(default)]", first),
41+
format!("field must have #[serde(default)] because previous field {} has #[serde(default)]", first),
4242
);
4343
}
4444
continue;
4545
}
46-
if let None = first_default_index {
46+
if first_default_index.is_none() {
4747
first_default_index = Some(i);
4848
}
4949
}
5050
}
5151
}
52-
// TODO: Warn if container has default and all fields also marked with default
53-
// when warnings in proc-macro become available
5452
}
5553

5654
// Remote derive definition type must have either all of the generics of the

test_suite/tests/ui/default-attribute/enum.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error: #[serde(default)] can only be used on structs with fields
1+
error: #[serde(default)] can only be used on structs
22
--> tests/ui/default-attribute/enum.rs:4:9
33
|
44
4 | #[serde(default)]

test_suite/tests/ui/default-attribute/enum_path.stderr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
error: #[serde(default = "...")] can only be used on structs with fields
1+
error: #[serde(default = "...")] can only be used on structs
22
--> tests/ui/default-attribute/enum_path.rs:4:9
33
|
44
4 | #[serde(default = "default_e")]

test_suite/tests/ui/default-attribute/tuple_struct.rs

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,45 @@
11
use serde_derive::Deserialize;
22

3-
/// No errors expected
3+
// No errors expected.
44
#[derive(Deserialize)]
55
struct T0(u8, u8);
66

7-
/// No errors expected:
8-
/// - if both fields are provided, both gets value from data
9-
/// - if only one field is provided, the second gets default value
7+
// No errors expected:
8+
// - If both fields are provided, both get value from data.
9+
// - If only one field is provided, the second gets default value.
1010
#[derive(Deserialize)]
1111
struct T1(u8, #[serde(default)] u8);
1212

13-
/// Errors expected -- the first field can get default value only if sequence is
14-
/// empty, but that mean that all other fields cannot be deserialized without
15-
/// errors, so the `#[serde(default)]` attribute is superfluous
13+
// ERROR: The first field can get default value only if sequence is empty, but
14+
// that mean that all other fields cannot be deserialized without errors.
1615
#[derive(Deserialize)]
1716
struct T2(#[serde(default)] u8, u8, u8);
1817

19-
/// No errors expected:
20-
/// - if both fields are provided, both gets value from data
21-
/// - if only one field is provided, the second gets default value
22-
/// - if none fields are provided, both gets default value
18+
// No errors expected:
19+
// - If both fields are provided, both get value from data.
20+
// - If only one field is provided, the second gets default value.
21+
// - If no fields are provided, both get default value.
2322
#[derive(Deserialize)]
2423
struct T3(#[serde(default)] u8, #[serde(default)] u8);
2524

2625
////////////////////////////////////////////////////////////////////////////////
2726

28-
/// No errors expected -- missing fields gets default values
27+
// No errors expected -- missing fields get default values.
2928
#[derive(Deserialize, Default)]
3029
#[serde(default)]
3130
struct T4(u8, u8);
3231

33-
/// No errors expected -- missing fields gets default values
32+
// No errors expected -- missing fields get default values.
3433
#[derive(Deserialize, Default)]
3534
#[serde(default)]
3635
struct T5(#[serde(default)] u8, u8);
3736

38-
/// No errors expected -- missing fields gets default values
37+
// No errors expected -- missing fields get default values.
3938
#[derive(Deserialize, Default)]
4039
#[serde(default)]
4140
struct T6(u8, #[serde(default)] u8);
4241

43-
/// No errors expected -- missing fields gets default values
42+
// No errors expected -- missing fields get default values.
4443
#[derive(Deserialize, Default)]
4544
#[serde(default)]
4645
struct T7(#[serde(default)] u8, #[serde(default)] u8);
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
error: struct or field must have #[serde(default)] because previous field 0 have #[serde(default)]
2-
--> tests/ui/default-attribute/tuple_struct.rs:17:33
1+
error: field must have #[serde(default)] because previous field 0 has #[serde(default)]
2+
--> tests/ui/default-attribute/tuple_struct.rs:16:33
33
|
4-
17 | struct T2(#[serde(default)] u8, u8, u8);
4+
16 | struct T2(#[serde(default)] u8, u8, u8);
55
| ^^
66

7-
error: struct or field must have #[serde(default)] because previous field 0 have #[serde(default)]
8-
--> tests/ui/default-attribute/tuple_struct.rs:17:37
7+
error: field must have #[serde(default)] because previous field 0 has #[serde(default)]
8+
--> tests/ui/default-attribute/tuple_struct.rs:16:37
99
|
10-
17 | struct T2(#[serde(default)] u8, u8, u8);
10+
16 | struct T2(#[serde(default)] u8, u8, u8);
1111
| ^^

test_suite/tests/ui/default-attribute/tuple_struct_path.rs

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,71 @@ fn d<T>() -> T {
44
unimplemented!()
55
}
66

7-
/// No errors expected:
8-
/// - if both fields are provided, both gets value from data
9-
/// - if only one field is provided, the second gets default value
7+
// No errors expected:
8+
// - If both fields are provided, both get value from data.
9+
// - If only one field is provided, the second gets default value.
1010
#[derive(Deserialize)]
1111
struct T1(u8, #[serde(default = "d")] u8);
1212

13-
/// Errors expected -- the first field can get default value only if sequence is
14-
/// empty, but that mean that all other fields cannot be deserialized without
15-
/// errors, so the `#[serde(default)]` attribute is superfluous
13+
// ERROR: The first field can get default value only if sequence is empty, but
14+
// that mean that all other fields cannot be deserialized without errors.
1615
#[derive(Deserialize)]
1716
struct T2(#[serde(default = "d")] u8, u8, u8);
1817

19-
/// No errors expected:
20-
/// - if both fields are provided, both gets value from data
21-
/// - if only one field is provided, the second gets default value
22-
/// - if none fields are provided, both gets default value
18+
// No errors expected:
19+
// - If both fields are provided, both get value from data.
20+
// - If only one field is provided, the second gets default value.
21+
// - If no fields are provided, both get default value.
2322
#[derive(Deserialize)]
2423
struct T3(#[serde(default = "d")] u8, #[serde(default = "d")] u8);
2524

2625
////////////////////////////////////////////////////////////////////////////////
2726

28-
/// No errors expected -- missing fields gets default values
27+
// No errors expected -- missing fields get default values.
2928
#[derive(Deserialize, Default)]
3029
#[serde(default)]
3130
struct T1D(#[serde(default = "d")] u8, u8);
3231

33-
/// No errors expected -- missing fields gets default values
32+
// No errors expected -- missing fields get default values.
3433
#[derive(Deserialize, Default)]
3534
#[serde(default)]
3635
struct T2D(u8, #[serde(default = "d")] u8);
3736

38-
/// No errors expected -- missing fields gets default values
37+
// No errors expected -- missing fields get default values.
3938
#[derive(Deserialize, Default)]
4039
#[serde(default)]
4140
struct T3D(#[serde(default = "d")] u8, #[serde(default = "d")] u8);
4241

4342
////////////////////////////////////////////////////////////////////////////////
4443

45-
/// No errors expected -- missing fields gets default values
44+
// No errors expected -- missing fields get default values.
4645
#[derive(Deserialize)]
4746
#[serde(default = "d")]
4847
struct T1Path(#[serde(default)] u8, u8);
4948

50-
/// No errors expected -- missing fields gets default values
49+
// No errors expected -- missing fields get default values.
5150
#[derive(Deserialize)]
5251
#[serde(default = "d")]
5352
struct T2Path(u8, #[serde(default)] u8);
5453

55-
/// No errors expected -- missing fields gets default values
54+
// No errors expected -- missing fields get default values.
5655
#[derive(Deserialize)]
5756
#[serde(default = "d")]
5857
struct T3Path(#[serde(default)] u8, #[serde(default)] u8);
5958

6059
////////////////////////////////////////////////////////////////////////////////
6160

62-
/// No errors expected -- missing fields gets default values
61+
// No errors expected -- missing fields get default values.
6362
#[derive(Deserialize)]
6463
#[serde(default = "d")]
6564
struct T1PathD(#[serde(default = "d")] u8, u8);
6665

67-
/// No errors expected -- missing fields gets default values
66+
// No errors expected -- missing fields get default values.
6867
#[derive(Deserialize)]
6968
#[serde(default = "d")]
7069
struct T2PathD(u8, #[serde(default = "d")] u8);
7170

72-
/// No errors expected -- missing fields gets default values
71+
// No errors expected -- missing fields get default values.
7372
#[derive(Deserialize)]
7473
#[serde(default = "d")]
7574
struct T3PathD(#[serde(default = "d")] u8, #[serde(default = "d")] u8);
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
error: struct or field must have #[serde(default)] because previous field 0 have #[serde(default)]
2-
--> tests/ui/default-attribute/tuple_struct_path.rs:17:39
1+
error: field must have #[serde(default)] because previous field 0 has #[serde(default)]
2+
--> tests/ui/default-attribute/tuple_struct_path.rs:16:39
33
|
4-
17 | struct T2(#[serde(default = "d")] u8, u8, u8);
4+
16 | struct T2(#[serde(default = "d")] u8, u8, u8);
55
| ^^
66

7-
error: struct or field must have #[serde(default)] because previous field 0 have #[serde(default)]
8-
--> tests/ui/default-attribute/tuple_struct_path.rs:17:43
7+
error: field must have #[serde(default)] because previous field 0 has #[serde(default)]
8+
--> tests/ui/default-attribute/tuple_struct_path.rs:16:43
99
|
10-
17 | struct T2(#[serde(default = "d")] u8, u8, u8);
10+
16 | struct T2(#[serde(default = "d")] u8, u8, u8);
1111
| ^^

0 commit comments

Comments
 (0)