OSDN Git Service

C++ editor: Fix follow symbol for member functions
authorLeandro Melo <leandro.melo@nokia.com>
Fri, 8 Jul 2011 11:49:22 +0000 (13:49 +0200)
committerLeandro T. C. Melo <leandro.melo@nokia.com>
Fri, 8 Jul 2011 12:22:05 +0000 (14:22 +0200)
Fix a regression introduced by ad53fa42b03cb7f3237bd81c4bd92f462d8ec9da
in which follow symbol takes you to the function declaration (instead
of to the type) for situations like the one below (the | indicates the
cursor):

void Ty|pe::function() {}

Change-Id: Iffd15b23bb0cd67eca5965cb22d9b60c4d024fb7
Reviewed-on: http://codereview.qt.nokia.com/1375
Reviewed-by: Erik Verbruggen <erik.verbruggen@nokia.com>
src/plugins/cppeditor/cppeditor.cpp

index cda9444..b1da326 100644 (file)
@@ -1363,34 +1363,37 @@ CPPEditorWidget::Link CPPEditorWidget::findLinkAt(const QTextCursor &cursor,
     if (!m_modelManager)
         return link;
 
-    const Snapshot snapshot = m_modelManager->snapshot();
+    const Snapshot &snapshot = m_modelManager->snapshot();
+    Document::Ptr doc = m_lastSemanticInfo.doc;
+    if (!doc) {
+        doc = snapshot.document(file()->fileName());
+        if (!doc)
+            return link;
+    }
 
-    if (m_lastSemanticInfo.doc){
-        Link l = attemptFuncDeclDef(cursor, m_lastSemanticInfo.doc, snapshot);
-        if (l.isValid()) {
-            return l;
+    QTextCursor tc = cursor;
+    QChar ch = characterAt(tc.position());
+    while (ch.isLetterOrNumber() || ch == QLatin1Char('_')) {
+        tc.movePosition(QTextCursor::NextCharacter);
+        ch = characterAt(tc.position());
+    }
+
+    if (doc->translationUnit() && doc->translationUnit()->ast()) {
+        int pos = tc.position();
+        while (characterAt(pos).isSpace())
+            ++pos;
+        if (characterAt(pos) == QLatin1Char('(')) {
+            link = attemptFuncDeclDef(cursor, doc, snapshot);
+            if (link.isValid())
+                return link;
         }
     }
 
     int lineNumber = 0, positionInBlock = 0;
     convertPosition(cursor.position(), &lineNumber, &positionInBlock);
-    Document::Ptr doc = snapshot.document(file()->fileName());
-    if (!doc)
-        return link;
-
     const unsigned line = lineNumber;
     const unsigned column = positionInBlock + 1;
 
-    QTextCursor tc = cursor;
-
-    // Make sure we're not at the start of a word
-    {
-        const QChar c = characterAt(tc.position());
-        if (c.isLetter() || c == QLatin1Char('_'))
-            tc.movePosition(QTextCursor::Right);
-    }
-
-
     int beginOfToken = 0;
     int endOfToken = 0;