@@ -42,7 +42,7 @@ static void DumpStringToStreamWithNewline(Stream &strm, const std::string &s) {
4242}
4343
4444CommandReturnObject::CommandReturnObject (bool colors)
45- : m_out_stream(colors), m_err_stream(colors), m_diag_stream (colors) {}
45+ : m_out_stream(colors), m_err_stream(colors), m_colors (colors) {}
4646
4747void CommandReturnObject::AppendErrorWithFormat (const char *format, ...) {
4848 SetStatus (eReturnStatusFailed);
@@ -123,30 +123,80 @@ void CommandReturnObject::SetError(llvm::Error error) {
123123 }
124124}
125125
126- llvm::StringRef
126+ std::string
127127CommandReturnObject::GetInlineDiagnosticString (unsigned indent) {
128- RenderDiagnosticDetails (m_diag_stream, indent, true , m_diagnostics);
128+ StreamString diag_stream (m_colors);
129+ RenderDiagnosticDetails (diag_stream, indent, true , m_diagnostics);
129130 // Duplex the diagnostics to the secondary stream (but not inlined).
130- if (auto stream_sp = m_err_stream.GetStreamAtIndex (eStreamStringIndex ))
131+ if (auto stream_sp = m_err_stream.GetStreamAtIndex (eImmediateStreamIndex ))
131132 RenderDiagnosticDetails (*stream_sp, std::nullopt , false , m_diagnostics);
132133
133- // Clear them so GetErrorData() doesn't render them again.
134- m_diagnostics.clear ();
135- return m_diag_stream.GetString ();
134+ return diag_stream.GetString ().str ();
136135}
137136
138- llvm::StringRef CommandReturnObject::GetErrorString () {
139- // Diagnostics haven't been fetched; render them now (not inlined).
140- if (!m_diagnostics.empty ()) {
141- RenderDiagnosticDetails (GetErrorStream (), std::nullopt , false ,
142- m_diagnostics);
143- m_diagnostics.clear ();
144- }
137+ std::string CommandReturnObject::GetErrorString (bool with_diagnostics) {
138+ StreamString stream (m_colors);
139+ if (with_diagnostics)
140+ RenderDiagnosticDetails (stream, std::nullopt , false , m_diagnostics);
145141
146142 lldb::StreamSP stream_sp (m_err_stream.GetStreamAtIndex (eStreamStringIndex));
147143 if (stream_sp)
148- return std::static_pointer_cast<StreamString>(stream_sp)->GetString ();
149- return llvm::StringRef ();
144+ stream << std::static_pointer_cast<StreamString>(stream_sp)->GetString ();
145+ return stream.GetString ().str ();
146+ }
147+
148+ StructuredData::ObjectSP CommandReturnObject::GetErrorData () {
149+ auto make_array = []() { return std::make_unique<StructuredData::Array>(); };
150+ auto make_bool = [](bool b) {
151+ return std::make_unique<StructuredData::Boolean>(b);
152+ };
153+ auto make_dict = []() {
154+ return std::make_unique<StructuredData::Dictionary>();
155+ };
156+ auto make_int = [](unsigned i) {
157+ return std::make_unique<StructuredData::Float>(i);
158+ };
159+ auto make_string = [](llvm::StringRef s) {
160+ return std::make_unique<StructuredData::String>(s);
161+ };
162+ auto dict_up = make_dict ();
163+ dict_up->AddItem (" version" , make_int (1 ));
164+ auto array_up = make_array ();
165+ for (const DiagnosticDetail &diag : m_diagnostics) {
166+ auto detail_up = make_dict ();
167+ if (auto &sloc = diag.source_location ) {
168+ auto sloc_up = make_dict ();
169+ sloc_up->AddItem (" file" , make_string (sloc->file .GetPath ()));
170+ sloc_up->AddItem (" line" , make_int (sloc->line ));
171+ sloc_up->AddItem (" length" , make_int (sloc->length ));
172+ sloc_up->AddItem (" hidden" , make_bool (sloc->hidden ));
173+ sloc_up->AddItem (" in_user_input" , make_bool (sloc->in_user_input ));
174+ detail_up->AddItem (" source_location" , std::move (sloc_up));
175+ }
176+ llvm::StringRef severity = " unknown" ;
177+ switch (diag.severity ) {
178+ case lldb::eSeverityError:
179+ severity = " error" ;
180+ break ;
181+ case lldb::eSeverityWarning:
182+ severity = " warning" ;
183+ break ;
184+ case lldb::eSeverityInfo:
185+ severity = " note" ;
186+ break ;
187+ }
188+ detail_up->AddItem (" severity" , make_string (severity));
189+ detail_up->AddItem (" message" , make_string (diag.message ));
190+ detail_up->AddItem (" rendered" , make_string (diag.rendered ));
191+ array_up->AddItem (std::move (detail_up));
192+ }
193+ dict_up->AddItem (" details" , std::move (array_up));
194+ if (auto stream_sp = m_err_stream.GetStreamAtIndex (eStreamStringIndex)) {
195+ auto text = std::static_pointer_cast<StreamString>(stream_sp)->GetString ();
196+ if (!text.empty ())
197+ dict_up->AddItem (" text" , make_string (text));
198+ }
199+ return dict_up;
150200}
151201
152202// Similar to AppendError, but do not prepend 'Status: ' to message, and don't
0 commit comments