[Lldb-commits] [lldb] [lldb] Fix `po` alias by printing fix-its to the console. (PR #68452)
Pete Lawrence via lldb-commits
lldb-commits at lists.llvm.org
Fri Oct 6 20:26:45 PDT 2023
https://github.com/PortalPete updated https://github.com/llvm/llvm-project/pull/68452
>From f842928b5300c2ea98dbdc1bf3e3fe768dcf31ed Mon Sep 17 00:00:00 2001
From: Pete Lawrence <plawrence at apple.com>
Date: Thu, 5 Oct 2023 14:22:35 -1000
Subject: [PATCH] [lldb] Update the `po` alias to print Fix-Its to the console.
Modifying `po` alias to match outward FixIt behavior with `expression`.
- Fix `po` alias so that it prints out a message when applying a FixIt, just like the `expression` command.
- Add test cases for applying a FixIt with both `expression` command and `po` alias.
- Reword console messages for readability.
---
.../Commands/CommandObjectDWIMPrint.cpp | 16 +++++++++--
.../Commands/CommandObjectExpression.cpp | 9 ++++---
.../API/lang/cpp/dwim-print-fixit/Makefile | 3 +++
.../dwim-print-fixit/TestCppDWIMPrintFixIt.py | 27 +++++++++++++++++++
.../API/lang/cpp/dwim-print-fixit/main.cpp | 5 ++++
.../API/lang/cpp/expression-fixit/Makefile | 3 +++
.../TestCppExpressionFixIt.py | 26 ++++++++++++++++++
.../API/lang/cpp/expression-fixit/main.cpp | 5 ++++
8 files changed, 88 insertions(+), 6 deletions(-)
create mode 100644 lldb/test/API/lang/cpp/dwim-print-fixit/Makefile
create mode 100644 lldb/test/API/lang/cpp/dwim-print-fixit/TestCppDWIMPrintFixIt.py
create mode 100644 lldb/test/API/lang/cpp/dwim-print-fixit/main.cpp
create mode 100644 lldb/test/API/lang/cpp/expression-fixit/Makefile
create mode 100644 lldb/test/API/lang/cpp/expression-fixit/TestCppExpressionFixIt.py
create mode 100644 lldb/test/API/lang/cpp/expression-fixit/main.cpp
diff --git a/lldb/source/Commands/CommandObjectDWIMPrint.cpp b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
index 7b168eab9e02d44..ea247436323db36 100644
--- a/lldb/source/Commands/CommandObjectDWIMPrint.cpp
+++ b/lldb/source/Commands/CommandObjectDWIMPrint.cpp
@@ -172,8 +172,20 @@ 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 command applies them.
+ // The compiler errors can address any parsing issues after applying
+ // Fix-It(s).
+ if (!fixed_expression.empty() && target.GetEnableNotifyAboutFixIts()) {
+ Stream &error_stream = result.GetErrorStream();
+ error_stream << " Applying Fix-It to expression, changing it to:\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 e7e6e3820b99133..0c7cebe6a020d87 100644
--- a/lldb/source/Commands/CommandObjectExpression.cpp
+++ b/lldb/source/Commands/CommandObjectExpression.cpp
@@ -439,11 +439,12 @@ 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 command applies them.
+ // The compiler errors can address any parsing issues 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 << " Applying Fix-It to expression, changing it to:\n";
+ error_stream << " " << m_fixed_expression << "\n";
}
if (result_valobj_sp) {
diff --git a/lldb/test/API/lang/cpp/dwim-print-fixit/Makefile b/lldb/test/API/lang/cpp/dwim-print-fixit/Makefile
new file mode 100644
index 000000000000000..99998b20bcb0502
--- /dev/null
+++ b/lldb/test/API/lang/cpp/dwim-print-fixit/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/lang/cpp/dwim-print-fixit/TestCppDWIMPrintFixIt.py b/lldb/test/API/lang/cpp/dwim-print-fixit/TestCppDWIMPrintFixIt.py
new file mode 100644
index 000000000000000..e2a16f2787b0b3f
--- /dev/null
+++ b/lldb/test/API/lang/cpp/dwim-print-fixit/TestCppDWIMPrintFixIt.py
@@ -0,0 +1,27 @@
+"""
+Tests whether the do-what-I-mean (DWIM) print `po` alias applies FixIts like `expr` does
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+ def test_with_run_command(self):
+ "Confirm that the `po` command (alias) applies a FixIt " \
+ "and prints it out to the console, " \
+ "just like the `expression` command."
+
+ 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; }(); } }; 1",
+ error = True,
+ substrs=["Applying Fix-It to expression",
+ "changing it to:",
+ "class C { int i; void f() { [this]() { ++i; }(); } }"],
+ )
diff --git a/lldb/test/API/lang/cpp/dwim-print-fixit/main.cpp b/lldb/test/API/lang/cpp/dwim-print-fixit/main.cpp
new file mode 100644
index 000000000000000..e9cf11d18a6560d
--- /dev/null
+++ b/lldb/test/API/lang/cpp/dwim-print-fixit/main.cpp
@@ -0,0 +1,5 @@
+int main() {
+ long foo = 1234;
+
+ return 0; // break here
+}
diff --git a/lldb/test/API/lang/cpp/expression-fixit/Makefile b/lldb/test/API/lang/cpp/expression-fixit/Makefile
new file mode 100644
index 000000000000000..99998b20bcb0502
--- /dev/null
+++ b/lldb/test/API/lang/cpp/expression-fixit/Makefile
@@ -0,0 +1,3 @@
+CXX_SOURCES := main.cpp
+
+include Makefile.rules
diff --git a/lldb/test/API/lang/cpp/expression-fixit/TestCppExpressionFixIt.py b/lldb/test/API/lang/cpp/expression-fixit/TestCppExpressionFixIt.py
new file mode 100644
index 000000000000000..c60f1e0051d8c8e
--- /dev/null
+++ b/lldb/test/API/lang/cpp/expression-fixit/TestCppExpressionFixIt.py
@@ -0,0 +1,26 @@
+"""
+Tests whether the expression command applies FixIts
+"""
+import lldb
+from lldbsuite.test.decorators import *
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+ def test_with_run_command(self):
+ "Confirm that the `expression` command applies a FixIt " \
+ "and prints it out to the console."
+
+ self.build()
+ lldbutil.run_to_source_breakpoint(
+ self, "// break here", lldb.SBFileSpec("main.cpp")
+ )
+
+ self.expect(
+ "expr class C { int i; void f() { []() { ++i; }(); } }; 1",
+ error = True,
+ substrs=["Applying Fix-It to expression",
+ "changing it to:",
+ "class C { int i; void f() { [this]() { ++i; }(); } }"],
+ )
diff --git a/lldb/test/API/lang/cpp/expression-fixit/main.cpp b/lldb/test/API/lang/cpp/expression-fixit/main.cpp
new file mode 100644
index 000000000000000..e9cf11d18a6560d
--- /dev/null
+++ b/lldb/test/API/lang/cpp/expression-fixit/main.cpp
@@ -0,0 +1,5 @@
+int main() {
+ long foo = 1234;
+
+ return 0; // break here
+}
More information about the lldb-commits
mailing list