[Support] Allow JSON serialization of Optional<T> for supported T.
authorSam McCall <sam.mccall@gmail.com>
Mon, 9 Jul 2018 12:26:09 +0000 (12:26 +0000)
committerSam McCall <sam.mccall@gmail.com>
Mon, 9 Jul 2018 12:26:09 +0000 (12:26 +0000)
This is ported from r333881 to JSON's new home.

llvm-svn: 336542

llvm/include/llvm/Support/JSON.h
llvm/unittests/Support/JSONTest.cpp

index 4b00943..cb08e4a 100644 (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:
index 08307c1..07580aa 100644 (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) {