kastiglione updated this revision to Diff 510280.
kastiglione added a comment.

Change --apply-fixits take an argument


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D147385/new/

https://reviews.llvm.org/D147385

Files:
  lldb/include/lldb/Interpreter/OptionGroupVariable.h
  lldb/source/Commands/CommandObjectFrame.cpp
  lldb/source/Interpreter/OptionGroupVariable.cpp
  lldb/test/API/commands/frame/var/fixits/Makefile
  lldb/test/API/commands/frame/var/fixits/TestFrameVarApplyFixits.py
  lldb/test/API/commands/frame/var/fixits/main.c

Index: lldb/test/API/commands/frame/var/fixits/main.c
===================================================================
--- /dev/null
+++ lldb/test/API/commands/frame/var/fixits/main.c
@@ -0,0 +1,10 @@
+struct Structure {
+  int num;
+};
+
+int main() {
+  struct Structure s = {30};
+  struct Structure *p = &s;
+  // break here
+  return 0;
+}
Index: lldb/test/API/commands/frame/var/fixits/TestFrameVarApplyFixits.py
===================================================================
--- /dev/null
+++ lldb/test/API/commands/frame/var/fixits/TestFrameVarApplyFixits.py
@@ -0,0 +1,24 @@
+import lldb
+from lldbsuite.test.lldbtest import *
+from lldbsuite.test.decorators import *
+from lldbsuite.test import lldbutil
+
+
+class TestCase(TestBase):
+    def test_frame_variable_apply_fixits(self):
+        self.build()
+        lldbutil.run_to_source_breakpoint(self, "// break here", lldb.SBFileSpec("main.c"))
+
+        self.expect(
+            "frame variable s->num",
+            error=True,
+            startstr='error: "s" is not a pointer and -> was used to attempt to access "num". Did you mean "s.num"?',
+        )
+        self.expect("frame variable --apply-fixits on s->num", startstr="(int) s.num = 30")
+
+        self.expect(
+            "frame variable p.num",
+            error=True,
+            startstr='error: "p" is a pointer and . was used to attempt to access "num". Did you mean "p->num"?',
+        )
+        self.expect("frame variable --apply-fixits on p.num", startstr="(int) p->num = 30")
Index: lldb/test/API/commands/frame/var/fixits/Makefile
===================================================================
--- /dev/null
+++ lldb/test/API/commands/frame/var/fixits/Makefile
@@ -0,0 +1,2 @@
+C_SOURCES := main.c
+include Makefile.rules
Index: lldb/source/Interpreter/OptionGroupVariable.cpp
===================================================================
--- lldb/source/Interpreter/OptionGroupVariable.cpp
+++ lldb/source/Interpreter/OptionGroupVariable.cpp
@@ -11,14 +11,14 @@
 #include "lldb/DataFormatters/DataVisualization.h"
 #include "lldb/Host/OptionParser.h"
 #include "lldb/Interpreter/CommandInterpreter.h"
+#include "lldb/Interpreter/OptionArgParser.h"
 #include "lldb/Target/Target.h"
 #include "lldb/Utility/Status.h"
 
 using namespace lldb;
 using namespace lldb_private;
 
-// if you add any options here, remember to update the counters in
-// OptionGroupVariable::GetNumDefinitions()
+// clang-format off
 static constexpr OptionDefinition g_variable_options[] = {
     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "no-args", 'a',
      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
@@ -42,6 +42,9 @@
     {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "scope", 's',
      OptionParser::eNoArgument, nullptr, {}, 0, eArgTypeNone,
      "Show variable scope (argument, local, global, static)."},
+    {LLDB_OPT_SET_1 | LLDB_OPT_SET_2, false, "apply-fixits", 'X',
+     OptionParser::eRequiredArgument, nullptr, {}, 0, eArgTypeBoolean,
+     "simple fix-it corrections will be applied to the variable path."},
     {LLDB_OPT_SET_1, false, "summary", 'y', OptionParser::eRequiredArgument,
      nullptr, {}, 0, eArgTypeName,
      "Specify the summary that the variable output should use."},
@@ -49,6 +52,7 @@
      OptionParser::eRequiredArgument, nullptr, {}, 0, eArgTypeName,
      "Specify a summary string to use to format the variable output."},
 };
+// clang-format on
 
 static Status ValidateNamedSummary(const char *str, void *) {
   if (!str || !str[0])
@@ -70,7 +74,8 @@
     : include_frame_options(show_frame_options), show_args(false),
       show_recognized_args(false), show_locals(false), show_globals(false),
       use_regex(false), show_scope(false), show_decl(false),
-      summary(ValidateNamedSummary), summary_string(ValidateSummaryString) {}
+      apply_fixits(false), summary(ValidateNamedSummary),
+      summary_string(ValidateSummaryString) {}
 
 Status
 OptionGroupVariable::SetOptionValue(uint32_t option_idx,
@@ -102,6 +107,15 @@
   case 't':
     show_recognized_args = false;
     break;
+  case 'X': {
+    bool success = false;
+    apply_fixits = OptionArgParser::ToBoolean(option_arg, false, &success);
+    if (!success)
+      error.SetErrorStringWithFormat(
+          "Invalid boolean '%s' passed for -X option",
+          option_arg.str().c_str());
+    break;
+  }
   case 'y':
     error = summary.SetCurrentValue(option_arg);
     break;
@@ -124,6 +138,7 @@
   show_decl = false;
   use_regex = false;
   show_scope = false;
+  apply_fixits = false;
   summary.Clear();
   summary_string.Clear();
 }
Index: lldb/source/Commands/CommandObjectFrame.cpp
===================================================================
--- lldb/source/Commands/CommandObjectFrame.cpp
+++ lldb/source/Commands/CommandObjectFrame.cpp
@@ -578,9 +578,11 @@
           {
             Status error;
             uint32_t expr_path_options =
-                StackFrame::eExpressionPathOptionCheckPtrVsMember |
                 StackFrame::eExpressionPathOptionsAllowDirectIVarAccess |
                 StackFrame::eExpressionPathOptionsInspectAnonymousUnions;
+            if (!m_option_variable.apply_fixits)
+              expr_path_options |=
+                  StackFrame::eExpressionPathOptionCheckPtrVsMember;
             lldb::VariableSP var_sp;
             valobj_sp = frame->GetValueForVariableExpressionPath(
                 entry.ref(), m_varobj_options.use_dynamic, expr_path_options,
@@ -602,10 +604,16 @@
               options.SetVariableFormatDisplayLanguage(
                   valobj_sp->GetPreferredDisplayLanguage());
 
-              Stream &output_stream = result.GetOutputStream();
+              // Use the returned value's expression path, because it might
+              // differ from the input expression (when fixits are used).
+              StreamString expr_path_stream;
+              valobj_sp->GetExpressionPath(
+                  expr_path_stream,
+                  ValueObject::eGetExpressionPathFormatHonorPointers);
+              auto root_name = expr_path_stream.GetString();
               options.SetRootValueObjectName(
-                  valobj_sp->GetParent() ? entry.c_str() : nullptr);
-              valobj_sp->Dump(output_stream, options);
+                  valobj_sp->GetParent() ? root_name.data() : nullptr);
+              valobj_sp->Dump(result.GetOutputStream(), options);
             } else {
               if (auto error_cstr = error.AsCString(nullptr))
                 result.AppendError(error_cstr);
Index: lldb/include/lldb/Interpreter/OptionGroupVariable.h
===================================================================
--- lldb/include/lldb/Interpreter/OptionGroupVariable.h
+++ lldb/include/lldb/Interpreter/OptionGroupVariable.h
@@ -35,7 +35,7 @@
                                  // true)
       show_locals : 1,  // Frame option only (include_frame_options == true)
       show_globals : 1, // Frame option only (include_frame_options == true)
-      use_regex : 1, show_scope : 1, show_decl : 1;
+      use_regex : 1, show_scope : 1, show_decl : 1, apply_fixits : 1;
   OptionValueString summary;        // the name of a named summary
   OptionValueString summary_string; // a summary string
 
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to