Lift JSON library from clang-tools-extra/clangd to llvm/Support.

Authored by sammccall on Jul 9 2018, 3:05 AM.


Lift JSON library from clang-tools-extra/clangd to llvm/Support.

This consists of four main parts:

  • an type json::Expr representing JSON values of dynamic kind, which can be composed, inspected, and modified
  • a JSON parser from string -> json::Expr
  • a JSON printer from json::Expr -> string, with optional pretty-printing
  • a convention for mapping json::Expr <=> native types (fromJSON/toJSON) Mapping functions are provided for primitives (e.g. int, vector) and the ObjectMapper helper helps implement fromJSON for struct/object types.

Based on clangd's usage, a couple of places I'd appreciate review attention:

  • fromJSON returns only bool. A richer error-signaling mechanism may be useful to provide useful messages, or let recursive fromJSONs (containers/structs) do careful error recovery.
  • should json::obj be always explicitly written (like json::ary)
  • there's no streaming parse API. I suspect there are some simple wins like a callback API where the document is a long array, and each element is small. But this can probably be bolted on easily when we see the need.

Reviewers: bkramer, labath

Subscribers: mgorny, ilya-biryukov, ioeric, MaskRay, llvm-commits

Differential Revision: https://reviews.llvm.org/D45753

llvm-svn: 336534