<div dir="ltr">Finally following up here...<br><div><br></div><div>We ended up writing a JSON parser and checking it in under clangd/. We've been using that for a while now without hitting new problems.</div><div>The header is here: <a href="https://reviews.llvm.org/source/clang-tools-extra/browse/clang-tools-extra/trunk/clangd/JSONExpr.h">https://reviews.llvm.org/source/clang-tools-extra/browse/clang-tools-extra/trunk/clangd/JSONExpr.h</a></div><div>It's a DOM-based approach with objects on the heap. There's no streaming parser, though one could be bolted on for e.g. long arrays. There are some weak conventions around marshalling to structs with ADL functions. Compared to what was described in my doc, it's simpler but less efficient, dropping the arena representation.</div><div><br></div><div>(The reasons for not reusing an existing library were covered here: <a href="https://groups.google.com/forum/#!topic/llvm-dev/5rryBKDY8eY">https://groups.google.com/forum/#!topic/llvm-dev/5rryBKDY8eY</a>)</div><div><br></div><div>There's at least some desire to reuse this more widely (I just talked to Pavel about LLDB). So I'd propose lifting this up to llvm/Support/JSON.h. (Dependencies are only Support and ADT).</div><div><br></div><div>Let me know if anyone has concerns!</div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Oct 27, 2017 at 9:53 PM Sam McCall <<a href="mailto:sammccall@google.com">sammccall@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>We don't have a dedicated JSON library in the LLVM tree, I'd like to add one. The pressing need is for clangd, but we have other tools that read/write JSON too.</div><div><br></div><div>I'm proposing we write a new one, rather than importing a third-party library (licensing/integration reasons), on or extending YamlParser/YamlIO (usability/flexibility). I lean towards a design that parses a full DOM at once, and provides literal-like syntax for composing documents.</div><div><br></div><div>I've written a document laying out the reasons for taking this path, and my proposal for a design (with links to a prototype)</div><a href="https://docs.google.com/document/d/1OEF9IauWwNuSigZzvvbjc1cVS1uGHRyGTXaoy3DjqM4/edit" target="_blank">https://docs.google.com/document/d/1OEF9IauWwNuSigZzvvbjc1cVS1uGHRyGTXaoy3DjqM4/edit</a><br><div>(Comments are enabled, but high-level discussion probably belongs on the list instead.)<br></div><div><br></div><div>What do you think? I'm particularly interested in which parts of LLVM produce/consume JSON (or might want to), and what they need. I'm mostly familiar with the stuff in clang-tools-extra.</div><div><br></div><div>Cheers, Sam</div></div>
</blockquote></div>