teemperor created this revision.
teemperor added a reviewer: LLDB.
Herald added subscribers: lldb-commits, JDevlieghere, abidh.
Herald added a project: LLDB.

Select and delete are similar enough to implement/test this in one batch.

Completion looks like this:

  (lldb) target select 
  Available completions:
        0 -- /Users/me/test/foo ( arch=x86_64-apple-macosx10.14.0, 
platform=host, pid=65449, state=stopped )
        1 -- /Users/me/test/basic ( arch=x86_64-apple-macosx10.14.0, 
platform=host )


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D67906

Files:
  
lldb/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
  lldb/source/Commands/CommandObjectTarget.cpp

Index: lldb/source/Commands/CommandObjectTarget.cpp
===================================================================
--- lldb/source/Commands/CommandObjectTarget.cpp
+++ lldb/source/Commands/CommandObjectTarget.cpp
@@ -60,7 +60,8 @@
 
 static void DumpTargetInfo(uint32_t target_idx, Target *target,
                            const char *prefix_cstr,
-                           bool show_stopped_process_status, Stream &strm) {
+                           bool show_stopped_process_status,
+                           bool print_target_index, Stream &strm) {
   const ArchSpec &target_arch = target->GetArchitecture();
 
   Module *exe_module = target->GetExecutableModulePointer();
@@ -72,8 +73,13 @@
   if (!exe_valid)
     ::strcpy(exe_path, "<none>");
 
-  strm.Printf("%starget #%u: %s", prefix_cstr ? prefix_cstr : "", target_idx,
-              exe_path);
+  if (prefix_cstr)
+    strm << prefix_cstr;
+
+  if (print_target_index)
+    strm.Printf("target #%u: ", target_idx);
+
+  strm << exe_path;
 
   uint32_t properties = 0;
   if (target_arch.IsValid()) {
@@ -125,14 +131,36 @@
       TargetSP target_sp(target_list.GetTargetAtIndex(i));
       if (target_sp) {
         bool is_selected = target_sp.get() == selected_target_sp.get();
+        bool print_target_index = true;
         DumpTargetInfo(i, target_sp.get(), is_selected ? "* " : "  ",
-                       show_stopped_process_status, strm);
+                       show_stopped_process_status, print_target_index, strm);
       }
     }
   }
   return num_targets;
 }
 
+static void CompleteTargetIndex(CompletionRequest &request,
+                                Debugger &debugger) {
+  TargetList &target_list = debugger.GetTargetList();
+  size_t number_of_targets = target_list.GetNumTargets();
+  for (size_t target_i = 0; target_i < number_of_targets; ++target_i) {
+    // The completion is only the target index.
+    std::string completion = std::to_string(target_i);
+
+    // Generate the description.
+    TargetSP target_sp(target_list.GetTargetAtIndex(target_i));
+    StreamString stream;
+    bool show_stopped_process_status = false;
+    bool print_thread_index = false;
+    DumpTargetInfo(target_i, target_sp.get(), "", show_stopped_process_status,
+                   print_thread_index, stream);
+    llvm::StringRef description = stream.GetString().rtrim();
+
+    request.TryCompleteCurrentArg(completion, description);
+  }
+}
+
 // Note that the negation in the argument name causes a slightly confusing
 // mapping of the enum values.
 static constexpr OptionEnumValueElement g_dependents_enumaration[] = {
@@ -524,6 +552,14 @@
 
   ~CommandObjectTargetSelect() override = default;
 
+  void
+  HandleArgumentCompletion(CompletionRequest &request,
+                           OptionElementVector &opt_element_vector) override {
+    if (request.GetCursorIndex() != 0)
+      return;
+    CompleteTargetIndex(request, GetDebugger());
+  }
+
 protected:
   bool DoExecute(Args &args, CommandReturnObject &result) override {
     if (args.GetArgumentCount() == 1) {
@@ -604,6 +640,12 @@
 
   Options *GetOptions() override { return &m_option_group; }
 
+  void
+  HandleArgumentCompletion(CompletionRequest &request,
+                           OptionElementVector &opt_element_vector) override {
+    CompleteTargetIndex(request, GetDebugger());
+  }
+
 protected:
   bool DoExecute(Args &args, CommandReturnObject &result) override {
     const size_t argc = args.GetArgumentCount();
Index: lldb/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
===================================================================
--- lldb/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
+++ lldb/packages/Python/lldbsuite/test/functionalities/completion/TestCompletion.py
@@ -409,3 +409,27 @@
         # No completion for Qu because the candidate is
         # (anonymous namespace)::Quux().
         self.complete_from_to('breakpoint set -n Qu', '')
+
+    def test_target_select_and_delete(self):
+        self.build()
+        self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
+        self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
+        self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
+
+        self.complete_from_to('target select ',
+                              ['0',
+                               '1',
+                               '2'])
+
+        self.complete_from_to('target select 0 ',
+                              [])
+
+        self.complete_from_to('target delete ',
+                              ['0',
+                               '1',
+                               '2'])
+
+        self.complete_from_to('target delete 1 ',
+                              ['0',
+                               '1',
+                               '2'])
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
  • [Lldb-commits] [PATCH] ... Raphael Isemann via Phabricator via lldb-commits

Reply via email to