diff options
Diffstat (limited to 'lldb/source')
-rw-r--r-- | lldb/source/Commands/CommandObjectCommands.cpp | 45 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectFrame.cpp | 22 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectHelp.cpp | 28 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectHelp.h | 5 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectMultiword.cpp | 59 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectPlatform.cpp | 19 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectPlugin.cpp | 22 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectProcess.cpp | 25 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectSettings.cpp | 239 | ||||
-rw-r--r-- | lldb/source/Commands/CommandObjectTarget.cpp | 117 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandAlias.cpp | 17 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandInterpreter.cpp | 67 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandObject.cpp | 26 | ||||
-rw-r--r-- | lldb/source/Interpreter/CommandObjectRegexCommand.cpp | 24 | ||||
-rw-r--r-- | lldb/source/Utility/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lldb/source/Utility/CompletionRequest.cpp | 26 |
16 files changed, 374 insertions, 368 deletions
diff --git a/lldb/source/Commands/CommandObjectCommands.cpp b/lldb/source/Commands/CommandObjectCommands.cpp index 454efd12661..584e081c6e8 100644 --- a/lldb/source/Commands/CommandObjectCommands.cpp +++ b/lldb/source/Commands/CommandObjectCommands.cpp @@ -235,20 +235,20 @@ public: return ""; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - auto completion_str = input[cursor_index].ref; - completion_str = completion_str.take_front(cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + auto completion_str = request.GetParsedLine()[request.GetCursorIndex()].ref; + completion_str = completion_str.take_front(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str, match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str, request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } Options *GetOptions() override { return &m_options; } @@ -1459,20 +1459,21 @@ public: ~CommandObjectCommandsScriptImport() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - llvm::StringRef completion_str = input[cursor_index].ref; - completion_str = completion_str.take_front(cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + llvm::StringRef completion_str = + request.GetParsedLine()[request.GetCursorIndex()].ref; + completion_str = completion_str.take_front(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str, match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str, request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } Options *GetOptions() override { return &m_options; } diff --git a/lldb/source/Commands/CommandObjectFrame.cpp b/lldb/source/Commands/CommandObjectFrame.cpp index f4bce6e4b7b..68600215585 100644 --- a/lldb/source/Commands/CommandObjectFrame.cpp +++ b/lldb/source/Commands/CommandObjectFrame.cpp @@ -463,21 +463,21 @@ public: Options *GetOptions() override { return &m_option_group; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { // Arguments are the standard source file completer. - auto completion_str = input[cursor_index].ref; - completion_str = completion_str.take_front(cursor_char_position); + auto completion_str = request.GetParsedLine()[request.GetCursorIndex()].ref; + completion_str = completion_str.take_front(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eVariablePathCompletion, - completion_str, match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str, request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: diff --git a/lldb/source/Commands/CommandObjectHelp.cpp b/lldb/source/Commands/CommandObjectHelp.cpp index d379c62b619..903c6011b03 100644 --- a/lldb/source/Commands/CommandObjectHelp.cpp +++ b/lldb/source/Commands/CommandObjectHelp.cpp @@ -209,34 +209,24 @@ bool CommandObjectHelp::DoExecute(Args &command, CommandReturnObject &result) { return result.Succeeded(); } -int CommandObjectHelp::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, - bool &word_complete, - StringList &matches) { +int CommandObjectHelp::HandleCompletion(CompletionRequest &request) { // Return the completions of the commands in the help system: - if (cursor_index == 0) { - return m_interpreter.HandleCompletionMatches( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + if (request.GetCursorIndex() == 0) { + return m_interpreter.HandleCompletionMatches(request); } else { - CommandObject *cmd_obj = m_interpreter.GetCommandObject(input[0].ref); + CommandObject *cmd_obj = + m_interpreter.GetCommandObject(request.GetParsedLine()[0].ref); // The command that they are getting help on might be ambiguous, in which // case we should complete that, otherwise complete with the command the // user is getting help on... if (cmd_obj) { - input.Shift(); - cursor_index--; - return cmd_obj->HandleCompletion( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + request.GetParsedLine().Shift(); + request.SetCursorIndex(request.GetCursorIndex() - 1); + return cmd_obj->HandleCompletion(request); } else { - return m_interpreter.HandleCompletionMatches( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + return m_interpreter.HandleCompletionMatches(request); } } } diff --git a/lldb/source/Commands/CommandObjectHelp.h b/lldb/source/Commands/CommandObjectHelp.h index f1f87f8e63c..c78682dead1 100644 --- a/lldb/source/Commands/CommandObjectHelp.h +++ b/lldb/source/Commands/CommandObjectHelp.h @@ -30,10 +30,7 @@ public: ~CommandObjectHelp() override; - int HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, int match_start_point, - int max_return_elements, bool &word_complete, - StringList &matches) override; + int HandleCompletion(CompletionRequest &request) override; static void GenerateAdditionalHelpAvenuesMessage( Stream *s, llvm::StringRef command, llvm::StringRef prefix, diff --git a/lldb/source/Commands/CommandObjectMultiword.cpp b/lldb/source/Commands/CommandObjectMultiword.cpp index 44a1320065b..ade1a2d01f3 100644 --- a/lldb/source/Commands/CommandObjectMultiword.cpp +++ b/lldb/source/Commands/CommandObjectMultiword.cpp @@ -186,18 +186,14 @@ void CommandObjectMultiword::GenerateHelpText(Stream &output_stream) { "'help <command> <subcommand>'.\n"); } -int CommandObjectMultiword::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, - bool &word_complete, - StringList &matches) { +int CommandObjectMultiword::HandleCompletion(CompletionRequest &request) { // Any of the command matches will provide a complete word, otherwise the // individual completers will override this. - word_complete = true; + request.SetWordComplete(true); + auto &matches = request.GetMatches(); - auto arg0 = input[0].ref; - if (cursor_index == 0) { + auto arg0 = request.GetParsedLine()[0].ref; + if (request.GetCursorIndex() == 0) { AddNamesMatchingPartialString(m_subcommand_dict, arg0, matches); if (matches.GetSize() == 1 && matches.GetStringAtIndex(0) != nullptr && @@ -205,16 +201,14 @@ int CommandObjectMultiword::HandleCompletion(Args &input, int &cursor_index, StringList temp_matches; CommandObject *cmd_obj = GetSubcommandObject(arg0, &temp_matches); if (cmd_obj != nullptr) { - if (input.GetArgumentCount() == 1) { - word_complete = true; + if (request.GetParsedLine().GetArgumentCount() == 1) { + request.SetWordComplete(true); } else { matches.DeleteStringAtIndex(0); - input.Shift(); - cursor_char_position = 0; - input.AppendArgument(llvm::StringRef()); - return cmd_obj->HandleCompletion( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + request.GetParsedLine().Shift(); + request.SetCursorCharPosition(0); + request.GetParsedLine().AppendArgument(llvm::StringRef()); + return cmd_obj->HandleCompletion(request); } } } @@ -226,11 +220,9 @@ int CommandObjectMultiword::HandleCompletion(Args &input, int &cursor_index, } else { // Remove the one match that we got from calling GetSubcommandObject. matches.DeleteStringAtIndex(0); - input.Shift(); - cursor_index--; - return sub_command_object->HandleCompletion( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + request.GetParsedLine().Shift(); + request.SetCursorIndex(request.GetCursorIndex() - 1); + return sub_command_object->HandleCompletion(request); } } } @@ -370,31 +362,20 @@ Options *CommandObjectProxy::GetOptions() { return nullptr; } -int CommandObjectProxy::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, - bool &word_complete, - StringList &matches) { +int CommandObjectProxy::HandleCompletion(CompletionRequest &request) { CommandObject *proxy_command = GetProxyCommandObject(); if (proxy_command) - return proxy_command->HandleCompletion( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); - matches.Clear(); + return proxy_command->HandleCompletion(request); + request.GetMatches().Clear(); return 0; } int CommandObjectProxy::HandleArgumentCompletion( - Args &input, int &cursor_index, int &cursor_char_position, - OptionElementVector &opt_element_vector, int match_start_point, - int max_return_elements, bool &word_complete, StringList &matches) { + CompletionRequest &request, OptionElementVector &opt_element_vector) { CommandObject *proxy_command = GetProxyCommandObject(); if (proxy_command) - return proxy_command->HandleArgumentCompletion( - input, cursor_index, cursor_char_position, opt_element_vector, - match_start_point, max_return_elements, word_complete, matches); - matches.Clear(); + return proxy_command->HandleArgumentCompletion(request, opt_element_vector); + request.GetMatches().Clear(); return 0; } diff --git a/lldb/source/Commands/CommandObjectPlatform.cpp b/lldb/source/Commands/CommandObjectPlatform.cpp index 3c44e8f252f..118f78e359e 100644 --- a/lldb/source/Commands/CommandObjectPlatform.cpp +++ b/lldb/source/Commands/CommandObjectPlatform.cpp @@ -178,17 +178,18 @@ public: ~CommandObjectPlatformSelect() override = default; - int HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, int match_start_point, - int max_return_elements, bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); + int HandleCompletion(CompletionRequest &request) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::PlatformPluginNames( - GetCommandInterpreter(), completion_str.c_str(), match_start_point, - max_return_elements, nullptr, word_complete, matches); - return matches.GetSize(); + GetCommandInterpreter(), completion_str.c_str(), + request.GetMatchStartPoint(), request.GetMaxReturnElements(), nullptr, + word_complete, request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } Options *GetOptions() override { return &m_option_group; } diff --git a/lldb/source/Commands/CommandObjectPlugin.cpp b/lldb/source/Commands/CommandObjectPlugin.cpp index 7e1b7f61f76..36db0d12005 100644 --- a/lldb/source/Commands/CommandObjectPlugin.cpp +++ b/lldb/source/Commands/CommandObjectPlugin.cpp @@ -42,20 +42,20 @@ public: ~CommandObjectPluginLoad() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - auto completion_str = input[cursor_index].ref; - completion_str = completion_str.take_front(cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + auto completion_str = request.GetParsedLine()[request.GetCursorIndex()].ref; + completion_str = completion_str.take_front(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str, match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str, request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index 9deb2e64940..86d477754ea 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -134,20 +134,21 @@ public: ~CommandObjectProcessLaunch() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); - + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } Options *GetOptions() override { return &m_options; } diff --git a/lldb/source/Commands/CommandObjectSettings.cpp b/lldb/source/Commands/CommandObjectSettings.cpp index b1b0ae8bfeb..58dbaee967d 100644 --- a/lldb/source/Commands/CommandObjectSettings.cpp +++ b/lldb/source/Commands/CommandObjectSettings.cpp @@ -133,32 +133,34 @@ insert-before or insert-after."); bool m_global; }; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); - - const size_t argc = input.GetArgumentCount(); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + + const size_t argc = request.GetParsedLine().GetArgumentCount(); const char *arg = nullptr; int setting_var_idx; for (setting_var_idx = 0; setting_var_idx < static_cast<int>(argc); ++setting_var_idx) { - arg = input.GetArgumentAtIndex(setting_var_idx); + arg = request.GetParsedLine().GetArgumentAtIndex(setting_var_idx); if (arg && arg[0] != '-') break; // We found our setting variable name index } - if (cursor_index == setting_var_idx) { + if (request.GetCursorIndex() == setting_var_idx) { // Attempting to complete setting variable name + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); } else { - arg = input.GetArgumentAtIndex(cursor_index); + arg = + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()); if (arg) { if (arg[0] == '-') { @@ -166,20 +168,23 @@ insert-before or insert-after."); } else { // Complete setting value const char *setting_var_name = - input.GetArgumentAtIndex(setting_var_idx); + request.GetParsedLine().GetArgumentAtIndex(setting_var_idx); Status error; lldb::OptionValueSP value_sp( m_interpreter.GetDebugger().GetPropertyValue( &m_exe_ctx, setting_var_name, false, error)); if (value_sp) { + bool word_complete = request.GetWordComplete(); value_sp->AutoComplete(m_interpreter, completion_str.c_str(), - match_start_point, max_return_elements, - word_complete, matches); + request.GetMatchStartPoint(), + request.GetMaxReturnElements(), + word_complete, request.GetMatches()); + request.SetWordComplete(word_complete); } } } } - return matches.GetSize(); + return request.GetMatches().GetSize(); } protected: @@ -272,20 +277,21 @@ public: ~CommandObjectSettingsShow() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: @@ -345,20 +351,21 @@ public: ~CommandObjectSettingsList() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: @@ -440,22 +447,23 @@ public: ~CommandObjectSettingsRemove() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); // Attempting to complete variable name - if (cursor_index < 2) + bool word_complete = request.GetWordComplete(); + if (request.GetCursorIndex() < 2) CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: @@ -562,23 +570,24 @@ public: // !WantsRawCommandString. bool WantsCompletion() override { return true; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); // Attempting to complete variable name - if (cursor_index < 2) + if (request.GetCursorIndex() < 2) CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); - return matches.GetSize(); + return request.GetMatches().GetSize(); } protected: @@ -668,23 +677,24 @@ public: // !WantsRawCommandString. bool WantsCompletion() override { return true; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); // Attempting to complete variable name - if (cursor_index < 2) + if (request.GetCursorIndex() < 2) CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); - return matches.GetSize(); + return request.GetMatches().GetSize(); } protected: @@ -779,23 +789,24 @@ public: // !WantsRawCommandString. bool WantsCompletion() override { return true; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); // Attempting to complete variable name - if (cursor_index < 2) + if (request.GetCursorIndex() < 2) CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); - return matches.GetSize(); + return request.GetMatches().GetSize(); } protected: @@ -879,23 +890,24 @@ public: // !WantsRawCommandString. bool WantsCompletion() override { return true; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); // Attempting to complete variable name - if (cursor_index < 2) + if (request.GetCursorIndex() < 2) CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); - return matches.GetSize(); + return request.GetMatches().GetSize(); } protected: @@ -966,23 +978,24 @@ public: ~CommandObjectSettingsClear() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); // Attempting to complete variable name - if (cursor_index < 2) + if (request.GetCursorIndex() < 2) CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSettingsNameCompletion, - completion_str.c_str(), match_start_point, max_return_elements, - nullptr, word_complete, matches); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); - return matches.GetSize(); + return request.GetMatches().GetSize(); } protected: diff --git a/lldb/source/Commands/CommandObjectTarget.cpp b/lldb/source/Commands/CommandObjectTarget.cpp index feeecf5517c..fc25fb37d4d 100644 --- a/lldb/source/Commands/CommandObjectTarget.cpp +++ b/lldb/source/Commands/CommandObjectTarget.cpp @@ -195,20 +195,21 @@ public: Options *GetOptions() override { return &m_option_group; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); - + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: @@ -1811,21 +1812,22 @@ public: ~CommandObjectTargetModulesModuleAutoComplete() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { // Arguments are the standard module completer. - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eModuleCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } }; @@ -1860,21 +1862,22 @@ public: ~CommandObjectTargetModulesSourceFileAutoComplete() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { // Arguments are the standard source file completer. - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eSourceFileCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } }; @@ -2410,20 +2413,21 @@ public: Options *GetOptions() override { return &m_option_group; } - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } protected: @@ -4011,20 +4015,21 @@ public: ~CommandObjectTargetSymbolsAdd() override = default; - int HandleArgumentCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - OptionElementVector &opt_element_vector, - int match_start_point, int max_return_elements, - bool &word_complete, - StringList &matches) override { - std::string completion_str(input.GetArgumentAtIndex(cursor_index)); - completion_str.erase(cursor_char_position); + int HandleArgumentCompletion( + CompletionRequest &request, + OptionElementVector &opt_element_vector) override { + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex())); + completion_str.erase(request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion, - completion_str.c_str(), match_start_point, max_return_elements, nullptr, - word_complete, matches); - return matches.GetSize(); + completion_str.c_str(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), nullptr, word_complete, + request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } Options *GetOptions() override { return &m_option_group; } diff --git a/lldb/source/Interpreter/CommandAlias.cpp b/lldb/source/Interpreter/CommandAlias.cpp index 7a62e285608..a4b0a0c55c0 100644 --- a/lldb/source/Interpreter/CommandAlias.cpp +++ b/lldb/source/Interpreter/CommandAlias.cpp @@ -114,26 +114,17 @@ bool CommandAlias::WantsCompletion() { return false; } -int CommandAlias::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, bool &word_complete, - StringList &matches) { +int CommandAlias::HandleCompletion(CompletionRequest &request) { if (IsValid()) - return m_underlying_command_sp->HandleCompletion( - input, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + return m_underlying_command_sp->HandleCompletion(request); return -1; } int CommandAlias::HandleArgumentCompletion( - Args &input, int &cursor_index, int &cursor_char_position, - OptionElementVector &opt_element_vector, int match_start_point, - int max_return_elements, bool &word_complete, StringList &matches) { + CompletionRequest &request, OptionElementVector &opt_element_vector) { if (IsValid()) return m_underlying_command_sp->HandleArgumentCompletion( - input, cursor_index, cursor_char_position, opt_element_vector, - match_start_point, max_return_elements, word_complete, matches); + request, opt_element_vector); return -1; } diff --git a/lldb/source/Interpreter/CommandInterpreter.cpp b/lldb/source/Interpreter/CommandInterpreter.cpp index cb31a4a33aa..d2014afa869 100644 --- a/lldb/source/Interpreter/CommandInterpreter.cpp +++ b/lldb/source/Interpreter/CommandInterpreter.cpp @@ -1677,13 +1677,14 @@ bool CommandInterpreter::HandleCommand(const char *command_line, // We didn't find the first command object, so complete the first argument. Args command_args(command_string); StringList matches; - int num_matches; int cursor_index = 0; int cursor_char_position = strlen(command_args.GetArgumentAtIndex(0)); - bool word_complete; - num_matches = HandleCompletionMatches(command_args, cursor_index, - cursor_char_position, 0, -1, - word_complete, matches); + bool word_complete = true; + CompletionRequest request(command_line, cursor_char_position, command_args, + cursor_index, cursor_char_position, 0, -1, + word_complete, matches); + int num_matches = HandleCompletionMatches(request); + word_complete = request.GetWordComplete(); if (num_matches > 0) { std::string error_msg; @@ -1712,59 +1713,55 @@ bool CommandInterpreter::HandleCommand(const char *command_line, return result.Succeeded(); } -int CommandInterpreter::HandleCompletionMatches( - Args &parsed_line, int &cursor_index, int &cursor_char_position, - int match_start_point, int max_return_elements, bool &word_complete, - StringList &matches) { +int CommandInterpreter::HandleCompletionMatches(CompletionRequest &request) { + auto &matches = request.GetMatches(); int num_command_matches = 0; bool look_for_subcommand = false; // For any of the command completions a unique match will be a complete word. - word_complete = true; + request.SetWordComplete(true); - if (cursor_index == -1) { + if (request.GetCursorIndex() == -1) { // We got nothing on the command line, so return the list of commands bool include_aliases = true; num_command_matches = GetCommandNamesMatchingPartialString("", include_aliases, matches); - } else if (cursor_index == 0) { + } else if (request.GetCursorIndex() == 0) { // The cursor is in the first argument, so just do a lookup in the // dictionary. - CommandObject *cmd_obj = - GetCommandObject(parsed_line.GetArgumentAtIndex(0), &matches); + CommandObject *cmd_obj = GetCommandObject( + request.GetParsedLine().GetArgumentAtIndex(0), &matches); num_command_matches = matches.GetSize(); if (num_command_matches == 1 && cmd_obj && cmd_obj->IsMultiwordObject() && matches.GetStringAtIndex(0) != nullptr && - strcmp(parsed_line.GetArgumentAtIndex(0), + strcmp(request.GetParsedLine().GetArgumentAtIndex(0), matches.GetStringAtIndex(0)) == 0) { - if (parsed_line.GetArgumentCount() == 1) { - word_complete = true; + if (request.GetParsedLine().GetArgumentCount() == 1) { + request.SetWordComplete(true); } else { look_for_subcommand = true; num_command_matches = 0; matches.DeleteStringAtIndex(0); - parsed_line.AppendArgument(llvm::StringRef()); - cursor_index++; - cursor_char_position = 0; + request.GetParsedLine().AppendArgument(llvm::StringRef()); + request.SetCursorIndex(request.GetCursorIndex() + 1); + request.SetCursorCharPosition(0); } } } - if (cursor_index > 0 || look_for_subcommand) { + if (request.GetCursorIndex() > 0 || look_for_subcommand) { // We are completing further on into a commands arguments, so find the // command and tell it to complete the command. First see if there is a // matching initial command: CommandObject *command_object = - GetCommandObject(parsed_line.GetArgumentAtIndex(0)); + GetCommandObject(request.GetParsedLine().GetArgumentAtIndex(0)); if (command_object == nullptr) { return 0; } else { - parsed_line.Shift(); - cursor_index--; - num_command_matches = command_object->HandleCompletion( - parsed_line, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + request.GetParsedLine().Shift(); + request.SetCursorIndex(request.GetCursorIndex() - 1); + num_command_matches = command_object->HandleCompletion(request); } } @@ -1778,7 +1775,8 @@ int CommandInterpreter::HandleCompletion( // parsed_line is the one containing the cursor, and the cursor is after the // last character. - Args parsed_line(llvm::StringRef(current_line, last_char - current_line)); + llvm::StringRef command_line(current_line, last_char - current_line); + Args parsed_line(command_line); Args partial_parsed_line( llvm::StringRef(current_line, cursor - current_line)); @@ -1833,10 +1831,15 @@ int CommandInterpreter::HandleCompletion( // Only max_return_elements == -1 is supported at present: lldbassert(max_return_elements == -1); - bool word_complete; - num_command_matches = HandleCompletionMatches( - parsed_line, cursor_index, cursor_char_position, match_start_point, - max_return_elements, word_complete, matches); + bool word_complete = false; + + CompletionRequest request(command_line, cursor - current_line, parsed_line, + cursor_index, cursor_char_position, + match_start_point, max_return_elements, + word_complete, matches); + + num_command_matches = HandleCompletionMatches(request); + word_complete = request.GetWordComplete(); if (num_command_matches <= 0) return num_command_matches; diff --git a/lldb/source/Interpreter/CommandObject.cpp b/lldb/source/Interpreter/CommandObject.cpp index 74b83d5445b..cee30b36929 100644 --- a/lldb/source/Interpreter/CommandObject.cpp +++ b/lldb/source/Interpreter/CommandObject.cpp @@ -260,18 +260,14 @@ void CommandObject::Cleanup() { m_api_locker.unlock(); } -int CommandObject::HandleCompletion(Args &input, int &cursor_index, - int &cursor_char_position, - int match_start_point, - int max_return_elements, - bool &word_complete, StringList &matches) { +int CommandObject::HandleCompletion(CompletionRequest &request) { // Default implementation of WantsCompletion() is !WantsRawCommandString(). // Subclasses who want raw command string but desire, for example, argument // completion should override WantsCompletion() to return true, instead. if (WantsRawCommandString() && !WantsCompletion()) { // FIXME: Abstract telling the completion to insert the completion // character. - matches.Clear(); + request.GetMatches().Clear(); return -1; } else { // Can we do anything generic with the options? @@ -280,21 +276,23 @@ int CommandObject::HandleCompletion(Args &input, int &cursor_index, OptionElementVector opt_element_vector; if (cur_options != nullptr) { - opt_element_vector = cur_options->ParseForCompletion(input, cursor_index); + opt_element_vector = cur_options->ParseForCompletion( + request.GetParsedLine(), request.GetCursorIndex()); bool handled_by_options; + bool word_complete = request.GetWordComplete(); handled_by_options = cur_options->HandleOptionCompletion( - input, opt_element_vector, cursor_index, cursor_char_position, - match_start_point, max_return_elements, GetCommandInterpreter(), - word_complete, matches); + request.GetParsedLine(), opt_element_vector, request.GetCursorIndex(), + request.GetCursorCharPosition(), request.GetMatchStartPoint(), + request.GetMaxReturnElements(), GetCommandInterpreter(), + word_complete, request.GetMatches()); + request.SetWordComplete(word_complete); if (handled_by_options) - return matches.GetSize(); + return request.GetMatches().GetSize(); } // If we got here, the last word is not an option or an option argument. - return HandleArgumentCompletion( - input, cursor_index, cursor_char_position, opt_element_vector, - match_start_point, max_return_elements, word_complete, matches); + return HandleArgumentCompletion(request, opt_element_vector); } } diff --git a/lldb/source/Interpreter/CommandObjectRegexCommand.cpp b/lldb/source/Interpreter/CommandObjectRegexCommand.cpp index 2bfec0b743d..6826a2c334f 100644 --- a/lldb/source/Interpreter/CommandObjectRegexCommand.cpp +++ b/lldb/source/Interpreter/CommandObjectRegexCommand.cpp @@ -99,23 +99,21 @@ bool CommandObjectRegexCommand::AddRegexCommand(const char *re_cstr, 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) { +int CommandObjectRegexCommand::HandleCompletion(CompletionRequest &request) { if (m_completion_type_mask) { - std::string completion_str(input.GetArgumentAtIndex(cursor_index), - cursor_char_position); + std::string completion_str( + request.GetParsedLine().GetArgumentAtIndex(request.GetCursorIndex()), + request.GetCursorCharPosition()); + bool word_complete = request.GetWordComplete(); CommandCompletions::InvokeCommonCompletionCallbacks( GetCommandInterpreter(), m_completion_type_mask, completion_str.c_str(), - match_start_point, max_return_elements, nullptr, word_complete, - matches); - return matches.GetSize(); + request.GetMatchStartPoint(), request.GetMaxReturnElements(), nullptr, + word_complete, request.GetMatches()); + request.SetWordComplete(word_complete); + return request.GetMatches().GetSize(); } else { - matches.Clear(); - word_complete = false; + request.GetMatches().Clear(); + request.SetWordComplete(false); } return 0; } diff --git a/lldb/source/Utility/CMakeLists.txt b/lldb/source/Utility/CMakeLists.txt index 881fa00f8de..0cd8220523c 100644 --- a/lldb/source/Utility/CMakeLists.txt +++ b/lldb/source/Utility/CMakeLists.txt @@ -45,6 +45,7 @@ add_lldb_library(lldbUtility Baton.cpp Connection.cpp ConstString.cpp + CompletionRequest.cpp DataBufferHeap.cpp DataBufferLLVM.cpp DataEncoder.cpp diff --git a/lldb/source/Utility/CompletionRequest.cpp b/lldb/source/Utility/CompletionRequest.cpp new file mode 100644 index 00000000000..fbb0133b894 --- /dev/null +++ b/lldb/source/Utility/CompletionRequest.cpp @@ -0,0 +1,26 @@ +//===-- CompletionRequest.cpp -----------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Utility/CompletionRequest.h" + +using namespace lldb; +using namespace lldb_private; + +CompletionRequest::CompletionRequest(llvm::StringRef command, + unsigned raw_cursor_pos, Args &parsed_line, + int cursor_index, int cursor_char_position, + int match_start_point, + int max_return_elements, + bool word_complete, StringList &matches) + : m_command(command), m_raw_cursor_pos(raw_cursor_pos), + m_parsed_line(parsed_line), m_cursor_index(cursor_index), + m_cursor_char_position(cursor_char_position), + m_match_start_point(match_start_point), + m_max_return_elements(max_return_elements), + m_word_complete(word_complete), m_matches(&matches) {} |