Skip to content

Commit

Permalink
Also display the underlying error message when displaying a fixit
Browse files Browse the repository at this point in the history
When the user running LLDB with default settings sees the fixit
notification it means that the auto-applied fixit didn't work. This
patch shows the underlying error message instead of just the fixit to
make it easier to understand what the error in the expression was.

Differential Revision: https://reviews.llvm.org/D101333
  • Loading branch information
adrian-prantl committed Apr 27, 2021
1 parent ca7824c commit 25bf137
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 23 deletions.
22 changes: 11 additions & 11 deletions lldb/source/Expression/UserExpression.cpp
Expand Up @@ -302,19 +302,19 @@ UserExpression::Evaluate(ExecutionContext &exe_ctx,
}

if (!parse_success) {
if (!fixed_expression->empty() && target->GetEnableNotifyAboutFixIts()) {
error.SetExpressionErrorWithFormat(
execution_results,
"expression failed to parse, fixed expression suggested:\n %s",
fixed_expression->c_str());
} else {
if (!diagnostic_manager.Diagnostics().size())
error.SetExpressionError(execution_results,
"expression failed to parse, unknown error");
std::string msg;
{
llvm::raw_string_ostream os(msg);
os << "expression failed to parse:\n";
if (!diagnostic_manager.Diagnostics().empty())
os << diagnostic_manager.GetString();
else
error.SetExpressionError(execution_results,
diagnostic_manager.GetString().c_str());
os << "unknown error";
if (target->GetEnableNotifyAboutFixIts() && fixed_expression &&
!fixed_expression->empty())
os << "\nfixed expression suggested:\n " << *fixed_expression;
}
error.SetExpressionError(execution_results, msg.c_str());
}
}

Expand Down
24 changes: 12 additions & 12 deletions lldb/test/API/commands/expression/fixits/TestFixIts.py
Expand Up @@ -132,25 +132,25 @@ def test_with_multiple_retries(self):
# Disable retries which will fail.
multiple_runs_options.SetRetriesWithFixIts(0)
value = frame.EvaluateExpression(two_runs_expr, multiple_runs_options)
self.assertIn("expression failed to parse, fixed expression suggested:",
value.GetError().GetCString())
self.assertIn("using typename T::TypeDef",
value.GetError().GetCString())
errmsg = value.GetError().GetCString()
self.assertIn("expression failed to parse", errmsg)
self.assertIn("using declaration resolved to type without 'typename'",
errmsg)
self.assertIn("fixed expression suggested:", errmsg)
self.assertIn("using typename T::TypeDef", errmsg)
# The second Fix-It shouldn't be suggested here as Clang should have
# aborted the parsing process.
self.assertNotIn("i->m",
value.GetError().GetCString())
self.assertNotIn("i->m", errmsg)

# Retry once, but the expression needs two retries.
multiple_runs_options.SetRetriesWithFixIts(1)
value = frame.EvaluateExpression(two_runs_expr, multiple_runs_options)
self.assertIn("expression failed to parse, fixed expression suggested:",
value.GetError().GetCString())
errmsg = value.GetError().GetCString()
self.assertIn("expression failed to parse", errmsg)
self.assertIn("fixed expression suggested:", errmsg)
# Both our fixed expressions should be in the suggested expression.
self.assertIn("using typename T::TypeDef",
value.GetError().GetCString())
self.assertIn("i->m",
value.GetError().GetCString())
self.assertIn("using typename T::TypeDef", errmsg)
self.assertIn("i->m", errmsg)

# Retry twice, which will get the expression working.
multiple_runs_options.SetRetriesWithFixIts(2)
Expand Down

0 comments on commit 25bf137

Please sign in to comment.