[Lldb-commits] [lldb] [lldb] Expose structured command diagnostics via the SBAPI. (PR #112109)
Alex Langford via lldb-commits
lldb-commits at lists.llvm.org
Mon Oct 14 10:41:33 PDT 2024
================
@@ -123,30 +123,79 @@ void CommandReturnObject::SetError(llvm::Error error) {
}
}
-llvm::StringRef
-CommandReturnObject::GetInlineDiagnosticString(unsigned indent) {
- RenderDiagnosticDetails(m_diag_stream, indent, true, m_diagnostics);
+std::string CommandReturnObject::GetInlineDiagnosticString(unsigned indent) {
+ StreamString diag_stream(m_colors);
+ RenderDiagnosticDetails(diag_stream, indent, true, m_diagnostics);
// Duplex the diagnostics to the secondary stream (but not inlined).
- if (auto stream_sp = m_err_stream.GetStreamAtIndex(eStreamStringIndex))
+ if (auto stream_sp = m_err_stream.GetStreamAtIndex(eImmediateStreamIndex))
RenderDiagnosticDetails(*stream_sp, std::nullopt, false, m_diagnostics);
- // Clear them so GetErrorData() doesn't render them again.
- m_diagnostics.clear();
- return m_diag_stream.GetString();
+ return diag_stream.GetString().str();
}
-llvm::StringRef CommandReturnObject::GetErrorString() {
- // Diagnostics haven't been fetched; render them now (not inlined).
- if (!m_diagnostics.empty()) {
- RenderDiagnosticDetails(GetErrorStream(), std::nullopt, false,
- m_diagnostics);
- m_diagnostics.clear();
- }
+std::string CommandReturnObject::GetErrorString(bool with_diagnostics) {
+ StreamString stream(m_colors);
+ if (with_diagnostics)
+ RenderDiagnosticDetails(stream, std::nullopt, false, m_diagnostics);
lldb::StreamSP stream_sp(m_err_stream.GetStreamAtIndex(eStreamStringIndex));
if (stream_sp)
- return std::static_pointer_cast<StreamString>(stream_sp)->GetString();
- return llvm::StringRef();
+ stream << std::static_pointer_cast<StreamString>(stream_sp)->GetString();
+ return stream.GetString().str();
+}
+
+StructuredData::ObjectSP CommandReturnObject::GetErrorData() {
+ auto make_array = []() { return std::make_unique<StructuredData::Array>(); };
+ auto make_bool = [](bool b) {
+ return std::make_unique<StructuredData::Boolean>(b);
+ };
+ auto make_dict = []() {
+ return std::make_unique<StructuredData::Dictionary>();
+ };
+ auto make_int = [](unsigned i) {
+ return std::make_unique<StructuredData::UnsignedInteger>(i);
+ };
+ auto make_string = [](llvm::StringRef s) {
+ return std::make_unique<StructuredData::String>(s);
+ };
+ auto dict_up = make_dict();
+ dict_up->AddItem("version", make_int(1));
+ auto array_up = make_array();
+ for (const DiagnosticDetail &diag : m_diagnostics) {
+ auto detail_up = make_dict();
+ if (auto &sloc = diag.source_location) {
+ auto sloc_up = make_dict();
+ sloc_up->AddItem("file", make_string(sloc->file.GetPath()));
+ sloc_up->AddItem("line", make_int(sloc->line));
+ sloc_up->AddItem("length", make_int(sloc->length));
+ sloc_up->AddItem("hidden", make_bool(sloc->hidden));
+ sloc_up->AddItem("in_user_input", make_bool(sloc->in_user_input));
+ detail_up->AddItem("source_location", std::move(sloc_up));
+ }
+ llvm::StringRef severity = "unknown";
+ switch (diag.severity) {
+ case lldb::eSeverityError:
+ severity = "error";
+ break;
+ case lldb::eSeverityWarning:
+ severity = "warning";
+ break;
+ case lldb::eSeverityInfo:
+ severity = "note";
----------------
bulbazord wrote:
Why is the severity for "Info" written as "note"? Is there precedent here that I'm unaware of?
https://github.com/llvm/llvm-project/pull/112109
More information about the lldb-commits
mailing list