| #![allow(unused)] | |
| #![warn(clippy::missing_fields_in_debug)] | |
| use std::fmt; | |
| use std::marker::PhantomData; | |
| use std::ops::Deref; | |
| use std::thread::LocalKey; | |
| struct NamedStruct1Ignored { | |
| data: u8, | |
| hidden: u32, | |
| } | |
| impl fmt::Debug for NamedStruct1Ignored { | |
| //~^ missing_fields_in_debug | |
| // unused field: hidden | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| formatter | |
| .debug_struct("NamedStruct1Ignored") | |
| .field("data", &self.data) | |
| .finish() | |
| } | |
| } | |
| struct NamedStructMultipleIgnored { | |
| data: u8, | |
| hidden: u32, | |
| hidden2: String, | |
| hidden3: Vec<Vec<i32>>, | |
| hidden4: ((((u8), u16), u32), u64), | |
| } | |
| impl fmt::Debug for NamedStructMultipleIgnored { | |
| //~^ missing_fields_in_debug | |
| // unused fields: hidden, hidden2, hidden4 | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| formatter | |
| .debug_struct("NamedStructMultipleIgnored") | |
| .field("data", &self.data) | |
| .field("hidden3", &self.hidden3) | |
| .finish() | |
| } | |
| } | |
| struct Unit; | |
| // ok | |
| impl fmt::Debug for Unit { | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| formatter.debug_struct("Unit").finish() | |
| } | |
| } | |
| struct UnnamedStruct1Ignored(String); | |
| impl fmt::Debug for UnnamedStruct1Ignored { | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| formatter.debug_tuple("UnnamedStruct1Ignored").finish() | |
| } | |
| } | |
| struct UnnamedStructMultipleIgnored(String, Vec<u8>, i32); | |
| // tuple structs are not linted | |
| impl fmt::Debug for UnnamedStructMultipleIgnored { | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| formatter | |
| .debug_tuple("UnnamedStructMultipleIgnored") | |
| .field(&self.1) | |
| .finish() | |
| } | |
| } | |
| struct NamedStructNonExhaustive { | |
| a: u8, | |
| b: String, | |
| } | |
| // ok | |
| impl fmt::Debug for NamedStructNonExhaustive { | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| formatter | |
| .debug_struct("NamedStructNonExhaustive") | |
| .field("a", &self.a) | |
| .finish_non_exhaustive() // should not warn here | |
| } | |
| } | |
| struct MultiExprDebugImpl { | |
| a: u8, | |
| b: String, | |
| } | |
| // ok | |
| impl fmt::Debug for MultiExprDebugImpl { | |
| //~^ missing_fields_in_debug | |
| fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| let mut f = formatter.debug_struct("MultiExprDebugImpl"); | |
| f.field("a", &self.a); | |
| f.finish() | |
| } | |
| } | |
| #[derive(Debug)] | |
| struct DerivedStruct { | |
| a: u8, | |
| b: i32, | |
| } | |
| // https://github.com/rust-lang/rust-clippy/pull/10616#discussion_r1166846953 | |
| struct Inner { | |
| a: usize, | |
| b: usize, | |
| } | |
| struct HasInner { | |
| inner: Inner, | |
| } | |
| impl HasInner { | |
| fn get(&self) -> &Inner { | |
| &self.inner | |
| } | |
| } | |
| impl fmt::Debug for HasInner { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| let inner = self.get(); | |
| f.debug_struct("HasInner") | |
| .field("a", &inner.a) | |
| .field("b", &inner.b) | |
| .finish() | |
| } | |
| } | |
| // https://github.com/rust-lang/rust-clippy/pull/10616#discussion_r1170306053 | |
| struct Foo { | |
| a: u8, | |
| b: u8, | |
| } | |
| impl fmt::Debug for Foo { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| f.debug_struct("Foo").field("a", &self.a).field("b", &()).finish() | |
| } | |
| } | |
| // https://github.com/rust-lang/rust-clippy/pull/10616#discussion_r1175473620 | |
| mod comment1175473620 { | |
| use super::*; | |
| struct Inner { | |
| a: usize, | |
| b: usize, | |
| } | |
| struct Wrapper(Inner); | |
| impl Deref for Wrapper { | |
| type Target = Inner; | |
| fn deref(&self) -> &Self::Target { | |
| &self.0 | |
| } | |
| } | |
| impl fmt::Debug for Wrapper { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| f.debug_struct("Wrapper") | |
| .field("a", &self.a) | |
| .field("b", &self.b) | |
| .finish() | |
| } | |
| } | |
| } | |
| // https://github.com/rust-lang/rust-clippy/pull/10616#discussion_r1175488757 | |
| // PhantomData is an exception and does not need to be included | |
| struct WithPD { | |
| a: u8, | |
| b: u8, | |
| c: PhantomData<String>, | |
| } | |
| impl fmt::Debug for WithPD { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| f.debug_struct("WithPD") | |
| .field("a", &self.a) | |
| .field("b", &self.b) | |
| .finish() | |
| } | |
| } | |
| struct InClosure { | |
| a: u8, | |
| b: String, | |
| } | |
| impl fmt::Debug for InClosure { | |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { | |
| let mut d = f.debug_struct("InClosure"); | |
| d.field("a", &self.a); | |
| let mut c = || { | |
| d.field("b", &self.b); | |
| }; | |
| c(); | |
| d.finish() | |
| } | |
| } | |
| fn main() {} |