[Support] Allow JSON serialization of Optional<T> for supported T.

This is ported from r333881 to JSON's new home.

llvm-svn: 336542
This commit is contained in:
Sam McCall 2018-07-09 12:26:09 +00:00
parent d93eaeb7c3
commit 7e4234fc97
2 changed files with 8 additions and 0 deletions

View File

@ -57,6 +57,7 @@ namespace json {
class Array;
class ObjectKey;
class Value;
template <typename T> Value toJSON(const llvm::Optional<T> &Opt);
/// An Object is a JSON object, which maps strings to heterogenous JSON values.
/// It simulates DenseMap<ObjectKey, Value>. ObjectKey is a maybe-owned string.
@ -579,6 +580,11 @@ bool fromJSON(const Value &E, std::map<std::string, T> &Out) {
return false;
}
// Allow serialization of Optional<T> for supported T.
template <typename T> Value toJSON(const llvm::Optional<T> &Opt) {
return Opt ? Value(*Opt) : Value(nullptr);
}
/// Helper for mapping JSON objects onto protocol structs.
///
/// Example:

View File

@ -37,6 +37,8 @@ TEST(JSONTest, Constructors) {
EXPECT_EQ(R"({"A":{"B":{}}})", s(Object{{"A", Object{{"B", Object{}}}}}));
EXPECT_EQ(R"({"A":{"B":{"X":"Y"}}})",
s(Object{{"A", Object{{"B", Object{{"X", "Y"}}}}}}));
EXPECT_EQ("null", s(llvm::Optional<double>()));
EXPECT_EQ("2.5", s(llvm::Optional<double>(2.5)));
}
TEST(JSONTest, StringOwnership) {