From 7d2ef16cb360dbd95e276b80b85c6ff9ce69dc23 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Fri, 29 Mar 2013 17:03:23 +0000 Subject: [PATCH] Enable tab completion for regular expression commands. llvm-svn: 178348 --- .../lldb/Interpreter/CommandObjectRegexCommand.h | 13 ++++++- lldb/source/Interpreter/CommandInterpreter.cpp | 45 ++++++++++++++-------- .../Interpreter/CommandObjectRegexCommand.cpp | 36 ++++++++++++++++- 3 files changed, 74 insertions(+), 20 deletions(-) diff --git a/lldb/include/lldb/Interpreter/CommandObjectRegexCommand.h b/lldb/include/lldb/Interpreter/CommandObjectRegexCommand.h index d74e0c5..8855680 100644 --- a/lldb/include/lldb/Interpreter/CommandObjectRegexCommand.h +++ b/lldb/include/lldb/Interpreter/CommandObjectRegexCommand.h @@ -33,7 +33,8 @@ public: const char *name, const char *help, const char *syntax, - uint32_t max_matches); + uint32_t max_matches, + uint32_t completion_type_mask = 0); virtual ~CommandObjectRegexCommand (); @@ -46,6 +47,15 @@ public: { return !m_entries.empty(); } + + virtual int + HandleCompletion (Args &input, + int &cursor_index, + int &cursor_char_position, + int match_start_point, + int max_return_elements, + bool &word_complete, + StringList &matches); protected: virtual bool @@ -59,6 +69,7 @@ protected: typedef std::list EntryCollection; const uint32_t m_max_matches; + const uint32_t m_completion_type_mask; EntryCollection m_entries; private: diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index 0c7e3af..9fe94e0 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -42,6 +42,7 @@ #include "../Commands/CommandObjectVersion.h" #include "../Commands/CommandObjectWatchpoint.h" + #include "lldb/Core/Debugger.h" #include "lldb/Core/InputReader.h" #include "lldb/Core/Log.h" @@ -51,8 +52,9 @@ #include "lldb/Host/Host.h" #include "lldb/Interpreter/Args.h" -#include "lldb/Interpreter/CommandReturnObject.h" +#include "lldb/Interpreter/CommandCompletions.h" #include "lldb/Interpreter/CommandInterpreter.h" +#include "lldb/Interpreter/CommandReturnObject.h" #include "lldb/Interpreter/Options.h" #include "lldb/Interpreter/ScriptInterpreterNone.h" #include "lldb/Interpreter/ScriptInterpreterPython.h" @@ -395,7 +397,10 @@ CommandInterpreter::LoadCommandDictionary () break_regex_cmd_ap(new CommandObjectRegexCommand (*this, "_regexp-break", "Set a breakpoint using a regular expression to specify the location, where is in decimal and
is in hex.", - "_regexp-break [:]\n_regexp-break []\n_regexp-break [
]\n_regexp-break <...>", 2)); + "_regexp-break [:]\n_regexp-break []\n_regexp-break [
]\n_regexp-break <...>", + 2, + CommandCompletions::eSymbolCompletion | + CommandCompletions::eSourceFileCompletion)); if (break_regex_cmd_ap.get()) { @@ -419,7 +424,10 @@ CommandInterpreter::LoadCommandDictionary () tbreak_regex_cmd_ap(new CommandObjectRegexCommand (*this, "_regexp-tbreak", "Set a one shot breakpoint using a regular expression to specify the location, where is in decimal and
is in hex.", - "_regexp-tbreak [:]\n_regexp-break []\n_regexp-break [
]\n_regexp-break <...>", 2)); + "_regexp-tbreak [:]\n_regexp-break []\n_regexp-break [
]\n_regexp-break <...>", + 2, + CommandCompletions::eSymbolCompletion | + CommandCompletions::eSourceFileCompletion)); if (tbreak_regex_cmd_ap.get()) { @@ -447,7 +455,8 @@ CommandInterpreter::LoadCommandDictionary () attach_regex_cmd_ap(new CommandObjectRegexCommand (*this, "_regexp-attach", "Attach to a process id if in decimal, otherwise treat the argument as a process name to attach to.", - "_regexp-attach []\n_regexp-attach []", 2)); + "_regexp-attach []\n_regexp-attach []", + 2)); if (attach_regex_cmd_ap.get()) { if (attach_regex_cmd_ap->AddRegexCommand("^([0-9]+)[[:space:]]*$", "process attach --pid %1") && @@ -492,9 +501,9 @@ CommandInterpreter::LoadCommandDictionary () std::auto_ptr display_regex_cmd_ap(new CommandObjectRegexCommand (*this, - "_regexp-display", - "Add an expression evaluation stop-hook.", - "_regexp-display expression", 2)); + "_regexp-display", + "Add an expression evaluation stop-hook.", + "_regexp-display expression", 2)); if (display_regex_cmd_ap.get()) { if (display_regex_cmd_ap->AddRegexCommand("^(.+)$", "target stop-hook add -o \"expr -- %1\"")) @@ -506,9 +515,9 @@ CommandInterpreter::LoadCommandDictionary () std::auto_ptr undisplay_regex_cmd_ap(new CommandObjectRegexCommand (*this, - "_regexp-undisplay", - "Remove an expression evaluation stop-hook.", - "_regexp-undisplay stop-hook-number", 2)); + "_regexp-undisplay", + "Remove an expression evaluation stop-hook.", + "_regexp-undisplay stop-hook-number", 2)); if (undisplay_regex_cmd_ap.get()) { if (undisplay_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "target stop-hook delete %1")) @@ -520,9 +529,9 @@ CommandInterpreter::LoadCommandDictionary () std::auto_ptr connect_gdb_remote_cmd_ap(new CommandObjectRegexCommand (*this, - "gdb-remote", - "Connect to a remote GDB server. If no hostname is provided, localhost is assumed.", - "gdb-remote [:]", 2)); + "gdb-remote", + "Connect to a remote GDB server. If no hostname is provided, localhost is assumed.", + "gdb-remote [:]", 2)); if (connect_gdb_remote_cmd_ap.get()) { if (connect_gdb_remote_cmd_ap->AddRegexCommand("^([^:]+:[[:digit:]]+)$", "process connect --plugin gdb-remote connect://%1") && @@ -572,7 +581,9 @@ CommandInterpreter::LoadCommandDictionary () list_regex_cmd_ap(new CommandObjectRegexCommand (*this, "_regexp-list", "Implements the GDB 'list' command in all of its forms except FILE:FUNCTION and maps them to the appropriate 'source list' commands.", - "_regexp-list []\n_regexp-attach [:]\n_regexp-attach [:]", 2)); + "_regexp-list []\n_regexp-attach [:]\n_regexp-attach [:]", + 2, + CommandCompletions::eSourceFileCompletion)); if (list_regex_cmd_ap.get()) { if (list_regex_cmd_ap->AddRegexCommand("^([0-9]+)[[:space:]]*$", "source list --line %1") && @@ -590,9 +601,9 @@ CommandInterpreter::LoadCommandDictionary () std::auto_ptr env_regex_cmd_ap(new CommandObjectRegexCommand (*this, - "_regexp-env", - "Implements a shortcut to viewing and setting environment variables.", - "_regexp-env\n_regexp-env FOO=BAR", 2)); + "_regexp-env", + "Implements a shortcut to viewing and setting environment variables.", + "_regexp-env\n_regexp-env FOO=BAR", 2)); if (env_regex_cmd_ap.get()) { if (env_regex_cmd_ap->AddRegexCommand("^$", "settings show target.env-vars") && diff --git a/lldb/source/Interpreter/CommandObjectRegexCommand.cpp b/lldb/source/Interpreter/CommandObjectRegexCommand.cpp index 05d6e09..25b02ba 100644 --- a/lldb/source/Interpreter/CommandObjectRegexCommand.cpp +++ b/lldb/source/Interpreter/CommandObjectRegexCommand.cpp @@ -30,11 +30,13 @@ CommandObjectRegexCommand::CommandObjectRegexCommand const char *name, const char *help, const char *syntax, - uint32_t max_matches + uint32_t max_matches, + uint32_t completion_type_mask ) : CommandObjectRaw (interpreter, name, help, syntax), m_max_matches (max_matches), - m_entries () + m_entries (), + m_completion_type_mask (completion_type_mask) { } @@ -114,3 +116,33 @@ CommandObjectRegexCommand::AddRegexCommand (const char *re_cstr, const char *com m_entries.pop_back(); return false; } + +int +CommandObjectRegexCommand::HandleCompletion (Args &input, + int &cursor_index, + int &cursor_char_position, + int match_start_point, + int max_return_elements, + bool &word_complete, + StringList &matches) +{ + if (m_completion_type_mask) + { + std::string completion_str (input.GetArgumentAtIndex (cursor_index), cursor_char_position); + CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter, + m_completion_type_mask, + completion_str.c_str(), + match_start_point, + max_return_elements, + NULL, + word_complete, + matches); + return matches.GetSize(); + } + else + { + matches.Clear(); + word_complete = false; + } + return 0; +} -- 2.7.4