diff options
Diffstat (limited to 'source/Utility/CompletionRequest.cpp')
| -rw-r--r-- | source/Utility/CompletionRequest.cpp | 43 | 
1 files changed, 38 insertions, 5 deletions
diff --git a/source/Utility/CompletionRequest.cpp b/source/Utility/CompletionRequest.cpp index c88747e2abe3..096661b7e99f 100644 --- a/source/Utility/CompletionRequest.cpp +++ b/source/Utility/CompletionRequest.cpp @@ -16,11 +16,10 @@ CompletionRequest::CompletionRequest(llvm::StringRef command_line,                                       unsigned raw_cursor_pos,                                       int match_start_point,                                       int max_return_elements, -                                     StringList &matches) +                                     CompletionResult &result)      : m_command(command_line), m_raw_cursor_pos(raw_cursor_pos),        m_match_start_point(match_start_point), -      m_max_return_elements(max_return_elements), m_matches(&matches) { -  matches.Clear(); +      m_max_return_elements(max_return_elements), m_result(result) {    // We parse the argument up to the cursor, so the last argument in    // parsed_line is the one containing the cursor, and the cursor is after the @@ -36,8 +35,6 @@ CompletionRequest::CompletionRequest(llvm::StringRef command_line,      m_cursor_char_position =          strlen(m_partial_parsed_line.GetArgumentAtIndex(m_cursor_index)); -  matches.Clear(); -    const char *cursor = command_line.data() + raw_cursor_pos;    if (raw_cursor_pos > 0 && cursor[-1] == ' ') {      // We are just after a space.  If we are in an argument, then we will @@ -58,3 +55,39 @@ CompletionRequest::CompletionRequest(llvm::StringRef command_line,      }    }  } + +std::string CompletionResult::Completion::GetUniqueKey() const { + +  // We build a unique key for this pair of completion:description. We +  // prefix the key with the length of the completion string. This prevents +  // that we could get any collisions from completions pairs such as these: +  // "foo:", "bar" would be "foo:bar", but will now be: "4foo:bar" +  // "foo", ":bar" would be "foo:bar", but will now be: "3foo:bar" + +  std::string result; +  result.append(std::to_string(m_completion.size())); +  result.append(m_completion); +  result.append(m_descripton); +  return result; +} + +void CompletionResult::AddResult(llvm::StringRef completion, +                                 llvm::StringRef description) { +  Completion r(completion, description); + +  // Add the completion if we haven't seen the same value before. +  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.m_completion); +} + +void CompletionResult::GetDescriptions(StringList &descriptions) const { +  descriptions.Clear(); +  for (const Completion &completion : m_results) +    descriptions.AppendString(completion.m_descripton); +}  | 
