diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index e82ace4a8835c3f6d0cd47b028e03367daae2825..b0fb630c877f9bb76911eae3a75956b2b5cd745e 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -161,9 +161,15 @@ QmlObjectValue::QmlObjectValue(FakeMetaObject::ConstPtr metaObject, const QStrin _attachedType(0), _metaObject(metaObject), _packageName(packageName), - _componentVersion(version) + _componentVersion(version), + _enums() { setClassName(className); + int nEnums = metaObject->enumeratorCount(); + for (int i = 0; i < nEnums; ++i) { + FakeMetaEnum fEnum = metaObject->enumerator(i); + _enums[fEnum.name()] = new QmlEnumValue(fEnum, valueOwner); + } } QmlObjectValue::~QmlObjectValue() @@ -307,9 +313,7 @@ const Value *QmlObjectValue::propertyValue(const FakeMetaProperty &prop) const typeName = components.last(); } if (base) { - const FakeMetaEnum &metaEnum = base->getEnum(typeName); - if (metaEnum.isValid()) - value = new QmlEnumValue(metaEnum, valueOwner()); + value = base->getEnumValue(typeName); } return value; @@ -378,6 +382,11 @@ FakeMetaEnum QmlObjectValue::getEnum(const QString &typeName) const return _metaObject->enumerator(index); } +const QmlEnumValue *QmlObjectValue::getEnumValue(const QString &typeName) const +{ + return _enums.value(typeName, 0); +} + 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 c4e0d0d1de7ff8585b05aadc6c6a831fe73a0069..85a49a5ee6aa2ca551ac9e2d8a21d03191f94171 100644 --- a/src/libs/qmljs/qmljsinterpreter.h +++ b/src/libs/qmljs/qmljsinterpreter.h @@ -421,6 +421,20 @@ private: Error m_error; }; +class QMLJS_EXPORT QmlEnumValue: public NumberValue +{ +public: + QmlEnumValue(const LanguageUtils::FakeMetaEnum &metaEnum, ValueOwner *valueOwner); + virtual ~QmlEnumValue(); + + QString name() const; + QStringList keys() const; + +private: + LanguageUtils::FakeMetaEnum *_metaEnum; +}; + + // A ObjectValue based on a FakeMetaObject. // May only have other QmlObjectValues as ancestors. class QMLJS_EXPORT QmlObjectValue: public ObjectValue @@ -455,6 +469,7 @@ public: bool hasChildInPackage() const; LanguageUtils::FakeMetaEnum getEnum(const QString &typeName) const; + const QmlEnumValue *getEnumValue(const QString &typeName) const; protected: const Value *findOrCreateSignature(int index, const LanguageUtils::FakeMetaMethod &method, QString *methodName) const; @@ -466,19 +481,7 @@ private: const QString _packageName; const LanguageUtils::ComponentVersion _componentVersion; mutable QHash<int, const Value *> _metaSignature; -}; - -class QMLJS_EXPORT QmlEnumValue: public NumberValue -{ -public: - QmlEnumValue(const LanguageUtils::FakeMetaEnum &metaEnum, ValueOwner *valueOwner); - virtual ~QmlEnumValue(); - - QString name() const; - QStringList keys() const; - -private: - LanguageUtils::FakeMetaEnum *_metaEnum; + QHash<QString, const QmlEnumValue * > _enums; }; class QMLJS_EXPORT Activation