From d63199ca13f92e51ce1f425edcf21f5f3a592bed Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Thu, 11 Nov 2010 11:11:48 +0100
Subject: [PATCH] QmlJS: Resolve property types within package.

Reviewed-by: Christian Kamm
---
 src/libs/qmljs/qmljsinterpreter.cpp | 19 +++++++++++++++++--
 src/libs/qmljs/qmljsinterpreter.h   |  4 +++-
 2 files changed, 20 insertions(+), 3 deletions(-)

diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp
index 47353fe135e..e0d18017010 100644
--- a/src/libs/qmljs/qmljsinterpreter.cpp
+++ b/src/libs/qmljs/qmljsinterpreter.cpp
@@ -858,8 +858,12 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const
 
     // ### Verify type resolving.
     QmlObjectValue *objectValue = engine()->cppQmlTypes().typeForImport(typeName);
-    if (objectValue)
+    if (objectValue) {
+        QString packageClassName = objectValue->nameInPackage(packageName());
+        if (!packageClassName.isEmpty())
+            objectValue = engine()->cppQmlTypes().typeForImport(packageName() + '.' + packageClassName);
         return objectValue;
+    }
 
     const Value *value = engine()->undefinedValue();
     if (typeName == QLatin1String("QByteArray")
@@ -910,6 +914,14 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const
 QString QmlObjectValue::packageName() const
 { return _packageName; }
 
+QString QmlObjectValue::nameInPackage(const QString &packageName) const
+{
+    foreach (const FakeMetaObject::Export &exp, _metaObject->exports())
+        if (exp.package == packageName)
+            return exp.type;
+    return QString();
+}
+
 QmlJS::ComponentVersion QmlObjectValue::version() const
 { return _componentVersion; }
 
@@ -2190,7 +2202,8 @@ QList<QmlObjectValue *> CppQmlTypes::typesForImport(const QString &packageName,
     return objectValuesByName.values();
 }
 
-QmlObjectValue *CppQmlTypes::typeForImport(const QString &qualifiedName) const
+QmlObjectValue *CppQmlTypes::typeForImport(const QString &qualifiedName,
+                                           QmlJS::ComponentVersion version) const
 {
     QString name = qualifiedName;
     QString packageName;
@@ -2205,6 +2218,8 @@ QmlObjectValue *CppQmlTypes::typeForImport(const QString &qualifiedName) const
         const QString typeName = qmlObjectValue->className();
         if (typeName != name)
             continue;
+        if (version.isValid() && version < qmlObjectValue->version())
+            continue;
 
         if (previousCandidate) {
             // check if our new candidate is newer than the one we found previously
diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h
index 76f0a975228..cb273f5f834 100644
--- a/src/libs/qmljs/qmljsinterpreter.h
+++ b/src/libs/qmljs/qmljsinterpreter.h
@@ -420,6 +420,7 @@ public:
     const Value *propertyValue(const FakeMetaProperty &prop) const;
 
     QString packageName() const;
+    QString nameInPackage(const QString &packageName) const;
     ComponentVersion version() const;
     QString defaultPropertyName() const;
     QString propertyType(const QString &propertyName) const;
@@ -563,7 +564,8 @@ public:
     void load(Interpreter::Engine *interpreter, const QList<const FakeMetaObject *> &objects);
 
     QList<Interpreter::QmlObjectValue *> typesForImport(const QString &prefix, ComponentVersion version) const;
-    Interpreter::QmlObjectValue *typeForImport(const QString &qualifiedName) const;
+    Interpreter::QmlObjectValue *typeForImport(const QString &qualifiedName,
+                                               ComponentVersion version = ComponentVersion()) const;
 
     bool hasPackage(const QString &package) const;
 
-- 
GitLab