aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lldb/source/Commands/CommandObjectDWIMPrint.cpp15
-rw-r--r--lldb/source/Commands/CommandObjectExpression.cpp8
-rw-r--r--lldb/test/API/commands/expression/fixits/TestFixIts.py8
-rw-r--r--lldb/test/API/lang/cpp/fixits/Makefile3
-rw-r--r--lldb/test/API/lang/cpp/fixits/TestCppFixIts.py44
-rw-r--r--lldb/test/API/lang/cpp/fixits/main.cpp5
6 files changed, 75 insertions, 8 deletions
diff --git a/lldb/source/Commands/CommandObjectDWIMPrint.cpp b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
index 7b168ea..bdc17c9 100644
--- a/lldb/source/Commands/CommandObjectDWIMPrint.cpp
+++ b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -172,8 +172,19 @@ bool CommandObjectDWIMPrint::DoExecute(StringRef command,
{
auto *exe_scope = m_exe_ctx.GetBestExecutionContextScope();
ValueObjectSP valobj_sp;
- ExpressionResults expr_result =
- target.EvaluateExpression(expr, exe_scope, valobj_sp, eval_options);
+ std::string fixed_expression;
+
+ ExpressionResults expr_result = target.EvaluateExpression(
+ expr, exe_scope, valobj_sp, eval_options, &fixed_expression);
+
+ // Only mention Fix-Its if the expression evaluator applied them.
+ // Compiler errors refer to the final expression after applying Fix-It(s).
+ if (!fixed_expression.empty() && target.GetEnableNotifyAboutFixIts()) {
+ Stream &error_stream = result.GetErrorStream();
+ error_stream << " Evaluated this expression after applying Fix-It(s):\n";
+ error_stream << " " << fixed_expression << "\n";
+ }
+
if (expr_result == eExpressionCompleted) {
if (verbosity != eDWIMPrintVerbosityNone) {
StringRef flags;
diff --git a/lldb/source/Commands/CommandObjectExpression.cpp b/lldb/source/Commands/CommandObjectExpression.cpp
index e7e6e38..2834be6 100644
--- a/lldb/source/Commands/CommandObjectExpression.cpp
+++ b/lldb/source/Commands/CommandObjectExpression.cpp
@@ -439,11 +439,11 @@ bool CommandObjectExpression::EvaluateExpression(llvm::StringRef expr,
ExpressionResults success = target.EvaluateExpression(
expr, frame, result_valobj_sp, eval_options, &m_fixed_expression);
- // We only tell you about the FixIt if we applied it. The compiler errors
- // will suggest the FixIt if it parsed.
+ // Only mention Fix-Its if the expression evaluator applied them.
+ // Compiler errors refer to the final expression after applying Fix-It(s).
if (!m_fixed_expression.empty() && target.GetEnableNotifyAboutFixIts()) {
- error_stream.Printf(" Fix-it applied, fixed expression was: \n %s\n",
- m_fixed_expression.c_str());
+ error_stream << " Evaluated this expression after applying Fix-It(s):\n";
+ error_stream << " " << m_fixed_expression << "\n";
}
if (result_valobj_sp) {
diff --git a/lldb/test/API/commands/expression/fixits/TestFixIts.py b/lldb/test/API/commands/expression/fixits/TestFixIts.py
index 3bdeb84..38b2428 100644
--- a/lldb/test/API/commands/expression/fixits/TestFixIts.py
+++ b/lldb/test/API/commands/expression/fixits/TestFixIts.py
@@ -22,7 +22,9 @@ class ExprCommandWithFixits(TestBase):
self.assertEqual(
result, lldb.eReturnStatusSuccessFinishResult, ret_val.GetError()
)
- self.assertIn("Fix-it applied", ret_val.GetError())
+ self.assertIn(
+ "Evaluated this expression after applying Fix-It(s):", ret_val.GetError()
+ )
def test_with_target(self):
"""Test calling expressions with errors that can be fixed by the FixIts."""
@@ -99,7 +101,9 @@ class ExprCommandWithFixits(TestBase):
)
self.assertEqual(result, lldb.eReturnStatusFailed, ret_val.GetError())
- self.assertIn("Fix-it applied, fixed expression was:", ret_val.GetError())
+ self.assertIn(
+ "Evaluated this expression after applying Fix-It(s):", ret_val.GetError()
+ )
self.assertIn("null_pointer->first", ret_val.GetError())
# The final function call runs into SIGILL on aarch64-linux.
diff --git a/lldb/test/API/lang/cpp/fixits/Makefile b/lldb/test/API/lang/cpp/fixits/Makefile
new file mode 100644
index 0000000..99998b2
--- /dev/null
+++ b/lldb/test/API/lang/cpp/fixits/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/lang/cpp/fixits/TestCppFixIts.py b/lldb/test/API/lang/cpp/fixits/TestCppFixIts.py
new file mode 100644
index 0000000..34b52f7
--- /dev/null
+++ b/lldb/test/API/lang/cpp/fixits/TestCppFixIts.py
@@ -0,0 +1,44 @@
+"""
+Tests a C++ fixit for the `expr` command and
+`po` alias (aka DWIM aka "do what I mean") alias.
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+ def test_fixit_with_dwim(self):
+ """Confirms `po` shows an expression after applying Fix-It(s)."""
+
+ self.build()
+ lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+
+ self.expect(
+ "dwim-print -O -- class C { int i; void f() { []() { ++i; }(); } }; 42",
+ error=True,
+ substrs=[
+ "Evaluated this expression after applying Fix-It(s)",
+ "class C { int i; void f() { [this]() { ++i; }(); } }",
+ ],
+ )
+
+ def test_fixit_with_expression(self):
+ """Confirms `expression` shows an expression after applying Fix-It(s)."""
+
+ self.build()
+ lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+
+ self.expect(
+ "expr class C { int i; void f() { []() { ++i; }(); } }; 42",
+ error=True,
+ substrs=[
+ "Evaluated this expression after applying Fix-It(s)",
+ "class C { int i; void f() { [this]() { ++i; }(); } }",
+ ],
+ )
diff --git a/lldb/test/API/lang/cpp/fixits/main.cpp b/lldb/test/API/lang/cpp/fixits/main.cpp
new file mode 100644
index 0000000..e9cf11d
--- /dev/null
+++ b/lldb/test/API/lang/cpp/fixits/main.cpp
@@ -0,0 +1,5 @@
+int main() {
+ long foo = 1234;
+
+ return 0; // break here
+}