summary refs log tree commit diff
path: root/bit_field
diff options
context:
space:
mode:
authorJingkui Wang <jkwang@google.com>2018-07-23 10:24:59 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-08-07 01:51:08 -0700
commitf226e28632d95c8b3c8d90fbaaef1eda8509fc74 (patch)
tree55d5960266ce2ce57c3150763e3e8f955d5ee437 /bit_field
parenteba6e7f9bdbb521b285b676ff0c34ba79ee8e0db (diff)
downloadcrosvm-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.rs44
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() {