[Lldb-commits] [PATCH] D101333: Also display the underlying error message when displaying a fixit

Adrian Prantl via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Mon Apr 26 16:49:32 PDT 2021


aprantl created this revision.
aprantl added reviewers: teemperor, shafik, jingham.
aprantl requested review of this revision.

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.


https://reviews.llvm.org/D101333

Files:
  lldb/source/Expression/UserExpression.cpp
  lldb/test/API/commands/expression/fixits/TestFixIts.py


Index: lldb/test/API/commands/expression/fixits/TestFixIts.py
===================================================================
--- lldb/test/API/commands/expression/fixits/TestFixIts.py
+++ lldb/test/API/commands/expression/fixits/TestFixIts.py
@@ -132,25 +132,25 @@
         # 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)
Index: lldb/source/Expression/UserExpression.cpp
===================================================================
--- lldb/source/Expression/UserExpression.cpp
+++ lldb/source/Expression/UserExpression.cpp
@@ -302,19 +302,19 @@
     }
 
     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().size())
+          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());
     }
   }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D101333.340684.patch
Type: text/x-patch
Size: 3709 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20210426/532a682c/attachment.bin>


More information about the lldb-commits mailing list