From 46e612761f6bce9629028ef7fe6d3da45b98cd95 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Fri, 11 Dec 2009 12:26:42 +0100
Subject: [PATCH] Be smarter about CamelCase when doing case-insensitive
 completion

Even when an upper case character can also match a lower case one, it
should only be treated as a CamelCase match when the matched character
is also upper case. This avoids some false positives.

Also, the part that allows a word in a CamelCase identifier to be
truncated should never be matched case-insensitively.
---
 src/plugins/cpptools/cppcodecompletion.cpp | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)

diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 9f2a5cd8b9c..8726a4300be 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -1444,23 +1444,27 @@ void CppCodeCompletion::completions(QList<TextEditor::CompletionItem> *completio
             QString keyRegExp;
             keyRegExp += QLatin1Char('^');
             bool first = true;
+            const QLatin1String wordContinuation("[a-z0-9_]*");
             foreach (const QChar &c, key) {
-                if (c.isUpper() && !first)
-                    keyRegExp += QLatin1String("[a-z0-9_]*");
+                if (m_caseSensitivity == CaseInsensitive ||
+                    (m_caseSensitivity == FirstLetterCaseSensitive && !first)) {
 
-                if (m_caseSensitivity == FirstLetterCaseSensitive && !first) {
-                    keyRegExp += QLatin1Char('[');
-                    keyRegExp += QRegExp::escape(c.toLower());
+                    keyRegExp += QLatin1String("(?:");
+                    if (c.isUpper() && !first)
+                        keyRegExp += wordContinuation;
                     keyRegExp += QRegExp::escape(c.toUpper());
-                    keyRegExp += QLatin1Char(']');
+                    keyRegExp += "|";
+                    keyRegExp += QRegExp::escape(c.toLower());
+                    keyRegExp += QLatin1Char(')');
                 } else {
+                    if (c.isUpper() && !first)
+                        keyRegExp += wordContinuation;
                     keyRegExp += QRegExp::escape(c);
                 }
 
                 first = false;
             }
-            const QRegExp regExp(keyRegExp, (m_caseSensitivity == CaseInsensitive)
-                                 ? Qt::CaseInsensitive : Qt::CaseSensitive);
+            const QRegExp regExp(keyRegExp);
 
             foreach (TextEditor::CompletionItem item, m_completions) {
                 if (regExp.indexIn(item.text) == 0) {
-- 
GitLab