Speedup global completion.

Don't sort the global completion items when we have too many of them, instead
populate the completion box in a way where local symbols are showed before
global symbols.
This commit is contained in:
Roberto Raggi
2010-05-27 19:00:44 +02:00
parent 64e9f652e0
commit 75bcf2bc66

View File

@@ -82,6 +82,10 @@ namespace {
const bool debug = ! qgetenv("CPLUSPLUS_DEBUG").isEmpty();
}
enum {
MAX_COMPLETION_ITEM = 1000
};
using namespace CPlusPlus;
namespace CppTools {
@@ -654,8 +658,10 @@ bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor)
int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
{
int index = startCompletionHelper(editor);
if (index != -1)
qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
if (index != -1) {
if (m_completionOperator != T_EOF_SYMBOL)
qStableSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
}
return index;
}
@@ -891,9 +897,6 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
return;
}
addKeywords();
addMacros(context.thisDocument()->fileName(), context.snapshot());
QList<ClassOrNamespace *> usingBindings;
ClassOrNamespace *currentBinding = 0;
@@ -916,20 +919,6 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
}
}
for (; currentBinding; currentBinding = currentBinding->parent()) {
const QList<Symbol *> symbols = currentBinding->symbols();
if (! symbols.isEmpty()) {
if (symbols.first()->isNamespace())
completeNamespace(currentBinding);
else
completeClass(currentBinding, false);
}
}
foreach (ClassOrNamespace *b, usingBindings)
completeNamespace(b);
for (Scope *scope = currentScope; scope; scope = scope->enclosingScope()) {
if (scope->isBlockScope()) {
for (unsigned i = 0; i < scope->symbolCount(); ++i) {
@@ -945,6 +934,23 @@ void CppCodeCompletion::globalCompletion(Scope *currentScope)
break;
}
}
for (; currentBinding; currentBinding = currentBinding->parent()) {
const QList<Symbol *> symbols = currentBinding->symbols();
if (! symbols.isEmpty()) {
if (symbols.first()->isNamespace())
completeNamespace(currentBinding);
else
completeClass(currentBinding, false);
}
}
foreach (ClassOrNamespace *b, usingBindings)
completeNamespace(b);
addKeywords();
addMacros(context.thisDocument()->fileName(), context.snapshot());
}
bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &results,
@@ -1590,6 +1596,10 @@ QList<TextEditor::CompletionItem> CppCodeCompletion::getCompletions()
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;