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( _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits