From ac4f53ef406ec147f1b1ad2e7b85d64f7c653d5d Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 8 Oct 2009 14:50:30 +0200
Subject: [PATCH] Search for `complete' expressions followed by a T_COMMA

As a side-effect, we can finally complete things like connect(&a, SIGNAL(
---
 src/libs/cplusplus/ExpressionUnderCursor.cpp | 29 ++++++++++++++++++--
 src/libs/cplusplus/ExpressionUnderCursor.h   |  1 +
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/src/libs/cplusplus/ExpressionUnderCursor.cpp b/src/libs/cplusplus/ExpressionUnderCursor.cpp
index 8016f537bb2..d95982b881c 100644
--- a/src/libs/cplusplus/ExpressionUnderCursor.cpp
+++ b/src/libs/cplusplus/ExpressionUnderCursor.cpp
@@ -45,8 +45,33 @@ ExpressionUnderCursor::~ExpressionUnderCursor()
 
 int ExpressionUnderCursor::startOfExpression(BackwardsScanner &tk, int index)
 {
-    // tk is a reference to a const QList. So, don't worry about [] access.
-    // ### TODO implement multiline support. It should be pretty easy.
+    index = startOfExpression_helper(tk, index);
+
+    if (_jumpedComma) {
+        const SimpleToken &tok = tk[index - 1];
+
+        switch (tok.kind()) {
+        case T_LPAREN:
+        case T_LBRACKET:
+        case T_LBRACE:
+        case T_SEMICOLON:
+        case T_COLON:
+        case T_QUESTION:
+            break;
+
+        default:
+            if (tok.isOperator())
+                return startOfExpression(tk, index - 1);
+
+            break;
+        }
+    }
+
+    return index;
+}
+
+int ExpressionUnderCursor::startOfExpression_helper(BackwardsScanner &tk, int index)
+{
     if (tk[index - 1].isLiteral()) {
         return index - 1;
     } else if (tk[index - 1].is(T_THIS)) {
diff --git a/src/libs/cplusplus/ExpressionUnderCursor.h b/src/libs/cplusplus/ExpressionUnderCursor.h
index 35be67214df..b72f790f977 100644
--- a/src/libs/cplusplus/ExpressionUnderCursor.h
+++ b/src/libs/cplusplus/ExpressionUnderCursor.h
@@ -55,6 +55,7 @@ public:
 
 private:
     int startOfExpression(BackwardsScanner &tk, int index);
+    int startOfExpression_helper(BackwardsScanner &tk, int index);
     int previousBlockState(const QTextBlock &block);
     bool isAccessToken(const SimpleToken &tk);
 
-- 
GitLab