From 280d8101304cbef66bff653f9de2ba683eb2551f Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 2 Nov 2025 15:24:41 +0500 Subject: [PATCH 01/11] Remove unnecessary Result from ElementMapAccess::new It was never necessary, but somehow survived all the rewrites --- src/de/map.rs | 10 +++++----- src/de/mod.rs | 2 +- src/de/var.rs | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/de/map.rs b/src/de/map.rs index 2c1e8953a..b3ddfa208 100644 --- a/src/de/map.rs +++ b/src/de/map.rs @@ -207,8 +207,8 @@ where de: &'d mut Deserializer<'de, R, E>, start: BytesStart<'de>, fields: &'static [&'static str], - ) -> Result { - Ok(Self { + ) -> Self { + Self { de, iter: IterState::new(start.name().as_ref().len(), false), start, @@ -216,7 +216,7 @@ where fields, has_value_field: fields.contains(&VALUE_KEY), has_text_field: fields.contains(&TEXT_KEY), - }) + } } /// Determines if subtree started with the specified event shoould be skipped. @@ -801,7 +801,7 @@ where V: Visitor<'de>, { match self.map.de.next()? { - DeEvent::Start(e) => visitor.visit_map(ElementMapAccess::new(self.map.de, e, fields)?), + DeEvent::Start(e) => visitor.visit_map(ElementMapAccess::new(self.map.de, e, fields)), DeEvent::Text(e) => { SimpleTypeDeserializer::from_text_content(e).deserialize_struct("", fields, visitor) } @@ -1144,7 +1144,7 @@ where where V: Visitor<'de>, { - visitor.visit_map(ElementMapAccess::new(self.de, self.start, fields)?) + visitor.visit_map(ElementMapAccess::new(self.de, self.start, fields)) } fn deserialize_enum( diff --git a/src/de/mod.rs b/src/de/mod.rs index 7671985b0..30c46eb14 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -3235,7 +3235,7 @@ where // When document is pretty-printed there could be whitespaces before the root element self.skip_whitespaces()?; match self.next()? { - DeEvent::Start(e) => visitor.visit_map(ElementMapAccess::new(self, e, fields)?), + DeEvent::Start(e) => visitor.visit_map(ElementMapAccess::new(self, e, fields)), // SAFETY: The reader is guaranteed that we don't have unmatched tags // If we here, then our deserializer has a bug DeEvent::End(e) => unreachable!("{:?}", e), diff --git a/src/de/var.rs b/src/de/var.rs index b55441299..e64e29f85 100644 --- a/src/de/var.rs +++ b/src/de/var.rs @@ -132,7 +132,7 @@ where V: Visitor<'de>, { match self.de.next()? { - DeEvent::Start(e) => visitor.visit_map(ElementMapAccess::new(self.de, e, fields)?), + DeEvent::Start(e) => visitor.visit_map(ElementMapAccess::new(self.de, e, fields)), DeEvent::Text(e) => { SimpleTypeDeserializer::from_text_content(e).deserialize_struct("", fields, visitor) } From fba04b37fe5207dace3e20867b3048810ba793f0 Mon Sep 17 00:00:00 2001 From: Mingun Date: Thu, 30 Oct 2025 00:34:09 +0500 Subject: [PATCH 02/11] Remove unnecessary `return`s --- src/events/mod.rs | 12 ++++++------ src/reader/state.rs | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/events/mod.rs b/src/events/mod.rs index f7a0ee598..c1f8aa2f9 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -363,7 +363,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesStart<'a> { } fn size_hint(depth: usize) -> (usize, Option) { - return <&str as arbitrary::Arbitrary>::size_hint(depth); + <&str as arbitrary::Arbitrary>::size_hint(depth) } } @@ -483,7 +483,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesEnd<'a> { Ok(Self::new(<&str>::arbitrary(u)?)) } fn size_hint(depth: usize) -> (usize, Option) { - return <&str as arbitrary::Arbitrary>::size_hint(depth); + <&str as arbitrary::Arbitrary>::size_hint(depth) } } @@ -692,7 +692,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesText<'a> { } fn size_hint(depth: usize) -> (usize, Option) { - return <&str as arbitrary::Arbitrary>::size_hint(depth); + <&str as arbitrary::Arbitrary>::size_hint(depth) } } @@ -976,7 +976,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesCData<'a> { Ok(Self::new(<&str>::arbitrary(u)?)) } fn size_hint(depth: usize) -> (usize, Option) { - return <&str as arbitrary::Arbitrary>::size_hint(depth); + <&str as arbitrary::Arbitrary>::size_hint(depth) } } @@ -1171,7 +1171,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesPI<'a> { Ok(Self::new(<&str>::arbitrary(u)?)) } fn size_hint(depth: usize) -> (usize, Option) { - return <&str as arbitrary::Arbitrary>::size_hint(depth); + <&str as arbitrary::Arbitrary>::size_hint(depth) } } @@ -1456,7 +1456,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesDecl<'a> { } fn size_hint(depth: usize) -> (usize, Option) { - return <&str as arbitrary::Arbitrary>::size_hint(depth); + <&str as arbitrary::Arbitrary>::size_hint(depth) } } diff --git a/src/reader/state.rs b/src/reader/state.rs index c5e6b7c72..7d646765d 100644 --- a/src/reader/state.rs +++ b/src/reader/state.rs @@ -156,7 +156,7 @@ impl ReaderState { // We want report error at place where name is expected - this is just // before `>` self.last_error_offset = self.offset - 1; - return Err(Error::IllFormed(IllFormedError::MissingDoctypeName)); + Err(Error::IllFormed(IllFormedError::MissingDoctypeName)) } } } From 60597464eca08ea80e5dbfc26b569f3416e5fcfd Mon Sep 17 00:00:00 2001 From: Mingun Date: Thu, 30 Oct 2025 00:39:39 +0500 Subject: [PATCH 03/11] Remove unnecessary `&` --- examples/flattened_enum.rs | 2 +- src/de/key.rs | 2 +- src/de/mod.rs | 2 +- src/events/attributes.rs | 2 +- src/name.rs | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/flattened_enum.rs b/examples/flattened_enum.rs index 1019c1de4..c56c2fca1 100644 --- a/examples/flattened_enum.rs +++ b/examples/flattened_enum.rs @@ -129,7 +129,7 @@ fn main() { "#; - let model: Model = from_str(&x).unwrap(); + let model: Model = from_str(x).unwrap(); println!("{:?}", model); // Model { elem: [Foo(Foo { a: "1", subfoo: SubFoo { a1: "2", a2: "42", a3: "1337" } }), Bar(Bar { b: "22" })] } diff --git a/src/de/key.rs b/src/de/key.rs index aa190297f..bf5ba5fcd 100644 --- a/src/de/key.rs +++ b/src/de/key.rs @@ -96,7 +96,7 @@ impl<'i, 'd> QNameDeserializer<'i, 'd> { // can apper only in this literal form, as `xml` prefix cannot be redeclared or unbound let (local, prefix_opt) = name.decompose(); if prefix_opt.map_or(false, |prefix| prefix.is_xml()) { - decoder.decode_into(&name.into_inner(), key_buf)?; + decoder.decode_into(name.into_inner(), key_buf)?; } else { decoder.decode_into(local.into_inner(), key_buf)?; } diff --git a/src/de/mod.rs b/src/de/mod.rs index 30c46eb14..4f4dc6092 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -3330,7 +3330,7 @@ where DeEvent::Text(t) if t.is_empty() => visitor.visit_none(), DeEvent::Eof => visitor.visit_none(), // if the `xsi:nil` attribute is set to true we got a none value - DeEvent::Start(start) if self.reader.reader.has_nil_attr(&start) => { + DeEvent::Start(start) if self.reader.reader.has_nil_attr(start) => { self.skip_next_tree()?; visitor.visit_none() } diff --git a/src/events/attributes.rs b/src/events/attributes.rs index f98fefb3f..8e5b88bba 100644 --- a/src/events/attributes.rs +++ b/src/events/attributes.rs @@ -432,7 +432,7 @@ impl<'a> Attributes<'a> { impl<'a> Debug for Attributes<'a> { fn fmt(&self, f: &mut Formatter) -> fmt::Result { f.debug_struct("Attributes") - .field("bytes", &Bytes(&self.bytes)) + .field("bytes", &Bytes(self.bytes)) .field("state", &self.state) .field("decoder", &self.decoder) .finish() diff --git a/src/name.rs b/src/name.rs index dc16dd0cc..d94f6087a 100644 --- a/src/name.rs +++ b/src/name.rs @@ -609,7 +609,7 @@ impl NamespaceResolver { match prefix { PrefixDeclaration::Default => { let start = self.buffer.len(); - self.buffer.extend_from_slice(&namespace.0); + self.buffer.extend_from_slice(namespace.0); self.bindings.push(NamespaceBinding { start, prefix_len: 0, @@ -640,7 +640,7 @@ impl NamespaceResolver { let start = self.buffer.len(); self.buffer.extend_from_slice(prefix); - self.buffer.extend_from_slice(&namespace.0); + self.buffer.extend_from_slice(namespace.0); self.bindings.push(NamespaceBinding { start, prefix_len: prefix.len(), From d458d79d9221d98c16dc632daac2c3ad3f21ef8a Mon Sep 17 00:00:00 2001 From: Mingun Date: Thu, 30 Oct 2025 00:40:53 +0500 Subject: [PATCH 04/11] Remove unnecessary `into` conversions --- src/events/mod.rs | 4 ++-- src/writer.rs | 6 +++--- tests/writer-indentation.rs | 26 +++++++++++++------------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/events/mod.rs b/src/events/mod.rs index c1f8aa2f9..64d676bfe 100644 --- a/src/events/mod.rs +++ b/src/events/mod.rs @@ -358,7 +358,7 @@ impl<'a> arbitrary::Arbitrary<'a> for BytesStart<'a> { return Err(arbitrary::Error::IncorrectFormat); } let mut result = Self::new(s); - result.extend_attributes(Vec::<(&str, &str)>::arbitrary(u)?.into_iter()); + result.extend_attributes(Vec::<(&str, &str)>::arbitrary(u)?); Ok(result) } @@ -1062,7 +1062,7 @@ impl<'a> BytesPI<'a> { #[inline] pub fn into_owned(self) -> BytesPI<'static> { BytesPI { - content: self.content.into_owned().into(), + content: self.content.into_owned(), } } diff --git a/src/writer.rs b/src/writer.rs index 5810dfe60..770a7585d 100644 --- a/src/writer.rs +++ b/src/writer.rs @@ -233,7 +233,7 @@ impl Writer { /// Writes bytes #[inline] pub(crate) fn write(&mut self, value: &[u8]) -> io::Result<()> { - self.writer.write_all(value).map_err(Into::into) + self.writer.write_all(value) } #[inline] @@ -497,7 +497,7 @@ impl<'a, W> ElementWriter<'a, W> { self.spaces.resize(indent, b' '); } self.start_tag.push_indent(&self.spaces[..indent]); - self.start_tag.push_attr(attr.into()); + self.start_tag.push_attr(attr); AttributeIndent::Spaces(indent) } // .new_line() was not called, but .with_attribute() was. @@ -511,7 +511,7 @@ impl<'a, W> ElementWriter<'a, W> { // New line was already written AttributeIndent::WriteConfigured(indent) => { self.start_tag.push_indent(i.additional(indent)); - self.start_tag.push_attr(attr.into()); + self.start_tag.push_attr(attr); AttributeIndent::Configured(indent) } // .new_line() was not called, but .with_attribute() was. diff --git a/tests/writer-indentation.rs b/tests/writer-indentation.rs index baabd9678..4e23bbc68 100644 --- a/tests/writer-indentation.rs +++ b/tests/writer-indentation.rs @@ -9,7 +9,7 @@ fn self_closed() { let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4); let tag = BytesStart::new("self-closed") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); writer .write_event(Event::Empty(tag)) .expect("write tag failed"); @@ -25,8 +25,8 @@ fn empty_paired() { let mut buffer = Vec::new(); let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4); - let start = BytesStart::new("paired") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + let start = + BytesStart::new("paired").with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); let end = start.to_end(); writer .write_event(Event::Start(start.clone())) @@ -47,8 +47,8 @@ fn paired_with_inner() { let mut buffer = Vec::new(); let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4); - let start = BytesStart::new("paired") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + let start = + BytesStart::new("paired").with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); let end = start.to_end(); let inner = BytesStart::new("inner"); @@ -75,8 +75,8 @@ fn paired_with_text() { let mut buffer = Vec::new(); let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4); - let start = BytesStart::new("paired") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + let start = + BytesStart::new("paired").with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); let end = start.to_end(); let text = BytesText::new("text"); @@ -101,8 +101,8 @@ fn mixed_content() { let mut buffer = Vec::new(); let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4); - let start = BytesStart::new("paired") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + let start = + BytesStart::new("paired").with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); let end = start.to_end(); let text = BytesText::new("text"); let inner = BytesStart::new("inner"); @@ -132,8 +132,8 @@ fn nested() { let mut buffer = Vec::new(); let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4); - let start = BytesStart::new("paired") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + let start = + BytesStart::new("paired").with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); let end = start.to_end(); let inner = BytesStart::new("inner"); @@ -199,8 +199,8 @@ fn serializable() { val: "foo".to_owned(), }; - let start = BytesStart::new("paired") - .with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter()); + let start = + BytesStart::new("paired").with_attributes(vec![("attr1", "value1"), ("attr2", "value2")]); let end = start.to_end(); writer From 89cb652805e9843de147ca3d1be5e3ad9f766446 Mon Sep 17 00:00:00 2001 From: Mingun Date: Fri, 31 Oct 2025 23:06:03 +0500 Subject: [PATCH 05/11] Remove unnecessary pub(self) modifier --- src/se/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/se/mod.rs b/src/se/mod.rs index ac5111576..a08b13235 100644 --- a/src/se/mod.rs +++ b/src/se/mod.rs @@ -467,7 +467,7 @@ const fn is_xml11_name_char(ch: char) -> bool { /// Helper struct to self-defense from errors #[derive(Clone, Copy, Debug, PartialEq)] -pub(self) struct XmlName<'n>(&'n str); +struct XmlName<'n>(&'n str); impl<'n> XmlName<'n> { /// Checks correctness of the XML name according to [XML 1.1 specification] From f5631afd1e03a040552231494b6391052488e84f Mon Sep 17 00:00:00 2001 From: Mingun Date: Fri, 31 Oct 2025 23:07:21 +0500 Subject: [PATCH 06/11] Replace some matches with `if let` (review in whitespace changes ignored mode) --- src/de/mod.rs | 43 ++++++++++++++++++++----------------------- src/name.rs | 5 ++--- tests/issues.rs | 5 ++--- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/src/de/mod.rs b/src/de/mod.rs index 4f4dc6092..afbe1afe8 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -2815,34 +2815,31 @@ where fn skip(&mut self) -> Result<(), DeError> { let event = self.next()?; self.skip_event(event)?; - match self.write.back() { - // Skip all subtree, if we skip a start event - Some(DeEvent::Start(e)) => { - let end = e.name().as_ref().to_owned(); - let mut depth = 0; - loop { - let event = self.next()?; - match event { - DeEvent::Start(ref e) if e.name().as_ref() == end => { - self.skip_event(event)?; - depth += 1; - } - DeEvent::End(ref e) if e.name().as_ref() == end => { - self.skip_event(event)?; - if depth == 0 { - break; - } - depth -= 1; - } - DeEvent::Eof => { - self.skip_event(event)?; + // Skip all subtree, if we skip a start event + if let Some(DeEvent::Start(e)) = self.write.back() { + let end = e.name().as_ref().to_owned(); + let mut depth = 0; + loop { + let event = self.next()?; + match event { + DeEvent::Start(ref e) if e.name().as_ref() == end => { + self.skip_event(event)?; + depth += 1; + } + DeEvent::End(ref e) if e.name().as_ref() == end => { + self.skip_event(event)?; + if depth == 0 { break; } - _ => self.skip_event(event)?, + depth -= 1; + } + DeEvent::Eof => { + self.skip_event(event)?; + break; } + _ => self.skip_event(event)?, } } - _ => (), } Ok(()) } diff --git a/src/name.rs b/src/name.rs index d94f6087a..a3d3f41a2 100644 --- a/src/name.rs +++ b/src/name.rs @@ -662,9 +662,8 @@ impl NamespaceResolver { // (default namespace) attribute. for a in start.attributes().with_checks(false) { if let Ok(Attribute { key: k, value: v }) = a { - match k.as_namespace_binding() { - Some(prefix) => self.add(prefix, Namespace(&v))?, - None => {} + if let Some(prefix) = k.as_namespace_binding() { + self.add(prefix, Namespace(&v))?; } } else { break; diff --git a/tests/issues.rs b/tests/issues.rs index d4fdcbb0d..916ba7ffc 100644 --- a/tests/issues.rs +++ b/tests/issues.rs @@ -182,9 +182,8 @@ fn issue590() { )); let mut buf = Vec::new(); loop { - match reader.read_event_into(&mut buf).unwrap() { - Event::Eof => break, - _ => (), + if reader.read_event_into(&mut buf).unwrap() == Event::Eof { + break; } } } From 1870e98e743811311003509c76eca6f422183888 Mon Sep 17 00:00:00 2001 From: Mingun Date: Fri, 31 Oct 2025 23:30:57 +0500 Subject: [PATCH 07/11] Mark mod names as intentional --- src/de/mod.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/de/mod.rs b/src/de/mod.rs index afbe1afe8..4108fd939 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -4505,6 +4505,8 @@ mod tests { use super::*; /// ... + // The same name is intentional + #[allow(clippy::module_inception)] mod start { use super::*; use pretty_assertions::assert_eq; @@ -4977,6 +4979,8 @@ mod tests { } } + // The same name is intentional + #[allow(clippy::module_inception)] mod cdata { use super::*; use pretty_assertions::assert_eq; From d53834b9b335ca99aabc40d33cb67228cf8e732b Mon Sep 17 00:00:00 2001 From: Mingun Date: Sat, 1 Nov 2025 23:20:10 +0500 Subject: [PATCH 08/11] Some other clippy suggestions --- src/escape.rs | 3 ++- src/reader/state.rs | 2 +- src/se/element.rs | 2 +- src/se/mod.rs | 2 +- src/se/simple_type.rs | 2 +- tests/serde_helpers/mod.rs | 2 +- 6 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/escape.rs b/src/escape.rs index 5656025fa..a0fc6a384 100644 --- a/src/escape.rs +++ b/src/escape.rs @@ -2183,7 +2183,8 @@ mod normalization { if ch == '\u{0085}' { assert_eq!(normalize_xml11_eols(input), "\n", "{}", description); } else { - let mut expected = utf8.clone(); + // utf8 is copied, because [u8; 3] implements Copy + let mut expected = utf8; expected[0] = b'\n'; let expected = std::str::from_utf8(&expected).expect(&description); assert_eq!(normalize_xml11_eols(input), expected, "{}", description); diff --git a/src/reader/state.rs b/src/reader/state.rs index 7d646765d..656e57cce 100644 --- a/src/reader/state.rs +++ b/src/reader/state.rs @@ -239,7 +239,7 @@ impl ReaderState { /// /// Returns `Decl` or `PI` event pub fn emit_question_mark<'b>(&mut self, buf: &'b [u8]) -> Result> { - debug_assert!(buf.len() > 0); + debug_assert!(!buf.is_empty()); debug_assert_eq!(buf[0], b'?'); let len = buf.len(); diff --git a/src/se/element.rs b/src/se/element.rs index 2a1184db6..3dea52aaf 100644 --- a/src/se/element.rs +++ b/src/se/element.rs @@ -551,7 +551,7 @@ impl<'w, 'k, W: Write> SerializeMap for Map<'w, 'k, W> { where T: ?Sized + Serialize, { - if let Some(_) = self.key.take() { + if self.key.take().is_some() { return Err(SeError::Custom( "calling `serialize_key` twice without `serialize_value`".to_string(), )); diff --git a/src/se/mod.rs b/src/se/mod.rs index a08b13235..8b03fcbce 100644 --- a/src/se/mod.rs +++ b/src/se/mod.rs @@ -638,7 +638,7 @@ impl<'w, 'r, W: Write> Serializer<'w, 'r, W> { allow_primitive: true, expand_empty_elements: false, }, - root_tag: root_tag.map(|tag| XmlName::try_from(tag)).transpose()?, + root_tag: root_tag.map(XmlName::try_from).transpose()?, }) } diff --git a/src/se/simple_type.rs b/src/se/simple_type.rs index 2eedb97b0..4e07713b0 100644 --- a/src/se/simple_type.rs +++ b/src/se/simple_type.rs @@ -61,7 +61,7 @@ where if let Some(part) = it.next() { writer.write_str(part)?; } - while let Some(part) = it.next() { + for part in it { writer.write_str("]]> Date: Mon, 3 Nov 2025 14:08:02 +0500 Subject: [PATCH 09/11] Silent non important and suppress bad suggestions from clippy --- benches/macrobenches.rs | 4 ++++ benches/microbenches.rs | 4 ++++ src/encoding.rs | 2 ++ src/se/mod.rs | 2 ++ 4 files changed, 12 insertions(+) diff --git a/benches/macrobenches.rs b/benches/macrobenches.rs index 9a87f31d7..77197b3ed 100644 --- a/benches/macrobenches.rs +++ b/benches/macrobenches.rs @@ -1,3 +1,7 @@ +// std::hint::black_box stable since 1.66, but our MSRV = 1.56. +// criterion::black_box is deprecated in since criterion 0.7. +// Running benchmarks assumed on current Rust version, so this should be fine +#![allow(clippy::incompatible_msrv)] use criterion::{self, criterion_group, criterion_main, Criterion, Throughput}; use quick_xml::events::Event; use quick_xml::reader::{NsReader, Reader}; diff --git a/benches/microbenches.rs b/benches/microbenches.rs index f0ae8816c..f6af550f3 100644 --- a/benches/microbenches.rs +++ b/benches/microbenches.rs @@ -1,3 +1,7 @@ +// std::hint::black_box stable since 1.66, but our MSRV = 1.56. +// criterion::black_box is deprecated in since criterion 0.7. +// Running benchmarks assumed on current Rust version, so this should be fine +#![allow(clippy::incompatible_msrv)] use criterion::{self, criterion_group, criterion_main, Criterion}; use pretty_assertions::assert_eq; use quick_xml::escape::{escape, unescape}; diff --git a/src/encoding.rs b/src/encoding.rs index 1de736059..d894f9501 100644 --- a/src/encoding.rs +++ b/src/encoding.rs @@ -248,6 +248,8 @@ pub fn decode_into( /// |`3C 3F 78 6D`|UTF-8, ISO 646, ASCII, some part of ISO 8859, Shift-JIS, EUC, or any other 7-bit, 8-bit, or mixed-width encoding which ensures that the characters of ASCII have their normal positions, width, and values; the actual encoding declaration must be read to detect which of these applies, but since all of these encodings use the same bit patterns for the relevant ASCII characters, the encoding declaration itself may be read reliably #[cfg(feature = "encoding")] pub fn detect_encoding(bytes: &[u8]) -> Option<(&'static Encoding, usize)> { + // Prevent suggesting " Some((UTF_16BE, 2)), diff --git a/src/se/mod.rs b/src/se/mod.rs index 8b03fcbce..1ac3782b3 100644 --- a/src/se/mod.rs +++ b/src/se/mod.rs @@ -435,6 +435,8 @@ macro_rules! forward { /// /// const fn is_xml11_name_start_char(ch: char) -> bool { + // Not need to use macro when core primitives is enough + #[allow(clippy::match_like_matches_macro)] match ch { ':' | 'A'..='Z' From b529d750e3c0c8899707dc706526be68ea3a0968 Mon Sep 17 00:00:00 2001 From: Mingun Date: Fri, 31 Oct 2025 23:15:32 +0500 Subject: [PATCH 10/11] Elide unused lifetime specifier --- src/de/mod.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/de/mod.rs b/src/de/mod.rs index 4108fd939..fab4915d7 100644 --- a/src/de/mod.rs +++ b/src/de/mod.rs @@ -3211,7 +3211,7 @@ where } } -impl<'de, 'a, R, E> de::Deserializer<'de> for &'a mut Deserializer<'de, R, E> +impl<'de, R, E> de::Deserializer<'de> for &mut Deserializer<'de, R, E> where R: XmlRead<'de>, E: EntityResolver, @@ -3351,7 +3351,7 @@ where /// /// Technically, multiple top-level elements violates XML rule of only one top-level /// element, but we consider this as several concatenated XML documents. -impl<'de, 'a, R, E> SeqAccess<'de> for &'a mut Deserializer<'de, R, E> +impl<'de, R, E> SeqAccess<'de> for &mut Deserializer<'de, R, E> where R: XmlRead<'de>, E: EntityResolver, @@ -3378,7 +3378,7 @@ where } } -impl<'de, 'a, R, E> IntoDeserializer<'de, DeError> for &'a mut Deserializer<'de, R, E> +impl<'de, R, E> IntoDeserializer<'de, DeError> for &mut Deserializer<'de, R, E> where R: XmlRead<'de>, E: EntityResolver, From 8fa6c6a4862e40fc05c8e13cbe40951c49b7b169 Mon Sep 17 00:00:00 2001 From: Mingun Date: Sun, 2 Nov 2025 16:28:29 +0500 Subject: [PATCH 11/11] Since 1.92 (current nightly) `doc_auto_cfg` was merged into `doc_cfg` We use this feature to show feature gates in the documentetion (like "Available on crate feature serialize only.") --- src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index afc4c149d..068c2b5e5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,7 +50,8 @@ // Enable feature requirements in the docs from 1.57 // See https://stackoverflow.com/questions/61417452 // docs.rs defines `docsrs` when building documentation -#![cfg_attr(docsrs, feature(doc_auto_cfg))] +// Since 1.92 `doc_auto_cfg` was merged into `doc_cfg` +#![cfg_attr(docsrs, feature(doc_cfg))] #[cfg(feature = "serialize")] pub mod de;