Keep deserialize aliases as a sorted set

This commit is contained in:
David Tolnay
2023-08-05 16:56:54 -07:00
parent da55ed7e8d
commit 4d93e9f44c
2 changed files with 18 additions and 32 deletions
+2 -2
View File
@@ -2001,7 +2001,7 @@ fn deserialize_untagged_newtype_variant(
} }
fn deserialize_generated_identifier( fn deserialize_generated_identifier(
fields: &[(&str, Ident, &[String])], fields: &[(&str, Ident, &BTreeSet<String>)],
cattrs: &attr::Container, cattrs: &attr::Container,
is_variant: bool, is_variant: bool,
other_idx: Option<usize>, other_idx: Option<usize>,
@@ -2187,7 +2187,7 @@ fn deserialize_custom_identifier(
fn deserialize_identifier( fn deserialize_identifier(
this_value: &TokenStream, this_value: &TokenStream,
fields: &[(&str, Ident, &[String])], fields: &[(&str, Ident, &BTreeSet<String>)],
is_variant: bool, is_variant: bool,
fallthrough: Option<TokenStream>, fallthrough: Option<TokenStream>,
fallthrough_borrowed: Option<TokenStream>, fallthrough_borrowed: Option<TokenStream>,
+16 -30
View File
@@ -134,7 +134,7 @@ pub struct Name {
serialize_renamed: bool, serialize_renamed: bool,
deserialize: String, deserialize: String,
deserialize_renamed: bool, deserialize_renamed: bool,
deserialize_aliases: Vec<String>, deserialize_aliases: BTreeSet<String>,
} }
fn unraw(ident: &Ident) -> String { fn unraw(ident: &Ident) -> String {
@@ -148,16 +148,12 @@ impl Name {
de_name: Attr<String>, de_name: Attr<String>,
de_aliases: Option<VecAttr<String>>, de_aliases: Option<VecAttr<String>>,
) -> Name { ) -> Name {
let deserialize_aliases = match de_aliases { let mut alias_set = BTreeSet::new();
Some(de_aliases) => { if let Some(de_aliases) = de_aliases {
let mut alias_list = BTreeSet::new(); for alias_name in de_aliases.get() {
for alias_name in de_aliases.get() { alias_set.insert(alias_name);
alias_list.insert(alias_name);
}
alias_list.into_iter().collect()
} }
None => Vec::new(), }
};
let ser_name = ser_name.get(); let ser_name = ser_name.get();
let ser_renamed = ser_name.is_some(); let ser_renamed = ser_name.is_some();
@@ -168,7 +164,7 @@ impl Name {
serialize_renamed: ser_renamed, serialize_renamed: ser_renamed,
deserialize: de_name.unwrap_or(source_name), deserialize: de_name.unwrap_or(source_name),
deserialize_renamed: de_renamed, deserialize_renamed: de_renamed,
deserialize_aliases, deserialize_aliases: alias_set,
} }
} }
@@ -182,23 +178,9 @@ impl Name {
&self.deserialize &self.deserialize
} }
fn deserialize_aliases(&self) -> &[String] { fn deserialize_aliases(&self) -> &BTreeSet<String> {
&self.deserialize_aliases &self.deserialize_aliases
} }
fn insert_deserialize_name_into_aliases(&mut self) {
// `deserialize_aliases` was constructed from a BTreeSet, so it is
// sorted and does not contain duplicates.
//
// In `Name::from_attrs` it's too early to insert the field's real name
// because rename_all rules have not yet gotten applied at that point.
match self.deserialize_aliases.binary_search(&self.deserialize) {
Ok(_) => {} // already present
Err(pos) => self
.deserialize_aliases
.insert(pos, self.deserialize.clone()),
}
}
} }
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
@@ -986,7 +968,7 @@ impl Variant {
&self.name &self.name
} }
pub fn aliases(&self) -> &[String] { pub fn aliases(&self) -> &BTreeSet<String> {
self.name.deserialize_aliases() self.name.deserialize_aliases()
} }
@@ -997,7 +979,9 @@ impl Variant {
if !self.name.deserialize_renamed { if !self.name.deserialize_renamed {
self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize); self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize);
} }
self.name.insert_deserialize_name_into_aliases(); self.name
.deserialize_aliases
.insert(self.name.deserialize.clone());
} }
pub fn rename_all_rules(&self) -> RenameAllRules { pub fn rename_all_rules(&self) -> RenameAllRules {
@@ -1326,7 +1310,7 @@ impl Field {
&self.name &self.name
} }
pub fn aliases(&self) -> &[String] { pub fn aliases(&self) -> &BTreeSet<String> {
self.name.deserialize_aliases() self.name.deserialize_aliases()
} }
@@ -1337,7 +1321,9 @@ impl Field {
if !self.name.deserialize_renamed { if !self.name.deserialize_renamed {
self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize); self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize);
} }
self.name.insert_deserialize_name_into_aliases(); self.name
.deserialize_aliases
.insert(self.name.deserialize.clone());
} }
pub fn skip_serializing(&self) -> bool { pub fn skip_serializing(&self) -> bool {