diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index f9aeb71056154843ea34fa3f610ed6a93318ba7a..997707edf71e57a83d8a80e5788144a31a43b85c 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -82,10 +82,6 @@ namespace { const bool debug = ! qgetenv("CPLUSPLUS_DEBUG").isEmpty(); } -enum { - MAX_COMPLETION_ITEM = 1000 -}; - using namespace CPlusPlus; namespace CppTools { @@ -660,7 +656,10 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor) int index = startCompletionHelper(editor); if (index != -1) { if (m_completionOperator != T_EOF_SYMBOL) - qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan); + qSort(m_completions.begin(), m_completions.end(), completionItemLessThan); + + // always remove duplicates + m_completions = removeDuplicates(m_completions); } return index; } @@ -1590,45 +1589,36 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio } } -QList<TextEditor::CompletionItem> CppCodeCompletion::getCompletions() +QList<TextEditor::CompletionItem> CppCodeCompletion::removeDuplicates(const QList<TextEditor::CompletionItem> &items) { - QList<TextEditor::CompletionItem> completionItems; - - completions(&completionItems); - - if (m_completionOperator == T_EOF_SYMBOL && completionItems.size() < MAX_COMPLETION_ITEM) { - qStableSort(completionItems.begin(), completionItems.end(), completionItemLessThan); - } - // Remove duplicates - QString lastKey; QList<TextEditor::CompletionItem> uniquelist; + QSet<QString> processed; - foreach (const TextEditor::CompletionItem &item, completionItems) { - if (item.text != lastKey) { + foreach (const TextEditor::CompletionItem &item, items) { + if (! processed.contains(item.text)) { + processed.insert(item.text); uniquelist.append(item); - lastKey = item.text; - } else { - TextEditor::CompletionItem &lastItem = uniquelist.last(); - Symbol *symbol = qvariant_cast<Symbol *>(item.data); - Symbol *lastSymbol = qvariant_cast<Symbol *>(lastItem.data); - - if (symbol && lastSymbol) { - Function *funTy = symbol->type()->asFunctionType(); - Function *lastFunTy = lastSymbol->type()->asFunctionType(); - if (funTy && lastFunTy) { - if (funTy->argumentCount() == lastFunTy->argumentCount()) - continue; + if (Symbol *symbol = qvariant_cast<Symbol *>(item.data)) { + if (Function *funTy = symbol->type()->asFunctionType()) { + if (funTy->hasArguments()) + ++uniquelist.back().duplicateCount; } } - - ++lastItem.duplicateCount; } } return uniquelist; } +QList<TextEditor::CompletionItem> CppCodeCompletion::getCompletions() +{ + QList<TextEditor::CompletionItem> completionItems; + completions(&completionItems); + + return completionItems; +} + void CppCodeCompletion::complete(const TextEditor::CompletionItem &item) { Symbol *symbol = 0; diff --git a/src/plugins/cpptools/cppcodecompletion.h b/src/plugins/cpptools/cppcodecompletion.h index f7d1667f761ca2dd916abba3b26dcbf04059ea1a..7d04c301850e00da9c8af87301283179b4294c5b 100644 --- a/src/plugins/cpptools/cppcodecompletion.h +++ b/src/plugins/cpptools/cppcodecompletion.h @@ -130,6 +130,8 @@ private: const QString &expression, int endOfExpression); + QList<TextEditor::CompletionItem> removeDuplicates(const QList<TextEditor::CompletionItem> &items); + private: bool objcKeywordsWanted() const;