aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/debugger
diff options
context:
space:
mode:
authorAurindam Jana <aurindam.jana@nokia.com>2012-05-10 09:21:26 +0200
committerQt by Nokia <qt-info@nokia.com>2012-05-12 11:00:34 +0200
commit6f9b3893c8c7bc0b6663acb34c17c120852ef7b7 (patch)
treef992993047106aead5d5228fb490120df7da490d /src/qml/debugger
parent36d6307dd19d34354fb1ada7b6e5883977d43db8 (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.cpp35
-rw-r--r--src/qml/debugger/qqmldebugservice_p.h2
-rw-r--r--src/qml/debugger/qqmlenginedebugservice.cpp31
-rw-r--r--src/qml/debugger/qqmlenginedebugservice_p.h1
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;