[debugger] Pretty print String, OsString, Vec

..and OsStr. There were changes to the Rust data structure so the old
printer doesn't work.

Change-Id: I3a67404bc39d20cc80a5c0eb93f2d6712fd5920f
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/714663
Reviewed-by: Jacob Rutherford <jruthe@google.com>
Commit-Queue: Dangyi Liu <dangyi@google.com>
diff --git a/src/developer/debug/zxdb/expr/pretty_type_manager.cc b/src/developer/debug/zxdb/expr/pretty_type_manager.cc
index 1b47b57..3236e88 100644
--- a/src/developer/debug/zxdb/expr/pretty_type_manager.cc
+++ b/src/developer/debug/zxdb/expr/pretty_type_manager.cc
@@ -236,6 +236,7 @@
 void PrettyTypeManager::AddDefaultRustPrettyTypes() {
   rust_tuple_type_ = std::make_unique<PrettyRustTuple>();
 
+  // Borrowed version of Str, OsStr.
   // Rust's "&str" type won't parse as an identifier, construct an Identifier manually.
   rust_.emplace_back(IdentifierGlob(ParsedIdentifier(IdentifierQualification::kRelative,
                                                      ParsedIdentifierComponent("&str"))),
@@ -245,20 +246,40 @@
                                                                    {"len", "length"},
                                                                    {"is_empty", "length == 0"}}));
   rust_.emplace_back(
-      InternalGlob("alloc::string::String"),
-      std::make_unique<PrettyHeapString>("vec.buf.ptr.pointer as *u8", "vec.len",
-                                         GetterList{{"as_ptr", "vec.buf.ptr.pointer as *u8"},
-                                                    {"as_mut_ptr", "vec.buf.ptr.pointer as *u8"},
-                                                    {"len", "vec.len"},
-                                                    {"capacity", "vec.buf.cap"},
-                                                    {"is_empty", "vec.len == 0"}}));
-  rust_.emplace_back(InternalGlob("alloc::vec::Vec<*>"),
-                     std::make_unique<PrettyArray>("buf.ptr.pointer", "len",
-                                                   GetterList{{"as_ptr", "buf.ptr.pointer"},
-                                                              {"as_mut_ptr", "buf.ptr.pointer"},
-                                                              {"len", "len"},
-                                                              {"capacity", "buf.cap"},
-                                                              {"is_empty", "len == 0"}}));
+      IdentifierGlob(ParsedIdentifier(IdentifierQualification::kRelative,
+                                      ParsedIdentifierComponent("&std::ffi::os_str::OsStr"))),
+      std::make_unique<PrettyHeapString>("data_ptr", "length",
+                                         GetterList{{"as_ptr", "data_ptr"},
+                                                    {"as_mut_ptr", "data_ptr"},
+                                                    {"len", "length"},
+                                                    {"is_empty", "length == 0"}}));
+  // TODO(fxbug.dev/79506): Support Rust slices.
+
+  // Owned version of String, OsString and Vec.
+  rust_.emplace_back(InternalGlob("alloc::string::String"),
+                     std::make_unique<PrettyHeapString>(
+                         "vec.buf.ptr.pointer.pointer as *u8", "vec.len",
+                         GetterList{{"as_ptr", "vec.buf.ptr.pointer.pointer as *u8"},
+                                    {"as_mut_ptr", "vec.buf.ptr.pointer.pointer as *u8"},
+                                    {"len", "vec.len"},
+                                    {"capacity", "vec.buf.cap"},
+                                    {"is_empty", "vec.len == 0"}}));
+  rust_.emplace_back(InternalGlob("std::ffi::os_str::OsString"),
+                     std::make_unique<PrettyHeapString>(
+                         "inner.inner.buf.ptr.pointer.pointer as *u8", "inner.inner.len",
+                         GetterList{{"as_ptr", "inner.inner.buf.ptr.pointer.pointer as *u8"},
+                                    {"as_mut_ptr", "inner.inner.buf.ptr.pointer.pointer as *u8"},
+                                    {"len", "inner.inner.len"},
+                                    {"capacity", "inner.inner.buf.cap"},
+                                    {"is_empty", "inner.inner.len == 0"}}));
+  rust_.emplace_back(
+      InternalGlob("alloc::vec::Vec<*>"),
+      std::make_unique<PrettyArray>("buf.ptr.pointer.pointer", "len",
+                                    GetterList{{"as_ptr", "buf.ptr.pointer.pointer"},
+                                               {"as_mut_ptr", "buf.ptr.pointer.pointer"},
+                                               {"len", "len"},
+                                               {"capacity", "buf.cap"},
+                                               {"is_empty", "len == 0"}}));
 
   // A BinaryHeap is a wrapper around a "Vec" named "data".
   rust_.emplace_back(InternalGlob("alloc::collections::binary_heap::BinaryHeap<*>"),
diff --git a/src/developer/debug/zxdb/expr/pretty_type_manager_unittest.cc b/src/developer/debug/zxdb/expr/pretty_type_manager_unittest.cc
index 6d1425c..9185280 100644
--- a/src/developer/debug/zxdb/expr/pretty_type_manager_unittest.cc
+++ b/src/developer/debug/zxdb/expr/pretty_type_manager_unittest.cc
@@ -229,8 +229,12 @@
       DwarfTag::kStructureType, "Vec<*>",
       {{"buf", MakeCollectionType(
                    DwarfTag::kStructureType, "Buffer",
-                   {{"ptr", MakeCollectionType(DwarfTag::kStructureType, "Pointer",
-                                               {{"pointer", MakeRustCharPointerType()}})}})},
+                   {{"ptr", MakeCollectionType(
+                                DwarfTag::kStructureType, "Pointer",
+                                {{"pointer",
+                                  MakeCollectionType(
+                                      DwarfTag::kStructureType, "core::ptr::non_null::NonNull<u8>",
+                                      {{"pointer", MakeRustCharPointerType()}})}})}})},
        {"len", MakeUint64Type()},
        {"cap", MakeUint64Type()}});
   SymbolTestParentSetter vec_type_parent(vec_type, vec_namespace);