[Lldb-commits] [lldb] [lldb] Inline expression evaluator error visualization (PR #106470)
Med Ismail Bennani via lldb-commits
lldb-commits at lists.llvm.org
Tue Sep 24 16:35:48 PDT 2024
================
@@ -486,19 +603,37 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
result.SetStatus(eReturnStatusSuccessFinishResult);
} else {
- const char *error_cstr = result_valobj_sp->GetError().AsCString();
- if (error_cstr && error_cstr[0]) {
- const size_t error_cstr_len = strlen(error_cstr);
- const bool ends_with_newline = error_cstr[error_cstr_len - 1] == '\n';
- if (strstr(error_cstr, "error:") != error_cstr)
- error_stream.PutCString("error: ");
- error_stream.Write(error_cstr, error_cstr_len);
- if (!ends_with_newline)
- error_stream.EOL();
+ // Retrieve the diagnostics.
+ std::vector<DiagnosticDetail> details;
+ llvm::consumeError(
+ llvm::handleErrors(result_valobj_sp->GetError().ToError(),
+ [&](DetailedExpressionError &error) {
+ details.push_back(error.GetDetail());
+ }));
+ // Find the position of the expression in the command.
+ std::optional<uint16_t> expr_pos;
+ size_t nchar = m_original_command.find(expr);
+ if (nchar != std::string::npos)
+ expr_pos = nchar + GetDebugger().GetPrompt().size();
+
+ if (!details.empty()) {
+ bool multiline = expr.contains('\n');
+ RenderDiagnosticDetails(error_stream, expr_pos, multiline, details);
} else {
- error_stream.PutCString("error: unknown error\n");
+ const char *error_cstr = result_valobj_sp->GetError().AsCString();
+ if (error_cstr && error_cstr[0]) {
+ const size_t error_cstr_len = strlen(error_cstr);
+ const bool ends_with_newline =
+ error_cstr[error_cstr_len - 1] == '\n';
+ if (strstr(error_cstr, "error:") != error_cstr)
----------------
medismailben wrote:
Instead of using c-string you could wrap it in an `llvm::StringRef` and simplify this part here.
https://github.com/llvm/llvm-project/pull/106470
More information about the lldb-commits
mailing list