[JSON] Facility to track position within an object and report errors.
authorSam McCall <sam.mccall@gmail.com>
Wed, 23 Sep 2020 22:01:45 +0000 (00:01 +0200)
committerSam McCall <sam.mccall@gmail.com>
Wed, 23 Sep 2020 22:09:09 +0000 (00:09 +0200)
commit16619e7139bdcb0021598ba76cb5cf30ac669dbb
tree238b7b4841dd5b808ee9ceefe2ad482f1615a56c
parent8f2c31f22b974da2c0fbc5de0ce4dceffe8ed0b8
[JSON] Facility to track position within an object and report errors.

This error model should be rich enough for most applications. It comprises:

- a name for the root object, so the user knows what we're parsing
- a path from the root object to the JSON node most associated with the error
- a local error message

This can be presented as an llvm::Error e.g.
  "expected string at ConfigFile.credentials[0].username"

It's designed to be cheap: Paths are a linked list of lightweight
objects on the stack. No heap allocations unless errors are encountered.

A subsequent commit will make use of this in the JSON-to-object
translation facilities: fromJSON and ObjectMapper.
However it's independent of these and can be used for e.g. validation alone.

Another subsequent commit will support showing the error in its context
within the parsed value.

Differential Revision: https://reviews.llvm.org/D88103
llvm/include/llvm/Support/JSON.h
llvm/lib/Support/JSON.cpp
llvm/unittests/Support/JSONTest.cpp