From 5e59605c1e9503eaac9124d28918b231394e18b8 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Thu, 30 Sep 2010 16:12:24 +0200
Subject: [PATCH] QMLEditor: changed quickfix to only activate on the type id.

---
 .../qmljscomponentfromobjectdef.cpp           |  8 +++---
 src/plugins/qmljseditor/qmljsquickfix.cpp     | 11 ++++++++
 src/plugins/qmljseditor/qmljsquickfix.h       |  3 +++
 src/plugins/qmljseditor/qmljsquickfixes.cpp   |  7 +++---
 .../qmljseditor/qmljsrefactoringchanges.cpp   | 25 ++++++++++++++++++-
 .../qmljseditor/qmljsrefactoringchanges.h     |  3 +++
 6 files changed, 48 insertions(+), 9 deletions(-)

diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
index 0d21a6101a5..0fcfd8108ac 100644
--- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
+++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
@@ -149,20 +149,20 @@ public:
 
 QList<QmlJSQuickFixOperation::Ptr> ComponentFromObjectDef::match(const QmlJSQuickFixState &state)
 {
-    QList<QmlJSQuickFixOperation::Ptr> result;
     const int pos = state.currentFile().cursor().position();
 
     QList<Node *> path = state.semanticInfo().astPath(pos);
     for (int i = path.size() - 1; i >= 0; --i) {
         Node *node = path.at(i);
         if (UiObjectDefinition *objDef = cast<UiObjectDefinition *>(node)) {
+            if (!state.currentFile().isCursorOn(objDef->qualifiedTypeNameId))
+                return noResult();
              // check that the node is not the root node
             if (i > 0 && !cast<UiProgram*>(path.at(i - 1))) {
-                result.append(QmlJSQuickFixOperation::Ptr(new Operation(state, objDef)));
-                return result;
+                return singleResult(new Operation(state, objDef));
             }
         }
     }
 
-    return result;
+    return noResult();
 }
diff --git a/src/plugins/qmljseditor/qmljsquickfix.cpp b/src/plugins/qmljseditor/qmljsquickfix.cpp
index 3b5ce360f98..018442cd8bc 100644
--- a/src/plugins/qmljseditor/qmljsquickfix.cpp
+++ b/src/plugins/qmljseditor/qmljsquickfix.cpp
@@ -117,6 +117,17 @@ QList<QuickFixOperation::Ptr> QmlJSQuickFixFactory::matchingOperations(QuickFixS
         return QList<TextEditor::QuickFixOperation::Ptr>();
 }
 
+QList<QmlJSQuickFixOperation::Ptr> QmlJSQuickFixFactory::noResult()
+{
+    return QList<QmlJSQuickFixOperation::Ptr>();
+}
+
+QList<QmlJSQuickFixOperation::Ptr> QmlJSQuickFixFactory::singleResult(QmlJSQuickFixOperation *operation)
+{
+    QList<QmlJSQuickFixOperation::Ptr> result;
+    result.append(QmlJSQuickFixOperation::Ptr(operation));
+    return result;
+}
 
 QmlJSQuickFixCollector::QmlJSQuickFixCollector()
 {
diff --git a/src/plugins/qmljseditor/qmljsquickfix.h b/src/plugins/qmljseditor/qmljsquickfix.h
index 419cc73b902..57e6b2521f6 100644
--- a/src/plugins/qmljseditor/qmljsquickfix.h
+++ b/src/plugins/qmljseditor/qmljsquickfix.h
@@ -132,6 +132,9 @@ public:
         QmlJSQuickFixOperation objects.
      */
     virtual QList<QmlJSQuickFixOperation::Ptr> match(const QmlJSQuickFixState &state) = 0;
+
+    static QList<QmlJSQuickFixOperation::Ptr> noResult();
+    static QList<QmlJSQuickFixOperation::Ptr> singleResult(QmlJSQuickFixOperation *operation);
 };
 
 namespace Internal {
diff --git a/src/plugins/qmljseditor/qmljsquickfixes.cpp b/src/plugins/qmljseditor/qmljsquickfixes.cpp
index 145bcee5227..006ce4b457e 100644
--- a/src/plugins/qmljseditor/qmljsquickfixes.cpp
+++ b/src/plugins/qmljseditor/qmljsquickfixes.cpp
@@ -52,8 +52,6 @@ class SplitInitializerOp: public QmlJSQuickFixFactory
 public:
     virtual QList<QmlJSQuickFixOperation::Ptr> match(const QmlJSQuickFixState &state)
     {
-        QList<QmlJSQuickFixOperation::Ptr> result;
-
         UiObjectInitializer *objectInitializer = 0;
 
         const int pos = state.currentFile().cursor().position();
@@ -70,8 +68,9 @@ public:
         }
 
         if (objectInitializer)
-            result.append(QSharedPointer<QmlJSQuickFixOperation>(new Operation(state, objectInitializer)));
-        return result;
+            return singleResult(new Operation(state, objectInitializer));
+        else
+            return noResult();
     }
 
 private:
diff --git a/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp b/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp
index a612b070cdf..bf7ed2018c0 100644
--- a/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp
+++ b/src/plugins/qmljseditor/qmljsrefactoringchanges.cpp
@@ -30,6 +30,7 @@
 #include "qmljsrefactoringchanges.h"
 #include "qmljseditorcodeformatter.h"
 
+#include <qmljs/parser/qmljsast_p.h>
 #include <qmljs/qmljsmodelmanagerinterface.h>
 #include <texteditor/texteditorsettings.h>
 #include <texteditor/tabsettings.h>
@@ -109,11 +110,33 @@ Document::Ptr QmlJSRefactoringFile::qmljsDocument() const
     return m_qmljsDocument;
 }
 
-unsigned QmlJSRefactoringFile::startOf(const QmlJS::AST::SourceLocation &loc) const
+unsigned QmlJSRefactoringFile::startOf(const AST::SourceLocation &loc) const
 {
     return position(loc.startLine, loc.startColumn);
 }
 
+bool QmlJSRefactoringFile::isCursorOn(AST::UiObjectMember *ast) const
+{
+    const unsigned pos = cursor().position();
+
+    return ast->firstSourceLocation().begin() <= pos
+            && pos <= ast->lastSourceLocation().end();
+}
+
+bool QmlJSRefactoringFile::isCursorOn(AST::UiQualifiedId *ast) const
+{
+    const unsigned pos = cursor().position();
+
+    if (ast->identifierToken.begin() > pos)
+        return false;
+
+    AST::UiQualifiedId *last = ast;
+    while (last->next)
+        last = last->next;
+
+    return pos <= ast->identifierToken.end();
+}
+
 QmlJSRefactoringChanges *QmlJSRefactoringFile::refactoringChanges() const
 {
     return static_cast<QmlJSRefactoringChanges *>(m_refactoringChanges);
diff --git a/src/plugins/qmljseditor/qmljsrefactoringchanges.h b/src/plugins/qmljseditor/qmljsrefactoringchanges.h
index 993012e9c8c..b1ba3d4e466 100644
--- a/src/plugins/qmljseditor/qmljsrefactoringchanges.h
+++ b/src/plugins/qmljseditor/qmljsrefactoringchanges.h
@@ -57,6 +57,9 @@ public:
      */
     unsigned startOf(const QmlJS::AST::SourceLocation &loc) const;
 
+    bool isCursorOn(QmlJS::AST::UiObjectMember *ast) const;
+    bool isCursorOn(QmlJS::AST::UiQualifiedId *ast) const;
+
 private:
     QmlJSRefactoringChanges *refactoringChanges() const;
 
-- 
GitLab