diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-04-28 16:09:30 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2017-05-02 09:47:11 +0000 |
commit | 8fe1989fdd0f147c5d89bd420772bf3fc6844a6b (patch) | |
tree | e195cd56272cb6ae3710f632e555bdfae2e72bcc /src/lib/corelib/language/evaluatorscriptclass.cpp | |
parent | b6bf17cfd1cad7a673082e80896edec889809446 (diff) |
Support enumeration of EvaluatorScriptClass-provided objects
Implement QScriptClassPropertyIterator to support enumerating over
properties of JS objects that have an Item representation.
We can now create QVariantMaps from Item objects by calling
QScriptValue::toVariant. JSON.stringify and 'for (i in obj)' now
also work properly.
Task-number: QBS-693
Change-Id: I7758ed61708dde5dd71af7ab2ca24232d0341a68
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src/lib/corelib/language/evaluatorscriptclass.cpp')
-rw-r--r-- | src/lib/corelib/language/evaluatorscriptclass.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp index fc7a9cbd5..c82ccc464 100644 --- a/src/lib/corelib/language/evaluatorscriptclass.cpp +++ b/src/lib/corelib/language/evaluatorscriptclass.cpp @@ -55,6 +55,7 @@ #include <QtCore/qdebug.h> #include <QtCore/qsettings.h> +#include <QtScript/qscriptclasspropertyiterator.h> #include <QtScript/qscriptstring.h> #include <QtScript/qscriptvalue.h> @@ -618,6 +619,59 @@ QScriptValue EvaluatorScriptClass::property(const QScriptValue &object, const QS return result; } +class EvaluatorScriptClassPropertyIterator : public QScriptClassPropertyIterator +{ +public: + EvaluatorScriptClassPropertyIterator(const QScriptValue &object, EvaluationData *data) + : QScriptClassPropertyIterator(object), m_it(data->item->properties()) + { + } + + bool hasNext() const override + { + return m_it.hasNext(); + } + + void next() override + { + m_it.next(); + } + + bool hasPrevious() const override + { + return m_it.hasPrevious(); + } + + void previous() override + { + m_it.previous(); + } + + void toFront() override + { + m_it.toFront(); + } + + void toBack() override + { + m_it.toBack(); + } + + QScriptString name() const + { + return object().engine()->toStringHandle(m_it.key()); + } + +private: + QMapIterator<QString, ValuePtr> m_it; +}; + +QScriptClassPropertyIterator *EvaluatorScriptClass::newIterator(const QScriptValue &object) +{ + EvaluationData *const data = attachedPointer<EvaluationData>(object); + return data ? new EvaluatorScriptClassPropertyIterator(object, data) : nullptr; +} + void EvaluatorScriptClass::setValueCacheEnabled(bool enabled) { m_valueCacheEnabled = enabled; |