Make most of prepare_enum_variant_enum independent of variant_names_idents item type

This commit is contained in:
David Tolnay 2024-10-21 22:47:42 -07:00
parent 830309fcb5
commit 3393ad6760
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82

View File

@ -1225,33 +1225,33 @@ fn deserialize_homogeneous_enum(
} }
fn prepare_enum_variant_enum(variants: &[Variant]) -> (TokenStream, Stmts) { fn prepare_enum_variant_enum(variants: &[Variant]) -> (TokenStream, Stmts) {
let mut deserialized_variants = variants let deserialized_variants = variants
.iter() .iter()
.enumerate() .enumerate()
.filter(|&(_, variant)| !variant.attrs.skip_deserializing()); .filter(|&(_i, variant)| !variant.attrs.skip_deserializing());
let variant_names_idents: Vec<_> = deserialized_variants
.clone()
.map(|(i, variant)| (field_i(i), variant.attrs.aliases()))
.collect();
let fallthrough = deserialized_variants let fallthrough = deserialized_variants
.position(|(_, variant)| variant.attrs.other()) .clone()
.map(|other_idx| { .find(|(_i, variant)| variant.attrs.other())
let ignore_variant = variant_names_idents[other_idx].0.clone(); .map(|(i, _variant)| {
let ignore_variant = field_i(i);
quote!(_serde::__private::Ok(__Field::#ignore_variant)) quote!(_serde::__private::Ok(__Field::#ignore_variant))
}); });
let variants_stmt = { let variants_stmt = {
let variant_names = variant_names_idents let variant_names = deserialized_variants
.iter() .clone()
.flat_map(|&(_, aliases)| aliases); .flat_map(|(_i, variant)| variant.attrs.aliases());
quote! { quote! {
#[doc(hidden)] #[doc(hidden)]
const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ]; const VARIANTS: &'static [&'static str] = &[ #(#variant_names),* ];
} }
}; };
let variant_names_idents: Vec<_> = deserialized_variants
.map(|(i, variant)| (field_i(i), variant.attrs.aliases()))
.collect();
let variant_visitor = Stmts(deserialize_generated_identifier( let variant_visitor = Stmts(deserialize_generated_identifier(
&variant_names_idents, &variant_names_idents,
false, // variant identifiers do not depend on the presence of flatten fields false, // variant identifiers do not depend on the presence of flatten fields