From bb51e68f165b18cdd61c00d68c9650d7ef151e82 Mon Sep 17 00:00:00 2001 From: Mingun Date: Fri, 19 May 2023 23:35:02 +0500 Subject: [PATCH] Keep aliases sorted --- serde_derive/src/internals/attr.rs | 20 +++++++++++++++----- test_suite/tests/test_annotations.rs | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/serde_derive/src/internals/attr.rs b/serde_derive/src/internals/attr.rs index 42212a64..1a8bd9d4 100644 --- a/serde_derive/src/internals/attr.rs +++ b/serde_derive/src/internals/attr.rs @@ -184,12 +184,20 @@ impl Name { } fn deserialize_aliases(&self) -> Vec { - let mut aliases = self.deserialize_aliases.clone(); - let main_name = self.deserialize_name(); - if !aliases.contains(&main_name) { - aliases.push(main_name); + self.deserialize_aliases.clone() + } + + fn correct_aliases(&mut self) { + // `deserialize_aliases` got from a BTreeSet, so it sorted and does not + // contain duplicates. + // We cannot insert main name in `new` because rename_all rules not yet + // applied there. + match self.deserialize_aliases.binary_search(&self.deserialize) { + Ok(_) => {} // element already here + Err(pos) => self + .deserialize_aliases + .insert(pos, self.deserialize.clone()), } - aliases } } @@ -928,6 +936,7 @@ impl Variant { if !self.name.deserialize_renamed { self.name.deserialize = rules.deserialize.apply_to_variant(&self.name.deserialize); } + self.name.correct_aliases(); } pub fn rename_all_rules(&self) -> &RenameAllRules { @@ -1267,6 +1276,7 @@ impl Field { if !self.name.deserialize_renamed { self.name.deserialize = rules.deserialize.apply_to_field(&self.name.deserialize); } + self.name.correct_aliases(); } pub fn skip_serializing(&self) -> bool { diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 354f82c9..41cad2f3 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -643,7 +643,7 @@ fn test_unknown_field_rename_struct() { Token::Str("a4"), Token::I32(3), ], - "unknown field `a4`, expected one of `a1`, `a3`, `a2`, `a5`, `a6`", + "unknown field `a4`, expected one of `a1`, `a2`, `a3`, `a5`, `a6`", ); } @@ -837,7 +837,7 @@ fn test_unknown_field_rename_enum() { Token::Str("d"), Token::I8(2), ], - "unknown field `d`, expected one of `a`, `c`, `b`, `e`, `f`", + "unknown field `d`, expected one of `a`, `b`, `c`, `e`, `f`", ); }