forked from OSchip/llvm-project
Also display the underlying error message when displaying a fixit
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
This commit is contained in:
parent
ca7824c2a8
commit
25bf137b1e
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -132,25 +132,25 @@ class ExprCommandWithFixits(TestBase):
|
|||
# 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)
|
||||
|
|
Loading…
Reference in New Issue