Skip to content

Commit 3415619

Browse files
authored
Merge pull request #2566 from Mingun/variant-aliases
Show variant aliases in error message
2 parents 04bb76b + 8b769fc commit 3415619

File tree

2 files changed

+19
-45
lines changed

2 files changed

+19
-45
lines changed

serde_derive/src/de.rs

Lines changed: 18 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -972,13 +972,7 @@ fn deserialize_struct(
972972
// Skip fields that shouldn't be deserialized or that were flattened,
973973
// so they don't appear in the storage in their literal form
974974
.filter(|&(_, field)| !field.attrs.skip_deserializing() && !field.attrs.flatten())
975-
.map(|(i, field)| {
976-
(
977-
field.attrs.name().deserialize_name(),
978-
field_i(i),
979-
field.attrs.aliases(),
980-
)
981-
})
975+
.map(|(i, field)| (field_i(i), field.attrs.aliases()))
982976
.collect();
983977

984978
let has_flatten = has_flatten(fields);
@@ -1038,9 +1032,7 @@ fn deserialize_struct(
10381032
let fields_stmt = if has_flatten {
10391033
None
10401034
} else {
1041-
let field_names = field_names_idents
1042-
.iter()
1043-
.flat_map(|&(_, _, aliases)| aliases);
1035+
let field_names = field_names_idents.iter().flat_map(|&(_, aliases)| aliases);
10441036

10451037
Some(quote! {
10461038
#[doc(hidden)]
@@ -1137,13 +1129,7 @@ fn deserialize_struct_in_place(
11371129
.iter()
11381130
.enumerate()
11391131
.filter(|&(_, field)| !field.attrs.skip_deserializing())
1140-
.map(|(i, field)| {
1141-
(
1142-
field.attrs.name().deserialize_name(),
1143-
field_i(i),
1144-
field.attrs.aliases(),
1145-
)
1146-
})
1132+
.map(|(i, field)| (field_i(i), field.attrs.aliases()))
11471133
.collect();
11481134

11491135
let field_visitor = deserialize_field_identifier(&field_names_idents, cattrs, false);
@@ -1155,9 +1141,7 @@ fn deserialize_struct_in_place(
11551141
};
11561142
let visit_seq = Stmts(deserialize_seq_in_place(params, fields, cattrs, expecting));
11571143
let visit_map = Stmts(deserialize_map_in_place(params, fields, cattrs));
1158-
let field_names = field_names_idents
1159-
.iter()
1160-
.flat_map(|&(_, _, aliases)| aliases);
1144+
let field_names = field_names_idents.iter().flat_map(|&(_, aliases)| aliases);
11611145
let type_name = cattrs.name().deserialize_name();
11621146

11631147
let in_place_impl_generics = de_impl_generics.in_place();
@@ -1248,24 +1232,20 @@ fn prepare_enum_variant_enum(variants: &[Variant]) -> (TokenStream, Stmts) {
12481232

12491233
let variant_names_idents: Vec<_> = deserialized_variants
12501234
.clone()
1251-
.map(|(i, variant)| {
1252-
(
1253-
variant.attrs.name().deserialize_name(),
1254-
field_i(i),
1255-
variant.attrs.aliases(),
1256-
)
1257-
})
1235+
.map(|(i, variant)| (field_i(i), variant.attrs.aliases()))
12581236
.collect();
12591237

12601238
let fallthrough = deserialized_variants
12611239
.position(|(_, variant)| variant.attrs.other())
12621240
.map(|other_idx| {
1263-
let ignore_variant = variant_names_idents[other_idx].1.clone();
1241+
let ignore_variant = variant_names_idents[other_idx].0.clone();
12641242
quote!(_serde::__private::Ok(__Field::#ignore_variant))
12651243
});
12661244

12671245
let variants_stmt = {
1268-
let variant_names = variant_names_idents.iter().map(|(name, _, _)| name);
1246+
let variant_names = variant_names_idents
1247+
.iter()
1248+
.flat_map(|&(_, aliases)| aliases);
12691249
quote! {
12701250
#[doc(hidden)]
12711251
const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
@@ -2011,14 +1991,14 @@ fn deserialize_untagged_newtype_variant(
20111991
}
20121992

20131993
fn deserialize_generated_identifier(
2014-
fields: &[(&str, Ident, &BTreeSet<String>)],
1994+
fields: &[(Ident, &BTreeSet<String>)],
20151995
has_flatten: bool,
20161996
is_variant: bool,
20171997
ignore_variant: Option<TokenStream>,
20181998
fallthrough: Option<TokenStream>,
20191999
) -> Fragment {
20202000
let this_value = quote!(__Field);
2021-
let field_idents: &Vec<_> = &fields.iter().map(|(_, ident, _)| ident).collect();
2001+
let field_idents: &Vec<_> = &fields.iter().map(|(ident, _)| ident).collect();
20222002

20232003
let visitor_impl = Stmts(deserialize_identifier(
20242004
&this_value,
@@ -2068,7 +2048,7 @@ fn deserialize_generated_identifier(
20682048
/// Generates enum and its `Deserialize` implementation that represents each
20692049
/// non-skipped field of the struct
20702050
fn deserialize_field_identifier(
2071-
fields: &[(&str, Ident, &BTreeSet<String>)],
2051+
fields: &[(Ident, &BTreeSet<String>)],
20722052
cattrs: &attr::Container,
20732053
has_flatten: bool,
20742054
) -> Stmts {
@@ -2145,16 +2125,10 @@ fn deserialize_custom_identifier(
21452125

21462126
let names_idents: Vec<_> = ordinary
21472127
.iter()
2148-
.map(|variant| {
2149-
(
2150-
variant.attrs.name().deserialize_name(),
2151-
variant.ident.clone(),
2152-
variant.attrs.aliases(),
2153-
)
2154-
})
2128+
.map(|variant| (variant.ident.clone(), variant.attrs.aliases()))
21552129
.collect();
21562130

2157-
let names = names_idents.iter().flat_map(|&(_, _, aliases)| aliases);
2131+
let names = names_idents.iter().flat_map(|&(_, aliases)| aliases);
21582132

21592133
let names_const = if fallthrough.is_some() {
21602134
None
@@ -2210,18 +2184,18 @@ fn deserialize_custom_identifier(
22102184

22112185
fn deserialize_identifier(
22122186
this_value: &TokenStream,
2213-
fields: &[(&str, Ident, &BTreeSet<String>)],
2187+
fields: &[(Ident, &BTreeSet<String>)],
22142188
is_variant: bool,
22152189
fallthrough: Option<TokenStream>,
22162190
fallthrough_borrowed: Option<TokenStream>,
22172191
collect_other_fields: bool,
22182192
expecting: Option<&str>,
22192193
) -> Fragment {
2220-
let str_mapping = fields.iter().map(|(_, ident, aliases)| {
2194+
let str_mapping = fields.iter().map(|(ident, aliases)| {
22212195
// `aliases` also contains a main name
22222196
quote!(#(#aliases)|* => _serde::__private::Ok(#this_value::#ident))
22232197
});
2224-
let bytes_mapping = fields.iter().map(|(_, ident, aliases)| {
2198+
let bytes_mapping = fields.iter().map(|(ident, aliases)| {
22252199
// `aliases` also contains a main name
22262200
let aliases = aliases
22272201
.iter()
@@ -2376,7 +2350,7 @@ fn deserialize_identifier(
23762350
}
23772351
}
23782352
} else {
2379-
let u64_mapping = fields.iter().enumerate().map(|(i, (_, ident, _))| {
2353+
let u64_mapping = fields.iter().enumerate().map(|(i, (ident, _))| {
23802354
let i = i as u64;
23812355
quote!(#i => _serde::__private::Ok(#this_value::#ident))
23822356
});

test_suite/tests/test_annotations.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,7 @@ fn test_unknown_field_rename_enum() {
782782
variant: "SailorMoon",
783783
len: 3,
784784
}],
785-
"unknown variant `SailorMoon`, expected `sailor_moon`",
785+
"unknown variant `SailorMoon`, expected `sailor_moon` or `usagi_tsukino`",
786786
);
787787

788788
assert_de_tokens_error::<AliasEnum>(

0 commit comments

Comments
 (0)