12#include "llvm/ADT/StringExtras.h"
13#include "llvm/Support/MemoryBuffer.h"
25 llvm::Expected<json::Value> value = json::parse(json_text);
27 llvm::consumeError(value.takeError());
37 auto buffer_or_error = llvm::MemoryBuffer::getFile(input_spec.
GetPath());
38 if (!buffer_or_error) {
40 "could not open input file: {0} - {1}.", input_spec.
GetPath(),
41 buffer_or_error.getError().message());
44 llvm::Expected<json::Value> value =
45 json::parse(buffer_or_error.get()->getBuffer().str());
59 if (
const json::Object *O = value.getAsObject())
62 if (
const json::Array *A = value.getAsArray())
65 if (
auto s = value.getAsString())
66 return std::make_shared<StructuredData::String>(*s);
68 if (
auto b = value.getAsBoolean())
69 return std::make_shared<StructuredData::Boolean>(*b);
71 if (
auto u = value.getAsUINT64())
72 return std::make_shared<StructuredData::UnsignedInteger>(*u);
74 if (
auto i = value.getAsInteger())
75 return std::make_shared<StructuredData::SignedInteger>(*i);
77 if (
auto d = value.getAsNumber())
78 return std::make_shared<StructuredData::Float>(*d);
80 if (
auto n = value.getAsNull())
81 return std::make_shared<StructuredData::Null>();
87 auto dict_up = std::make_unique<StructuredData::Dictionary>();
88 for (
const auto &[key, value] :
object) {
90 dict_up->AddItem(key, value_sp);
92 return std::move(dict_up);
96 auto array_up = std::make_unique<StructuredData::Array>();
97 for (
const json::Value &value : array) {
99 array_up->AddItem(value_sp);
101 return std::move(array_up);
107 std::pair<llvm::StringRef, llvm::StringRef> match = path.split(
'.');
108 llvm::StringRef key = match.first;
115 if (match.second.empty())
118 return value->GetObjectForDotSeparatedPath(match.second);
122 std::pair<llvm::StringRef, llvm::StringRef> match = path.split(
'[');
123 if (match.second.empty())
124 return shared_from_this();
127 if (!llvm::to_integer(match.second, val, 10))
133 return shared_from_this();
137 json::OStream stream(llvm::outs(), pretty_print ? 2 : 0);
143 for (
const auto &item_sp :
m_items) {
144 item_sp->Serialize(s);
164 s.attributeBegin(key);
165 object->Serialize(s);
177 s.value(llvm::formatv(
"{0:X}",
m_object));
195 for (
const auto &item_sp :
m_items) {
205 s.
Printf(
"[%zu]:", index++);
218 item_sp->GetDescription(s);
219 if (item_sp != *(--
m_items.end()))
230 const size_t num_entries =
GetSize();
231 size_t entry_index = 0;
234 const bool is_last = ++entry_index == num_entries;
237 if (key.empty() || !
object)
249 bool should_indent =
IsRecordType(object->shared_from_this());
258 object->GetDescription(s);
static llvm::raw_ostream & error(Stream &strm)
static StructuredData::ObjectSP ParseJSONObject(const json::Object &object)
static StructuredData::ObjectSP ParseJSONArray(const json::Array &array)
size_t GetPath(char *path, size_t max_path_length, bool denormalize=true) const
Extract the full path to the file.
static Status static Status FromErrorStringWithFormatv(const char *format, Args &&...args)
static Status FromError(llvm::Error error)
Avoid using this in new code. Migrate APIs to llvm::Expected instead.
A stream class that can stream formatted output to a file.
void Format(const char *format, Args &&... args)
Forwards the arguments to llvm::formatv and writes to the stream.
size_t Indent(llvm::StringRef s="")
Indent the current line in the stream.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t PutCString(llvm::StringRef cstr)
Output a C string to the stream.
void SetIndentLevel(unsigned level)
Set the current indentation level.
size_t EOL()
Output and End of Line character to the stream.
void IndentLess(unsigned amount=2)
Decrement the current indentation level.
void IndentMore(unsigned amount=2)
Increment the current indentation level.
unsigned GetIndentLevel() const
Get the current indentation level.
void Serialize(llvm::json::OStream &s) const override
ObjectSP GetItemAtIndex(size_t idx) const
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
void ForEachSorted(std::function< bool(llvm::StringRef key, Object *object)> const &callback) const
Like ForEach, but visits the entries in key order, for stable output.
ObjectSP GetValueForKey(llvm::StringRef key) const
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
void GetDescription(lldb_private::Stream &s) const override
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
Dictionary * GetAsDictionary()
void DumpToStdout(bool pretty_print=true) const
Object(lldb::StructuredDataType t=lldb::eStructuredDataTypeInvalid)
lldb::StructuredDataType GetType() const
ObjectSP GetObjectForDotSeparatedPath(llvm::StringRef path)
void GetDescription(lldb_private::Stream &s) const override
void Serialize(llvm::json::OStream &s) const override
static ObjectSP ParseJSONValue(const llvm::json::Value &value)
static bool IsRecordType(const ObjectSP object_sp)
std::shared_ptr< Object > ObjectSP
static ObjectSP ParseJSON(llvm::StringRef json_text)
static ObjectSP ParseJSONFromFile(const FileSpec &file, Status &error)
A class that represents a running process on the host machine.
StructuredData::ObjectSP Serialize(llvm::ArrayRef< DiagnosticDetail > details)
@ eStructuredDataTypeDictionary
@ eStructuredDataTypeArray