From 088bdb29db87571963e0fab6ff98a6f023c55f0e Mon Sep 17 00:00:00 2001
From: Christian Kamm <christian.d.kamm@nokia.com>
Date: Wed, 19 May 2010 11:15:57 +0200
Subject: [PATCH] QmlJS: Provide good completion for PropertyChanges with a
 target again.

Task-number: QTCREATORBUG-1413
Reviewed-by: Erik Verbruggen
---
 src/libs/qmljs/qmljsscopebuilder.cpp          | 25 +++++++++++++------
 src/libs/qmljs/qmljsscopebuilder.h            |  3 +++
 .../qmljseditor/qmljscodecompletion.cpp       |  6 +++++
 3 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/src/libs/qmljs/qmljsscopebuilder.cpp b/src/libs/qmljs/qmljsscopebuilder.cpp
index 7a3bcfd86a5..80b3fbb7d74 100644
--- a/src/libs/qmljs/qmljsscopebuilder.cpp
+++ b/src/libs/qmljs/qmljsscopebuilder.cpp
@@ -106,14 +106,7 @@ void ScopeBuilder::setQmlScopeObject(Node *node)
 
     // check if the object has a Qt.PropertyChanges ancestor
     prototype = scopeObject->prototype(_context);
-    while (prototype) {
-        if (const QmlObjectValue *qmlMetaObject = dynamic_cast<const QmlObjectValue *>(prototype)) {
-            if (qmlMetaObject->className() == QLatin1String("PropertyChanges")
-                    && qmlMetaObject->packageName() == QLatin1String("Qt"))
-                break;
-        }
-        prototype = prototype->prototype(_context);
-    }
+    prototype = isPropertyChangesObject(_context, prototype);
     // find the target script binding
     if (prototype) {
         UiObjectInitializer *initializer = 0;
@@ -169,3 +162,19 @@ const Value *ScopeBuilder::scopeObjectLookup(AST::UiQualifiedId *id)
 
     return result;
 }
+
+
+const ObjectValue *ScopeBuilder::isPropertyChangesObject(Context *context,
+                                                   const ObjectValue *object)
+{
+    const ObjectValue *prototype = object;
+    while (prototype) {
+        if (const QmlObjectValue *qmlMetaObject = dynamic_cast<const QmlObjectValue *>(prototype)) {
+            if (qmlMetaObject->className() == QLatin1String("PropertyChanges")
+                    && qmlMetaObject->packageName() == QLatin1String("Qt"))
+                return prototype;
+        }
+        prototype = prototype->prototype(context);
+    }
+    return 0;
+}
diff --git a/src/libs/qmljs/qmljsscopebuilder.h b/src/libs/qmljs/qmljsscopebuilder.h
index 34485039bf2..7141eee25c7 100644
--- a/src/libs/qmljs/qmljsscopebuilder.h
+++ b/src/libs/qmljs/qmljsscopebuilder.h
@@ -14,6 +14,7 @@ namespace AST {
 namespace Interpreter {
     class Context;
     class Value;
+    class ObjectValue;
 }
 
 class QMLJS_EXPORT ScopeBuilder
@@ -26,6 +27,8 @@ public:
     void push(const QList<AST::Node *> &nodes);
     void pop();
 
+    static const Interpreter::ObjectValue *isPropertyChangesObject(Interpreter::Context *context, const Interpreter::ObjectValue *object);
+
 private:
     void setQmlScopeObject(AST::Node *node);
     const Interpreter::Value *scopeObjectLookup(AST::UiQualifiedId *id);
diff --git a/src/plugins/qmljseditor/qmljscodecompletion.cpp b/src/plugins/qmljseditor/qmljscodecompletion.cpp
index 56a9a439630..adbd80e0ca6 100644
--- a/src/plugins/qmljseditor/qmljscodecompletion.cpp
+++ b/src/plugins/qmljseditor/qmljscodecompletion.cpp
@@ -38,6 +38,7 @@
 #include <qmljs/qmljsscanner.h>
 #include <qmljs/qmljsevaluate.h>
 #include <qmljs/qmljscompletioncontextfinder.h>
+#include <qmljs/qmljsscopebuilder.h>
 
 #include <texteditor/basetexteditor.h>
 
@@ -687,6 +688,11 @@ int CodeCompletion::startCompletion(TextEditor::ITextEditable *editor)
 
             addCompletions(enumerateProperties(qmlScopeType), symbolIcon);
             addCompletions(enumerateProperties(context.scopeChain().qmlTypes), symbolIcon);
+
+            if (ScopeBuilder::isPropertyChangesObject(&context, qmlScopeType)
+                    && context.scopeChain().qmlScopeObjects.size() == 2) {
+                addCompletions(enumerateProperties(context.scopeChain().qmlScopeObjects.first()), symbolIcon);
+            }
         }
 
         if (contextFinder.isInRhsOfBinding() && qmlScopeType) {
-- 
GitLab