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