aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language/evaluatorscriptclass.cpp
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2017-04-28 16:09:30 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2017-05-02 09:47:11 +0000
commit8fe1989fdd0f147c5d89bd420772bf3fc6844a6b (patch)
treee195cd56272cb6ae3710f632e555bdfae2e72bcc /src/lib/corelib/language/evaluatorscriptclass.cpp
parentb6bf17cfd1cad7a673082e80896edec889809446 (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.cpp54
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;