diff options
author | Christian Kamm <christian.d.kamm@nokia.com> | 2011-06-21 15:10:57 +0200 |
---|---|---|
committer | Christian Kamm <christian.d.kamm@nokia.com> | 2011-06-22 12:07:06 +0200 |
commit | fc88340c6cab7f4fcb0b063cbeb842625e76ceed (patch) | |
tree | 7146d9ff3a9ca00a96a9a48bd6a777b24176630d | |
parent | 5118e75bc76f6c90a7e788d68763082c76db8dcb (diff) |
QmlJS: Setup QmlEnumValues even if enum is non-local.
Change-Id: Ib7a3621c14b6dfbdf36c75abac282c08f47e55ca
Reviewed-on: http://codereview.qt.nokia.com/559
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
-rw-r--r-- | src/libs/languageutils/fakemetaobject.cpp | 3 | ||||
-rw-r--r-- | src/libs/languageutils/fakemetaobject.h | 2 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsinterpreter.cpp | 25 | ||||
-rw-r--r-- | src/libs/qmljs/qmljsinterpreter.h | 9 |
4 files changed, 31 insertions, 8 deletions
diff --git a/src/libs/languageutils/fakemetaobject.cpp b/src/libs/languageutils/fakemetaobject.cpp index 41b153c2ed..08134840ee 100644 --- a/src/libs/languageutils/fakemetaobject.cpp +++ b/src/libs/languageutils/fakemetaobject.cpp @@ -41,6 +41,9 @@ FakeMetaEnum::FakeMetaEnum(const QString &name) : m_name(name) {} +bool FakeMetaEnum::isValid() const +{ return !m_name.isEmpty(); } + QString FakeMetaEnum::name() const { return m_name; } diff --git a/src/libs/languageutils/fakemetaobject.h b/src/libs/languageutils/fakemetaobject.h index 1fca983607..f44a59abbd 100644 --- a/src/libs/languageutils/fakemetaobject.h +++ b/src/libs/languageutils/fakemetaobject.h @@ -53,6 +53,8 @@ public: FakeMetaEnum(); explicit FakeMetaEnum(const QString &name); + bool isValid() const; + QString name() const; void setName(const QString &name); diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 5d53ce415d..64599946d2 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -227,7 +227,7 @@ void QmlObjectValue::processMembers(MemberProcessor *processor) const const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const { - const QString typeName = prop.typeName(); + QString typeName = prop.typeName(); // ### Verify type resolving. QmlObjectValue *objectValue = engine()->cppQmlTypes().typeByCppName(typeName); @@ -276,10 +276,16 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const } // might be an enum - int enumIndex = _metaObject->enumeratorIndex(prop.typeName()); - if (enumIndex != -1) { - const FakeMetaEnum &metaEnum = _metaObject->enumerator(enumIndex); - value = new QmlEnumValue(metaEnum, engine()); + const QmlObjectValue *base = this; + const QStringList components = typeName.split(QLatin1String("::")); + if (components.size() == 2) { + base = engine()->cppQmlTypes().typeByCppName(components.first()); + typeName = components.last(); + } + if (base) { + const FakeMetaEnum &metaEnum = base->getEnum(typeName); + if (metaEnum.isValid()) + value = new QmlEnumValue(metaEnum, engine()); } return value; @@ -344,6 +350,15 @@ bool QmlObjectValue::isEnum(const QString &typeName) const return _metaObject->enumeratorIndex(typeName) != -1; } +FakeMetaEnum QmlObjectValue::getEnum(const QString &typeName) const +{ + const int index = _metaObject->enumeratorIndex(typeName); + if (index == -1) + return FakeMetaEnum(); + + return _metaObject->enumerator(index); +} + bool QmlObjectValue::isWritable(const QString &propertyName) const { for (const QmlObjectValue *it = this; it; it = it->prototype()) { diff --git a/src/libs/qmljs/qmljsinterpreter.h b/src/libs/qmljs/qmljsinterpreter.h index 286a9794fe..26a48b5f85 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -490,13 +490,16 @@ public: bool isListProperty(const QString &name) const; bool isWritable(const QString &propertyName) const; bool isPointer(const QString &propertyName) const; - bool isEnum(const QString &typeName) const; bool hasLocalProperty(const QString &typeName) const; bool hasProperty(const QString &typeName) const; - bool enumContainsKey(const QString &enumName, const QString &enumKeyName) const; - QStringList keysForEnum(const QString &enumName) const; bool hasChildInPackage() const; + LanguageUtils::FakeMetaEnum getEnum(const QString &typeName) const; + + // deprecated + bool isEnum(const QString &typeName) const; + QStringList keysForEnum(const QString &enumName) const; + bool enumContainsKey(const QString &enumName, const QString &enumKeyName) const; protected: const Value *findOrCreateSignature(int index, const LanguageUtils::FakeMetaMethod &method, QString *methodName) const; |