#include "lldb/Utility/CompletionRequest.h"
using namespace lldb;
using namespace lldb_private;
CompletionRequest::CompletionRequest(llvm::StringRef command_line,
unsigned raw_cursor_pos,
CompletionResult &result)
: m_command(command_line), m_raw_cursor_pos(raw_cursor_pos),
m_result(result) {
assert(raw_cursor_pos <= command_line.size() && "Out of bounds cursor?");
llvm::StringRef partial_command(command_line.substr(0, raw_cursor_pos));
m_parsed_line = Args(partial_command);
if (GetParsedLine().GetArgumentCount() == 0) {
m_cursor_index = 0;
m_cursor_char_position = 0;
} else {
m_cursor_index = GetParsedLine().GetArgumentCount() - 1U;
m_cursor_char_position =
strlen(GetParsedLine().GetArgumentAtIndex(m_cursor_index));
}
if (partial_command.ends_with(" ") &&
!GetCursorArgumentPrefix().ends_with(" "))
AppendEmptyArgument();
}
std::string CompletionResult::Completion::GetUniqueKey() const {
std::string result;
result.append(std::to_string(m_completion.size()));
result.append(m_completion);
result.append(std::to_string(static_cast<int>(m_mode)));
result.append(":");
result.append(m_descripton);
return result;
}
void CompletionResult::AddResult(llvm::StringRef completion,
llvm::StringRef description,
CompletionMode mode) {
Completion r(completion, description, mode);
if (m_added_values.insert(r.GetUniqueKey()).second)
m_results.push_back(r);
}
void CompletionResult::GetMatches(StringList &matches) const {
matches.Clear();
for (const Completion &completion : m_results)
matches.AppendString(completion.GetCompletion());
}
void CompletionResult::GetDescriptions(StringList &descriptions) const {
descriptions.Clear();
for (const Completion &completion : m_results)
descriptions.AppendString(completion.GetDescription());
}