#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>
}
};
/// \}
-}
+
+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
#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>
ConstString GetLastPathComponent() const;
protected:
+ friend struct llvm::yaml::MappingTraits<FileSpec>;
+
// Convenience method for setting the file without changing the style.
void SetFile(llvm::StringRef path);
/// Dump a FileSpec object to a stream
Stream &operator<<(Stream &s, const FileSpec &f);
+/// Prevent ODR violations with traits for llvm::sys::path::Style.
+LLVM_YAML_STRONG_TYPEDEF(FileSpec::Style, FileSpecStyle)
} // namespace lldb_private
namespace llvm {
static void format(const lldb_private::FileSpec &F, llvm::raw_ostream &Stream,
StringRef Style);
};
+
+namespace yaml {
+template <> struct ScalarEnumerationTraits<lldb_private::FileSpecStyle> {
+ static void enumeration(IO &io, lldb_private::FileSpecStyle &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
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 {};
+}
if (!file.empty())
Stream << file;
}
+
+void llvm::yaml::ScalarEnumerationTraits<FileSpecStyle>::enumeration(
+ IO &io, FileSpecStyle &value) {
+ io.enumCase(value, "windows", FileSpecStyle(FileSpec::Style::windows));
+ io.enumCase(value, "posix", FileSpecStyle(FileSpec::Style::posix));
+ io.enumCase(value, "native", FileSpecStyle(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);
+ FileSpecStyle style = f.m_style;
+ io.mapRequired("style", style);
+ f.m_style = style;
+}
#include "lldb/Utility/ConstString.h"
#include "llvm/Support/FormatVariadic.h"
+#include "llvm/Support/YAMLParser.h"
#include "gtest/gtest.h"
using namespace lldb_private;
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);
+}
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);
+}