From efc0b20859d1cfd5949191f6b2b65f9266c49625 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com>
Date: Wed, 27 May 2009 11:12:06 +0200
Subject: [PATCH] Made typing parenthesis even faster

Only attempt to activate the completion when there is a function id on
the left of the parenthesis.

Reviewed-by: Roberto Raggi
---
 src/libs/cplusplus/SimpleLexer.h           |  6 ++++++
 src/libs/cplusplus/TokenUnderCursor.cpp    |  8 ++++----
 src/libs/cplusplus/TokenUnderCursor.h      |  9 ++++++---
 src/plugins/cpptools/cppcodecompletion.cpp | 20 ++++++++++++++++++++
 4 files changed, 36 insertions(+), 7 deletions(-)

diff --git a/src/libs/cplusplus/SimpleLexer.h b/src/libs/cplusplus/SimpleLexer.h
index 3359358e73e..0366738c6bd 100644
--- a/src/libs/cplusplus/SimpleLexer.h
+++ b/src/libs/cplusplus/SimpleLexer.h
@@ -56,6 +56,12 @@ public:
     inline int length() const
     { return _length; }
 
+    inline int begin() const
+    { return _position; }
+
+    inline int end() const
+    { return _position + _length; }
+
     inline QStringRef text() const
     { return _text; }
 
diff --git a/src/libs/cplusplus/TokenUnderCursor.cpp b/src/libs/cplusplus/TokenUnderCursor.cpp
index a819007828e..997c1e6e3aa 100644
--- a/src/libs/cplusplus/TokenUnderCursor.cpp
+++ b/src/libs/cplusplus/TokenUnderCursor.cpp
@@ -42,7 +42,7 @@ TokenUnderCursor::TokenUnderCursor()
 TokenUnderCursor::~TokenUnderCursor()
 { }
 
-SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b) const
+SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b)
 {
     SimpleLexer tokenize;
     tokenize.setObjCEnabled(true);
@@ -51,9 +51,9 @@ SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *
     QTextBlock block = cursor.block();
     int column = cursor.columnNumber();
 
-    QList<SimpleToken> tokens = tokenize(block.text(), previousBlockState(block));
-    for (int index = tokens.size() - 1; index != -1; --index) {
-        const SimpleToken &tk = tokens.at(index);
+    _tokens = tokenize(block.text(), previousBlockState(block));
+    for (int index = _tokens.size() - 1; index != -1; --index) {
+        const SimpleToken &tk = _tokens.at(index);
         if (tk.position() < column) {
             if (b)
                 *b = block;
diff --git a/src/libs/cplusplus/TokenUnderCursor.h b/src/libs/cplusplus/TokenUnderCursor.h
index 93199d2b382..536beac5691 100644
--- a/src/libs/cplusplus/TokenUnderCursor.h
+++ b/src/libs/cplusplus/TokenUnderCursor.h
@@ -40,18 +40,21 @@ QT_END_NAMESPACE
 
 namespace CPlusPlus {
 
-class SimpleToken;
-
 class CPLUSPLUS_EXPORT TokenUnderCursor
 {
 public:
     TokenUnderCursor();
     ~TokenUnderCursor();
 
-    SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0) const;
+    SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0);
+
+    const QList<SimpleToken> &tokens() const
+    { return _tokens; }
 
 private:
     int previousBlockState(const QTextBlock &block) const;
+
+    QList<SimpleToken> _tokens;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 84994e78b62..211ec084e69 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -514,6 +514,26 @@ static int startOfOperator(TextEditor::ITextEditable *editor,
         start = pos;
     }
 
+    if (k == T_LPAREN) {
+        const QList<SimpleToken> &tokens = tokenUnderCursor.tokens();
+        int i = 0;
+        for (; i < tokens.size(); ++i) {
+            const SimpleToken &token = tokens.at(i);
+            if (token.position() == tk.position()) {
+                if (i == 0) // no token on the left, but might be on a previous line
+                    break;
+                const SimpleToken &previousToken = tokens.at(i - 1);
+                if (previousToken.is(T_IDENTIFIER) || previousToken.is(T_GREATER))
+                    break;
+            }
+        }
+
+        if (i == tokens.size()) {
+            k = T_EOF_SYMBOL;
+            start = pos;
+        }
+    }
+
     if (kind)
         *kind = k;
 
-- 
GitLab