[Lldb-commits] [lldb] 4f3559d - [lldb] watchpoint ID common completion for commands `watchpoint delete/enable/disable/modify/ignore`
Raphael Isemann via lldb-commits
lldb-commits at lists.llvm.org
Tue Aug 11 05:25:39 PDT 2020
Author: Gongyu Deng
Date: 2020-08-11T14:25:09+02:00
New Revision: 4f3559db1f313eed8bd84377de0fb2300a58125b
URL: https://github.com/llvm/llvm-project/commit/4f3559db1f313eed8bd84377de0fb2300a58125b
DIFF: https://github.com/llvm/llvm-project/commit/4f3559db1f313eed8bd84377de0fb2300a58125b.diff
LOG: [lldb] watchpoint ID common completion for commands `watchpoint delete/enable/disable/modify/ignore`
1. Added a common completion WatchPointIDs to complete with a list of the IDs of the current watchpoints;
2. Applied the completion to these commands: watchpoint delete/enable/disable/modify/ignore;
3. Added a correlated test case.
Reviewed By: teemperor
Differential Revision: https://reviews.llvm.org/D84104
Added:
Modified:
lldb/include/lldb/Interpreter/CommandCompletions.h
lldb/source/Commands/CommandCompletions.cpp
lldb/source/Commands/CommandObjectWatchpoint.cpp
lldb/test/API/functionalities/completion/TestCompletion.py
Removed:
################################################################################
diff --git a/lldb/include/lldb/Interpreter/CommandCompletions.h b/lldb/include/lldb/Interpreter/CommandCompletions.h
index 105c43528bec..a744b3fd849d 100644
--- a/lldb/include/lldb/Interpreter/CommandCompletions.h
+++ b/lldb/include/lldb/Interpreter/CommandCompletions.h
@@ -43,10 +43,11 @@ class CommandCompletions {
eModuleUUIDCompletion = (1u << 15),
eStopHookIDCompletion = (1u << 16),
eThreadIndexCompletion = (1u << 17),
+ eWatchPointIDCompletion = (1u << 18),
// This item serves two purposes. It is the last element in the enum, so
// you can add custom enums starting from here in your Option class. Also
// if you & in this bit the base code will not process the option.
- eCustomCompletion = (1u << 18)
+ eCustomCompletion = (1u << 19)
};
static bool InvokeCommonCompletionCallbacks(
@@ -119,6 +120,9 @@ class CommandCompletions {
static void ThreadIndexes(CommandInterpreter &interpreter,
CompletionRequest &request, SearchFilter *searcher);
+
+ static void WatchPointIDs(CommandInterpreter &interpreter,
+ CompletionRequest &request, SearchFilter *searcher);
};
} // namespace lldb_private
diff --git a/lldb/source/Commands/CommandCompletions.cpp b/lldb/source/Commands/CommandCompletions.cpp
index 526efe32fb48..4ed11e14b84f 100644
--- a/lldb/source/Commands/CommandCompletions.cpp
+++ b/lldb/source/Commands/CommandCompletions.cpp
@@ -9,6 +9,7 @@
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringSet.h"
+#include "lldb/Breakpoint/Watchpoint.h"
#include "lldb/Core/FileSpecList.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/PluginManager.h"
@@ -68,6 +69,7 @@ bool CommandCompletions::InvokeCommonCompletionCallbacks(
{eFrameIndexCompletion, CommandCompletions::FrameIndexes},
{eStopHookIDCompletion, CommandCompletions::StopHookIDs},
{eThreadIndexCompletion, CommandCompletions::ThreadIndexes},
+ {eWatchPointIDCompletion, CommandCompletions::WatchPointIDs},
{eNoCompletion, nullptr} // This one has to be last in the list.
};
@@ -697,3 +699,21 @@ void CommandCompletions::ThreadIndexes(CommandInterpreter &interpreter,
strm.GetString());
}
}
+
+void CommandCompletions::WatchPointIDs(CommandInterpreter &interpreter,
+ CompletionRequest &request,
+ SearchFilter *searcher) {
+ const ExecutionContext &exe_ctx = interpreter.GetExecutionContext();
+ if (!exe_ctx.HasTargetScope())
+ return;
+
+ const WatchpointList &wp_list = exe_ctx.GetTargetPtr()->GetWatchpointList();
+ const size_t wp_num = wp_list.GetSize();
+ for (size_t idx = 0; idx < wp_num; ++idx) {
+ const lldb::WatchpointSP wp_sp = wp_list.GetByIndex(idx);
+ StreamString strm;
+ wp_sp->Dump(&strm);
+ request.TryCompleteCurrentArg(std::to_string(wp_sp->GetID()),
+ strm.GetString());
+ }
+}
diff --git a/lldb/source/Commands/CommandObjectWatchpoint.cpp b/lldb/source/Commands/CommandObjectWatchpoint.cpp
index 390e24195c9f..e7b1f31f3960 100644
--- a/lldb/source/Commands/CommandObjectWatchpoint.cpp
+++ b/lldb/source/Commands/CommandObjectWatchpoint.cpp
@@ -292,6 +292,14 @@ class CommandObjectWatchpointEnable : public CommandObjectParsed {
~CommandObjectWatchpointEnable() override = default;
+ void
+ HandleArgumentCompletion(CompletionRequest &request,
+ OptionElementVector &opt_element_vector) override {
+ CommandCompletions::InvokeCommonCompletionCallbacks(
+ GetCommandInterpreter(), CommandCompletions::eWatchPointIDCompletion,
+ request, nullptr);
+ }
+
protected:
bool DoExecute(Args &command, CommandReturnObject &result) override {
Target *target = &GetSelectedTarget();
@@ -362,6 +370,14 @@ class CommandObjectWatchpointDisable : public CommandObjectParsed {
~CommandObjectWatchpointDisable() override = default;
+ void
+ HandleArgumentCompletion(CompletionRequest &request,
+ OptionElementVector &opt_element_vector) override {
+ CommandCompletions::InvokeCommonCompletionCallbacks(
+ GetCommandInterpreter(), CommandCompletions::eWatchPointIDCompletion,
+ request, nullptr);
+ }
+
protected:
bool DoExecute(Args &command, CommandReturnObject &result) override {
Target *target = &GetSelectedTarget();
@@ -439,6 +455,14 @@ class CommandObjectWatchpointDelete : public CommandObjectParsed {
~CommandObjectWatchpointDelete() override = default;
+ void
+ HandleArgumentCompletion(CompletionRequest &request,
+ OptionElementVector &opt_element_vector) override {
+ CommandCompletions::InvokeCommonCompletionCallbacks(
+ GetCommandInterpreter(), CommandCompletions::eWatchPointIDCompletion,
+ request, nullptr);
+ }
+
Options *GetOptions() override { return &m_options; }
class CommandOptions : public Options {
@@ -557,6 +581,14 @@ class CommandObjectWatchpointIgnore : public CommandObjectParsed {
~CommandObjectWatchpointIgnore() override = default;
+ void
+ HandleArgumentCompletion(CompletionRequest &request,
+ OptionElementVector &opt_element_vector) override {
+ CommandCompletions::InvokeCommonCompletionCallbacks(
+ GetCommandInterpreter(), CommandCompletions::eWatchPointIDCompletion,
+ request, nullptr);
+ }
+
Options *GetOptions() override { return &m_options; }
class CommandOptions : public Options {
@@ -677,6 +709,14 @@ class CommandObjectWatchpointModify : public CommandObjectParsed {
~CommandObjectWatchpointModify() override = default;
+ void
+ HandleArgumentCompletion(CompletionRequest &request,
+ OptionElementVector &opt_element_vector) override {
+ CommandCompletions::InvokeCommonCompletionCallbacks(
+ GetCommandInterpreter(), CommandCompletions::eWatchPointIDCompletion,
+ request, nullptr);
+ }
+
Options *GetOptions() override { return &m_options; }
class CommandOptions : public Options {
diff --git a/lldb/test/API/functionalities/completion/TestCompletion.py b/lldb/test/API/functionalities/completion/TestCompletion.py
index f4be62f48e25..987ae65474ed 100644
--- a/lldb/test/API/functionalities/completion/TestCompletion.py
+++ b/lldb/test/API/functionalities/completion/TestCompletion.py
@@ -232,6 +232,22 @@ def test_help_watchpoint_s(self):
"""Test that 'help watchpoint s' completes to 'help watchpoint set '."""
self.complete_from_to('help watchpoint s', 'help watchpoint set ')
+ def test_common_complete_watchpoint_ids(self):
+ subcommands = ['enable', 'disable', 'delete', 'modify', 'ignore']
+
+ # Completion should not work without a target.
+ for subcommand in subcommands:
+ self.complete_from_to('watchpoint ' + subcommand + ' ',
+ 'watchpoint ' + subcommand + ' ')
+
+ # Create a process to provide a target and enable watchpoint setting.
+ self.build()
+ lldbutil.run_to_source_breakpoint(self, '// Break here', lldb.SBFileSpec("main.cpp"))
+
+ self.runCmd('watchpoint set variable ptr_fooo')
+ for subcommand in subcommands:
+ self.complete_from_to('watchpoint ' + subcommand + ' ', ['1'])
+
def test_settings_append_target_er(self):
"""Test that 'settings append target.er' completes to 'settings append target.error-path'."""
self.complete_from_to(
More information about the lldb-commits
mailing list