diff options
author | Jingkui Wang <jkwang@google.com> | 2018-07-23 10:24:59 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-08-07 01:51:08 -0700 |
commit | f226e28632d95c8b3c8d90fbaaef1eda8509fc74 (patch) | |
tree | 55d5960266ce2ce57c3150763e3e8f955d5ee437 /bit_field | |
parent | eba6e7f9bdbb521b285b676ff0c34ba79ee8e0db (diff) | |
download | crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.tar crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.tar.gz crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.tar.bz2 crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.tar.lz crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.tar.xz crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.tar.zst crosvm-f226e28632d95c8b3c8d90fbaaef1eda8509fc74.zip |
bitfield: Add fmt::Debug
implements fmt::Debug for bitfield BUG=chromium:831850 TEST=cargo test Change-Id: I58c2211a50726aaea0ea45164ae07c7b38eddea7 Reviewed-on: https://chromium-review.googlesource.com/1147111 Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com> Tested-by: Jingkui Wang <jkwang@google.com> Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'bit_field')
-rw-r--r-- | bit_field/bit_field_derive/bit_field_derive.rs | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/bit_field/bit_field_derive/bit_field_derive.rs b/bit_field/bit_field_derive/bit_field_derive.rs index 1f2290d..cc5c070 100644 --- a/bit_field/bit_field_derive/bit_field_derive.rs +++ b/bit_field/bit_field_derive/bit_field_derive.rs @@ -46,7 +46,10 @@ fn bitfield_impl(ast: DeriveInput) -> Tokens { }; let ident = Ident::new(struct_name, Span::call_site()); - let test_mod_ident = Ident::new(format!("test_{}", struct_name).as_str(), Span::call_site()); + let test_mod_ident = Ident::new( + format!("test_{}", struct_name.to_lowercase()).as_str(), + Span::call_site(), + ); // Name of the struct let name = quote!(#ident); let vis = ast.vis.clone(); @@ -72,6 +75,7 @@ fn bitfield_impl(ast: DeriveInput) -> Tokens { let bits_impl = get_bits_impl(&name); let fields_impl = get_fields_impl(fields.as_slice()); let tests_impl = get_tests_impl(&name, fields.as_slice()); + let debug_fmt_impl = get_debug_fmt_impl(&name, fields.as_slice()); quote!( #(#attrs)* #struct_def @@ -79,6 +83,8 @@ fn bitfield_impl(ast: DeriveInput) -> Tokens { impl #name { #(#fields_impl)* } + + #debug_fmt_impl #[cfg(test)] mod #test_mod_ident { use super::*; @@ -201,6 +207,30 @@ fn get_fields_impl(fields: &[(String, Tokens)]) -> Vec<Tokens> { impls } +// Implement setter and getter for all fields. +fn get_debug_fmt_impl(name: &Tokens, fields: &[(String, Tokens)]) -> Tokens { + // print fields: + let mut impls = Vec::new(); + for &(ref name, ref _ty) in fields { + let getter_ident = Ident::new(format!("get_{}", name).as_str(), Span::call_site()); + impls.push(quote!( + .field(#name, &self.#getter_ident()) + )); + } + + let name_str = format!("{}", name); + quote! ( + impl std::fmt::Debug for #name { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct(#name_str) + #(#impls)* + .finish() + } + } + ) +} + +// Implement test. fn get_tests_impl(struct_name: &Tokens, fields: &[(String, Tokens)]) -> Vec<Tokens> { let mut field_types = Vec::new(); for &(ref _name, ref ty) in fields { @@ -446,8 +476,18 @@ mod tests { return self.set(offset, BitField5::FIELD_WIDTH, val as u64); } } + + impl std::fmt::Debug for MyBitField { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("MyBitField") + .field("a", &self.get_a()) + .field("b", &self.get_b()) + .field("c", &self.get_c()) + .finish() + } + } #[cfg(test)] - mod test_MyBitField { + mod test_mybitfield { use super::*; #[test] fn test_total_size() { |