From 68d8d8309369c551615faa55c85aaf0cf94b1157 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 30 Mar 2009 15:25:06 +0200
Subject: [PATCH] Simplified the code that looks for the identifier under the
 cursor.

---
 src/libs/cplusplus/TokenUnderCursor.cpp |  7 ++++--
 src/libs/cplusplus/TokenUnderCursor.h   |  2 +-
 src/plugins/cppeditor/cppeditor.cpp     | 31 ++++++++++++++-----------
 3 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/src/libs/cplusplus/TokenUnderCursor.cpp b/src/libs/cplusplus/TokenUnderCursor.cpp
index b52e017bebe..a819007828e 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) const
+SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b) const
 {
     SimpleLexer tokenize;
     tokenize.setObjCEnabled(true);
@@ -54,8 +54,11 @@ SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor) const
     QList<SimpleToken> 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 (tk.position() < column) {
+            if (b)
+                *b = block;
             return tk;
+        }
     }
 
     return SimpleToken();
diff --git a/src/libs/cplusplus/TokenUnderCursor.h b/src/libs/cplusplus/TokenUnderCursor.h
index 1c3d4691874..93199d2b382 100644
--- a/src/libs/cplusplus/TokenUnderCursor.h
+++ b/src/libs/cplusplus/TokenUnderCursor.h
@@ -48,7 +48,7 @@ public:
     TokenUnderCursor();
     ~TokenUnderCursor();
 
-    SimpleToken operator()(const QTextCursor &cursor) const;
+    SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0) const;
 
 private:
     int previousBlockState(const QTextBlock &block) const;
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index dc043246688..1593b6118c2 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -618,24 +618,27 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor,
     if (!lastSymbol)
         return link;
 
-    // Check whether we're at a name
-    const int endOfName = endOfNameAtPosition(cursor.position());
-    if (!characterAt(endOfName - 1).isLetterOrNumber())
-        return link;
-
-    // Remember the position and length of the name
     QTextCursor tc = cursor;
-    tc.setPosition(endOfName);
-    tc.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor);
-    const int nameStart = tc.position();
-    const int nameLength = tc.anchor() - tc.position();
-    tc.setPosition(endOfName);
 
-    // Drop out if we're at a number, string or comment
     static TokenUnderCursor tokenUnderCursor;
-    const SimpleToken tk = tokenUnderCursor(tc);
-    if (tk.isLiteral() || tk.isComment())
+
+    QTextBlock block;
+    const SimpleToken tk = tokenUnderCursor(tc, &block);
+
+    if (tk.isLiteral() || tk.isComment()) {
+        // Drop out if we're at a number, string or comment
         return link;
+    }
+
+    if (tk.isNot(T_IDENTIFIER))
+        return link;
+
+    const int nameStart = tk.position();
+    const int nameLength = tk.length();
+    const int endOfName = nameStart + nameLength;
+
+    const QString name = block.text().mid(nameStart, nameLength);
+    tc.setPosition(block.position() + endOfName);
 
     // Evaluate the type of the expression under the cursor
     ExpressionUnderCursor expressionUnderCursor;
-- 
GitLab