From 0bb575b1f27199f6fa3c16ff805e8663920ef4cf Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Mon, 1 Feb 2010 16:14:34 +0100
Subject: [PATCH] Create a link for the QML/JS expression under cursor.

---
 src/plugins/qmljseditor/qmljseditor.cpp | 38 +++++++++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/src/plugins/qmljseditor/qmljseditor.cpp b/src/plugins/qmljseditor/qmljseditor.cpp
index c34b206899e..0593033a26d 100644
--- a/src/plugins/qmljseditor/qmljseditor.cpp
+++ b/src/plugins/qmljseditor/qmljseditor.cpp
@@ -835,6 +835,44 @@ void QmlJSTextEditor::createToolBar(QmlJSEditorEditable *editable)
 TextEditor::BaseTextEditor::Link QmlJSTextEditor::findLinkAt(const QTextCursor &cursor, bool /*resolveTarget*/)
 {
     Link link;
+    const SemanticInfo semanticInfo = m_semanticInfo;
+
+    if (semanticInfo.document) {
+        CollectASTNodes nodes;
+        nodes.accept(semanticInfo.document->ast());
+
+        const unsigned cursorPosition = cursor.position();
+
+        foreach (AST::UiQualifiedId *q, nodes.qualifiedIds) {
+            if (cursorPosition >= q->identifierToken.begin()) {
+                for (AST::UiQualifiedId *tail = q; tail; tail = tail->next) {
+                    if (! tail->next && cursorPosition <= tail->identifierToken.end()) {
+                        link.begin = tail->identifierToken.begin();
+                        link.end = tail->identifierToken.end();
+                        return link;
+                    }
+                }
+            }
+        }
+
+        foreach (AST::IdentifierExpression *id, nodes.identifiers) {
+            if (cursorPosition >= id->identifierToken.begin() && cursorPosition <= id->identifierToken.end()) {
+                link.begin = id->firstSourceLocation().begin();
+                link.end = id->lastSourceLocation().end();
+                return link;
+            }
+        }
+
+        foreach (AST::FieldMemberExpression *mem, nodes.fieldMembers) {
+            if (mem->name && cursorPosition >= mem->identifierToken.begin() && cursorPosition <= mem->identifierToken.end()) {
+                link.begin = mem->lastSourceLocation().begin();
+                link.end = mem->lastSourceLocation().end();
+                return link;
+            }
+        }
+
+    }
+
     return link;
 }
 
-- 
GitLab