diff options
author | Aurindam Jana <aurindam.jana@nokia.com> | 2012-05-10 09:21:26 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-05-12 11:00:34 +0200 |
commit | 6f9b3893c8c7bc0b6663acb34c17c120852ef7b7 (patch) | |
tree | f992993047106aead5d5228fb490120df7da490d /src/qml/debugger | |
parent | 36d6307dd19d34354fb1ada7b6e5883977d43db8 (diff) |
QQmlDebugService: Fetch Objects for location info
Fetch Objects for given filename, line number and column
number.
Change-Id: I9a81e4c7fa75faaf87f02453026c5320b7f86003
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
Diffstat (limited to 'src/qml/debugger')
-rw-r--r-- | src/qml/debugger/qqmldebugservice.cpp | 35 | ||||
-rw-r--r-- | src/qml/debugger/qqmldebugservice_p.h | 2 | ||||
-rw-r--r-- | src/qml/debugger/qqmlenginedebugservice.cpp | 31 | ||||
-rw-r--r-- | src/qml/debugger/qqmlenginedebugservice_p.h | 1 |
4 files changed, 69 insertions, 0 deletions
diff --git a/src/qml/debugger/qqmldebugservice.cpp b/src/qml/debugger/qqmldebugservice.cpp index 76847e5a46..57d5a714ff 100644 --- a/src/qml/debugger/qqmldebugservice.cpp +++ b/src/qml/debugger/qqmldebugservice.cpp @@ -42,9 +42,12 @@ #include "qqmldebugservice_p.h" #include "qqmldebugservice_p_p.h" #include "qqmldebugserver_p.h" +#include <private/qqmldata_p.h> +#include <private/qqmlcontext_p.h> #include <QtCore/QDebug> #include <QtCore/QStringList> +#include <QtCore/QFileInfo> QT_BEGIN_NAMESPACE @@ -202,6 +205,38 @@ QObject *QQmlDebugService::objectForId(int id) } } +/*! + Returns a list of objects matching the given filename, line and column. +*/ +QList<QObject*> QQmlDebugService::objectForLocationInfo(const QString &filename, + int lineNumber, int columnNumber) +{ + ObjectReferenceHash *hash = objectReferenceHash(); + QList<QObject*> objects; + QHash<int, QObject *>::Iterator iter; + for (iter = hash->ids.begin(); iter != hash->ids.end(); ++iter) { + QQmlData *ddata = QQmlData::get(iter.value()); + if (!ddata || !ddata->outerContext) + continue; + //column number may be different due to qmlrewriter + if (QFileInfo(ddata->outerContext->urlString).fileName() == filename && + ddata->lineNumber == lineNumber && + ddata->columnNumber >= columnNumber) { + QHash<QObject *, ObjectReference>::Iterator objIter = + hash->objects.find(*iter); + Q_ASSERT(objIter != hash->objects.end()); + + if (objIter->object == 0) { + hash->ids.erase(iter); + hash->objects.erase(objIter); + } else { + objects << *iter; + } + } + } + return objects; +} + bool QQmlDebugService::isDebuggingEnabled() { return QQmlDebugServer::instance() != 0; diff --git a/src/qml/debugger/qqmldebugservice_p.h b/src/qml/debugger/qqmldebugservice_p.h index f092b6c5e6..6e99f93e03 100644 --- a/src/qml/debugger/qqmldebugservice_p.h +++ b/src/qml/debugger/qqmldebugservice_p.h @@ -85,6 +85,8 @@ public: static int idForObject(QObject *); static QObject *objectForId(int); + static QList<QObject*> objectForLocationInfo(const QString &filename, + int lineNumber, int columnNumber); static QString objectToString(QObject *obj); diff --git a/src/qml/debugger/qqmlenginedebugservice.cpp b/src/qml/debugger/qqmlenginedebugservice.cpp index 21e9d67305..f948c048e8 100644 --- a/src/qml/debugger/qqmlenginedebugservice.cpp +++ b/src/qml/debugger/qqmlenginedebugservice.cpp @@ -305,6 +305,14 @@ void QQmlEngineDebugService::prepareDeferredObjects(QObject *obj) } +void QQmlEngineDebugService::storeObjectIds(QObject *co) +{ + QQmlDebugService::idForObject(co); + QObjectList children = co->children(); + for (int ii = 0; ii < children.count(); ++ii) + storeObjectIds(children.at(ii)); +} + void QQmlEngineDebugService::buildObjectList(QDataStream &message, QQmlContext *ctxt, const QList<QPointer<QObject> > &instances) @@ -313,6 +321,8 @@ void QQmlEngineDebugService::buildObjectList(QDataStream &message, QString ctxtName = ctxt->objectName(); int ctxtId = QQmlDebugService::idForObject(ctxt); + if (ctxt->contextObject()) + storeObjectIds(ctxt->contextObject()); message << ctxtName << ctxtId; @@ -463,6 +473,27 @@ void QQmlEngineDebugService::processMessage(const QByteArray &message) buildObjectDump(rs, object, recurse, dumpProperties); } + } else if (type == "FETCH_OBJECTS_FOR_LOCATION") { + QString file; + int lineNumber; + int columnNumber; + bool recurse; + bool dumpProperties = true; + + ds >> file >> lineNumber >> columnNumber >> recurse >> dumpProperties; + + QList<QObject*> objects = QQmlDebugService::objectForLocationInfo( + file, lineNumber, columnNumber); + + rs << QByteArray("FETCH_OBJECTS_FOR_LOCATION_R") << queryId + << objects.count(); + + foreach (QObject *object, objects) { + if (recurse) + prepareDeferredObjects(object); + buildObjectDump(rs, object, recurse, dumpProperties); + } + } else if (type == "WATCH_OBJECT") { int objectId; diff --git a/src/qml/debugger/qqmlenginedebugservice_p.h b/src/qml/debugger/qqmlenginedebugservice_p.h index 3b855cb602..7ece25be1b 100644 --- a/src/qml/debugger/qqmlenginedebugservice_p.h +++ b/src/qml/debugger/qqmlenginedebugservice_p.h @@ -123,6 +123,7 @@ private: bool setBinding(int objectId, const QString &propertyName, const QVariant &expression, bool isLiteralValue, QString filename = QString(), int line = -1, int column = 0); bool resetBinding(int objectId, const QString &propertyName); bool setMethodBody(int objectId, const QString &method, const QString &body); + void storeObjectIds(QObject *co); QList<QQmlEngine *> m_engines; QQmlWatcher *m_watch; |