forked from qt-creator/qt-creator
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user