JDevlieghere created this revision. JDevlieghere added a reviewer: labath. Herald added a project: LLDB.
Add YAML traits for ConstString and FileSpec so they can be serialized as part of ProcessInfo. Repository: rLLDB LLDB https://reviews.llvm.org/D76002 Files: lldb/include/lldb/Utility/ConstString.h lldb/include/lldb/Utility/FileSpec.h lldb/source/Utility/ConstString.cpp lldb/source/Utility/FileSpec.cpp lldb/unittests/Utility/ConstStringTest.cpp lldb/unittests/Utility/FileSpecTest.cpp
Index: lldb/unittests/Utility/FileSpecTest.cpp =================================================================== --- lldb/unittests/Utility/FileSpecTest.cpp +++ lldb/unittests/Utility/FileSpecTest.cpp @@ -420,3 +420,24 @@ EXPECT_TRUE(Match("", "")); } + +TEST(FileSpecTest, Yaml) { + std::string buffer; + llvm::raw_string_ostream os(buffer); + + // Serialize. + FileSpec fs_windows("F:\\bar", FileSpec::Style::windows); + llvm::yaml::Output yout(os); + yout << fs_windows; + os.flush(); + + // Deserialize. + FileSpec deserialized; + llvm::yaml::Input yin(buffer); + yin >> deserialized; + + EXPECT_EQ(deserialized.GetPathStyle(), fs_windows.GetPathStyle()); + EXPECT_EQ(deserialized.GetFilename(), fs_windows.GetFilename()); + EXPECT_EQ(deserialized.GetDirectory(), fs_windows.GetDirectory()); + EXPECT_EQ(deserialized, fs_windows); +} Index: lldb/unittests/Utility/ConstStringTest.cpp =================================================================== --- lldb/unittests/Utility/ConstStringTest.cpp +++ lldb/unittests/Utility/ConstStringTest.cpp @@ -8,6 +8,7 @@ #include "lldb/Utility/ConstString.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/Support/YAMLParser.h" #include "gtest/gtest.h" using namespace lldb_private; @@ -137,3 +138,22 @@ EXPECT_TRUE(null == static_cast<const char *>(nullptr)); EXPECT_TRUE(null != "bar"); } + +TEST(ConstStringTest, YAML) { + std::string buffer; + llvm::raw_string_ostream os(buffer); + + // Serialize. + std::vector<ConstString> strings = {ConstString("foo"), ConstString("bar"), + ConstString("")}; + llvm::yaml::Output yout(os); + yout << strings; + os.flush(); + + // Deserialize. + std::vector<ConstString> deserialized; + llvm::yaml::Input yin(buffer); + yin >> deserialized; + + EXPECT_EQ(strings, deserialized); +} Index: lldb/source/Utility/FileSpec.cpp =================================================================== --- lldb/source/Utility/FileSpec.cpp +++ lldb/source/Utility/FileSpec.cpp @@ -537,3 +537,17 @@ if (!file.empty()) Stream << file; } + +void llvm::yaml::ScalarEnumerationTraits<FileSpec::Style>::enumeration( + IO &io, FileSpec::Style &value) { + io.enumCase(value, "windows", FileSpec::Style::windows); + io.enumCase(value, "posix", FileSpec::Style::posix); + io.enumCase(value, "native", FileSpec::Style::native); +} + +void llvm::yaml::MappingTraits<FileSpec>::mapping(IO &io, FileSpec &f) { + io.mapRequired("directory", f.m_directory); + io.mapRequired("file", f.m_filename); + io.mapRequired("resolved", f.m_is_resolved); + io.mapRequired("style", f.m_style); +} Index: lldb/source/Utility/ConstString.cpp =================================================================== --- lldb/source/Utility/ConstString.cpp +++ lldb/source/Utility/ConstString.cpp @@ -337,3 +337,15 @@ llvm::StringRef Options) { format_provider<StringRef>::format(CS.GetStringRef(), OS, Options); } + +void llvm::yaml::ScalarTraits<ConstString>::output(const ConstString &Val, + void *, raw_ostream &Out) { + Out << Val.GetStringRef(); +} + +llvm::StringRef +llvm::yaml::ScalarTraits<ConstString>::input(llvm::StringRef Scalar, void *, + ConstString &Val) { + Val = ConstString(Scalar); + return {}; +} Index: lldb/include/lldb/Utility/FileSpec.h =================================================================== --- lldb/include/lldb/Utility/FileSpec.h +++ lldb/include/lldb/Utility/FileSpec.h @@ -18,6 +18,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/FormatVariadic.h" #include "llvm/Support/Path.h" +#include "llvm/Support/YAMLTraits.h" #include <stddef.h> #include <stdint.h> @@ -397,6 +398,8 @@ ConstString GetLastPathComponent() const; protected: + template <class T> friend struct llvm::yaml::MappingTraits; + // Convenience method for setting the file without changing the style. void SetFile(llvm::StringRef path); @@ -436,6 +439,16 @@ static void format(const lldb_private::FileSpec &F, llvm::raw_ostream &Stream, StringRef Style); }; + +namespace yaml { +template <> struct ScalarEnumerationTraits<lldb_private::FileSpec::Style> { + static void enumeration(IO &io, lldb_private::FileSpec::Style &style); +}; + +template <> struct MappingTraits<lldb_private::FileSpec> { + static void mapping(IO &io, lldb_private::FileSpec &f); +}; +} // namespace yaml } // namespace llvm #endif // LLDB_UTILITY_FILESPEC_H Index: lldb/include/lldb/Utility/ConstString.h =================================================================== --- lldb/include/lldb/Utility/ConstString.h +++ lldb/include/lldb/Utility/ConstString.h @@ -9,9 +9,10 @@ #ifndef LLDB_UTILITY_CONSTSTRING_H #define LLDB_UTILITY_CONSTSTRING_H -#include "llvm/ADT/StringRef.h" #include "llvm/ADT/DenseMapInfo.h" +#include "llvm/ADT/StringRef.h" #include "llvm/Support/FormatVariadic.h" +#include "llvm/Support/YAMLTraits.h" #include <stddef.h> @@ -481,6 +482,16 @@ } }; /// \} -} + +namespace yaml { +template <> struct ScalarTraits<lldb_private::ConstString> { + static void output(const lldb_private::ConstString &, void *, raw_ostream &); + static StringRef input(StringRef, void *, lldb_private::ConstString &); + static QuotingType mustQuote(StringRef S) { return QuotingType::Double; } +}; +} // namespace yaml +} // namespace llvm + +LLVM_YAML_IS_SEQUENCE_VECTOR(lldb_private::ConstString) #endif // LLDB_UTILITY_CONSTSTRING_H
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits