From 207c29555282df39c44e5c298c8ad8bee743ba1c Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 20 Dec 2010 16:10:56 +0100
Subject: [PATCH] Sort the completion items when searching for common prefixes.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Reviewed-by: Thorbjørn Lindeijer
---
 src/plugins/cpptools/cppcodecompletion.cpp      |  2 +-
 src/plugins/qmljseditor/qmljscodecompletion.cpp |  7 ++++++-
 src/plugins/qmljseditor/qmljscodecompletion.h   |  1 +
 src/plugins/texteditor/icompletioncollector.cpp | 12 +++++++++++-
 src/plugins/texteditor/icompletioncollector.h   |  2 ++
 5 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 9e3a5a534f9..c777141dd81 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -745,7 +745,7 @@ int CppCodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
         }
 
         if (m_completionOperator != T_EOF_SYMBOL)
-            qSort(m_completions.begin(), m_completions.end(), completionItemLessThan);
+            sortCompletion(m_completions);
 
         // always remove duplicates
         m_completions = removeDuplicates(m_completions);
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 7f46be938a2..80aa8035c9f 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -1074,13 +1074,18 @@ static bool qmlCompletionItemLessThan(const TextEditor::CompletionItem &l, const
     return l.text < r.text;
 }
 
+void CodeCompletion::sortCompletion(QList<TextEditor::CompletionItem> &completionItems)
+{
+    qStableSort(completionItems.begin(), completionItems.end(), qmlCompletionItemLessThan);
+}
+
 QList<TextEditor::CompletionItem> CodeCompletion::getCompletions()
 {
     QList<TextEditor::CompletionItem> completionItems;
 
     completions(&completionItems);
 
-    qStableSort(completionItems.begin(), completionItems.end(), qmlCompletionItemLessThan);
+    sortCompletion(completionItems);
 
     // Remove duplicates
     QString lastKey;
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.h b/src/plugins/qmljseditor/qmljscodecompletion.h
index 98821f579fc..440d20fb9c3 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.h
+++ b/src/plugins/qmljseditor/qmljscodecompletion.h
@@ -77,6 +77,7 @@ public:
     virtual void complete(const TextEditor::CompletionItem &item, QChar typedChar);
     virtual bool partiallyComplete(const QList<TextEditor::CompletionItem> &completionItems);
     virtual QList<TextEditor::CompletionItem> getCompletions();
+    virtual void sortCompletion(QList<TextEditor::CompletionItem> &completionItems);
 
     virtual void cleanup();
 
diff --git a/src/plugins/texteditor/icompletioncollector.cpp b/src/plugins/texteditor/icompletioncollector.cpp
index 87d76d3bc54..29f64719b2c 100644
--- a/src/plugins/texteditor/icompletioncollector.cpp
+++ b/src/plugins/texteditor/icompletioncollector.cpp
@@ -127,10 +127,15 @@ QList<CompletionItem> ICompletionCollector::getCompletions()
     return uniquelist;
 }
 
-bool ICompletionCollector::partiallyComplete(const QList<TextEditor::CompletionItem> &completionItems)
+bool ICompletionCollector::partiallyComplete(const QList<TextEditor::CompletionItem> &items)
 {
     if (! m_d->m_completionSettings.m_partiallyComplete)
         return false;
+    if (items.size() >= 100)
+        return false;
+
+    QList<TextEditor::CompletionItem> completionItems = items;
+    sortCompletion(completionItems);
 
     // Compute common prefix
     QString firstKey = completionItems.first().text;
@@ -155,6 +160,11 @@ bool ICompletionCollector::partiallyComplete(const QList<TextEditor::CompletionI
     return false;
 }
 
+void ICompletionCollector::sortCompletion(QList<TextEditor::CompletionItem> &completionItems)
+{
+    qStableSort(completionItems.begin(), completionItems.end(), &ICompletionCollector::completionItemLessThan);
+}
+
 void ICompletionCollector::filter(const QList<TextEditor::CompletionItem> &items,
                                   QList<TextEditor::CompletionItem> *filteredItems,
                                   const QString &key)
diff --git a/src/plugins/texteditor/icompletioncollector.h b/src/plugins/texteditor/icompletioncollector.h
index 687f40762be..716667a9550 100644
--- a/src/plugins/texteditor/icompletioncollector.h
+++ b/src/plugins/texteditor/icompletioncollector.h
@@ -139,6 +139,8 @@ public:
      */
     virtual bool partiallyComplete(const QList<TextEditor::CompletionItem> &completionItems);
 
+    virtual void sortCompletion(QList<TextEditor::CompletionItem> &completionItems);
+
     /* Called when it's safe to clean up the completion items.
      */
     virtual void cleanup() = 0;
-- 
GitLab