From 75ade29466b0ac6d6ac345cd21e81266f4a1117b Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 28 Aug 2009 14:34:08 +0200
Subject: [PATCH] debugger: allow dumpers to return children in more than one
 nesting level

---
 share/qtcreator/gdbmacros/gdbmacros.cpp | 28 +++++++++--
 src/plugins/debugger/gdb/gdbengine.cpp  | 67 ++++++++++++-------------
 src/plugins/debugger/gdb/gdbengine.h    |  1 +
 src/plugins/debugger/watchhandler.cpp   |  4 +-
 4 files changed, 61 insertions(+), 39 deletions(-)

diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp
index c464b9435a9..e0a59d43c21 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.cpp
+++ b/share/qtcreator/gdbmacros/gdbmacros.cpp
@@ -1309,6 +1309,7 @@ static void qDumpQFileInfo(QDumper &d)
     if (d.dumpChildren) {
         d.beginChildren();
         d.putHash("absolutePath", info.absolutePath());
+#if 0
         d.putHash("absoluteFilePath", info.absoluteFilePath());
         d.putHash("canonicalPath", info.canonicalPath());
         d.putHash("canonicalFilePath", info.canonicalFilePath());
@@ -1324,15 +1325,35 @@ static void qDumpQFileInfo(QDumper &d)
         d.putHash("group", info.group());
         d.putHash("owner", info.owner());
         d.putHash("path", info.path());
+#endif
 
         d.putHash("groupid", (long)info.groupId());
         d.putHash("ownerid", (long)info.ownerId());
         //QFile::Permissions permissions () const
-        d.putHash("permissions", (long)info.permissions());
-
+        long perms = info.permissions();
+        d.beginHash();
+            d.putItem("name", "permissions");
+            d.putItem("value", " ");
+            d.putItem("type", NS"QFile::Permissions");
+            d.putItem("numchild", 10);
+            d.beginChildren();
+                d.putHash("ReadOwner",  bool(perms & QFile::ReadOwner));
+                d.putHash("WriteOwner", bool(perms & QFile::WriteOwner));
+                d.putHash("ExeOwner",   bool(perms & QFile::ExeOwner));
+                d.putHash("ReadUser",   bool(perms & QFile::ReadUser));
+                d.putHash("WriteUser",  bool(perms & QFile::WriteUser));
+                d.putHash("ExeUser",    bool(perms & QFile::ExeUser));
+                d.putHash("ReadGroup",  bool(perms & QFile::ReadGroup));
+                d.putHash("WriteGroup", bool(perms & QFile::WriteGroup));
+                d.putHash("ExeGroup",   bool(perms & QFile::ExeGroup));
+                d.putHash("ReadOther",  bool(perms & QFile::ReadOther));
+                d.putHash("WriteOther", bool(perms & QFile::WriteOther));
+                d.putHash("ExeOther",   bool(perms & QFile::ExeOther));
+            d.endChildren();
+        d.endHash();
         //QDir absoluteDir () const
         //QDir dir () const
-
+#if 0
         d.putHash("caching", info.caching());
         d.putHash("exists", info.exists());
         d.putHash("isAbsolute", info.isAbsolute());
@@ -1378,6 +1399,7 @@ static void qDumpQFileInfo(QDumper &d)
         d.putItem("type", NS"QDateTime");
         d.putItem("numchild", "1");
         d.endHash();
+#endif
 
         d.endChildren();
     }
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 0d6ed3376ce..6fbba11e083 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3401,41 +3401,50 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record,
 
     setWatchDataType(data, record.data.findChild("type"));
     setWatchDataDisplayedType(data, record.data.findChild("displaytype"));
-    setWatchDataValue(data, contents.findChild("value"),
-        contents.findChild("valueencoded").data().toInt());
-    setWatchDataAddress(data, contents.findChild("addr"));
-    setWatchDataSAddress(data, contents.findChild("saddr"));
-    setWatchDataChildCount(data, contents.findChild("numchild"));
-    setWatchDataValueToolTip(data, contents.findChild("valuetooltip"),
-        contents.findChild("valuetooltipencoded").data().toInt());
-    setWatchDataValueDisabled(data, contents.findChild("valuedisabled"));
-    setWatchDataEditValue(data, contents.findChild("editvalue"));
+    handleChildren(data, contents);
+}
+
+void GdbEngine::handleChildren(const WatchData &data0, const GdbMi &item)
+{
+    WatchData data = data0;
+    if (!qq->watchHandler()->isExpandedIName(data.iname))
+        data.setChildrenUnneeded();
+
+    GdbMi children = item.findChild("children");
+    if (children.isValid() || !qq->watchHandler()->isExpandedIName(data.iname))
+        data.setChildrenUnneeded();
+
     if (qq->watchHandler()->isDisplayedIName(data.iname)) {
-        GdbMi editvalue = contents.findChild("editvalue");
+        GdbMi editvalue = item.findChild("editvalue");
         if (editvalue.isValid()) {
             setWatchDataEditValue(data, editvalue);
             qq->watchHandler()->showEditValue(data);
         }
     }
-    if (!qq->watchHandler()->isExpandedIName(data.iname))
-        data.setChildrenUnneeded();
-    GdbMi children = contents.findChild("children");
-    if (children.isValid() || !qq->watchHandler()->isExpandedIName(data.iname))
-        data.setChildrenUnneeded();
-    data.setValueUnneeded();
+    setWatchDataType(data, item.findChild("type"));
+    setWatchDataEditValue(data, item.findChild("editvalue"));
+    setWatchDataExpression(data, item.findChild("exp"));
+    setWatchDataChildCount(data, item.findChild("numchild"));
+    setWatchDataValue(data, item.findChild("value"),
+        item.findChild("valueencoded").data().toInt());
+    setWatchDataAddress(data, item.findChild("addr"));
+    setWatchDataSAddress(data, item.findChild("saddr"));
+    setWatchDataValueToolTip(data, item.findChild("valuetooltip"),
+        item.findChild("valuetooltipencoded").data().toInt());
+    setWatchDataValueDisabled(data, item.findChild("valuedisabled"));
 
     // try not to repeat data too often
     WatchData childtemplate;
-    setWatchDataType(childtemplate, contents.findChild("childtype"));
-    setWatchDataChildCount(childtemplate, contents.findChild("childnumchild"));
+    setWatchDataType(childtemplate, item.findChild("childtype"));
+    setWatchDataChildCount(childtemplate, item.findChild("childnumchild"));
     //qDebug() << "CHILD TEMPLATE:" << childtemplate.toString();
 
     qq->watchHandler()->insertData(data); 
     int i = 0;
     QList<WatchData> list;
-    foreach (GdbMi item, children.children()) {
+    foreach (GdbMi child, children.children()) {
         WatchData data1 = childtemplate;
-        GdbMi name = item.findChild("name");
+        GdbMi name = child.findChild("name");
         if (name.isValid())
             data1.name = _(name.data());
         else
@@ -3443,9 +3452,9 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record,
         data1.iname = data.iname + _c('.') + data1.name;
         if (!data1.name.isEmpty() && data1.name.at(0).isDigit())
             data1.name = _c('[') + data1.name + _c(']');
-        QByteArray key = item.findChild("key").data();
+        QByteArray key = child.findChild("key").data();
         if (!key.isEmpty()) {
-            int encoding = item.findChild("keyencoded").data().toInt();
+            int encoding = child.findChild("keyencoded").data().toInt();
             QString skey = decodeData(key, encoding);
             if (skey.size() > 13) {
                 skey = skey.left(12);
@@ -3454,19 +3463,7 @@ void GdbEngine::handleDebuggingHelperValue2(const GdbResultRecord &record,
             //data1.name += " (" + skey + ")";
             data1.name = skey;
         }
-        setWatchDataType(data1, item.findChild("type"));
-        setWatchDataExpression(data1, item.findChild("exp"));
-        setWatchDataChildCount(data1, item.findChild("numchild"));
-        setWatchDataValue(data1, item.findChild("value"),
-            item.findChild("valueencoded").data().toInt());
-        setWatchDataAddress(data1, item.findChild("addr"));
-        setWatchDataSAddress(data1, item.findChild("saddr"));
-        setWatchDataValueToolTip(data1, item.findChild("valuetooltip"),
-            contents.findChild("valuetooltipencoded").data().toInt());
-        setWatchDataValueDisabled(data1, item.findChild("valuedisabled"));
-        if (!qq->watchHandler()->isExpandedIName(data1.iname))
-            data1.setChildrenUnneeded();
-        //qDebug() << "HANDLE CUSTOM SUBCONTENTS:" << data1.toString();
+        handleChildren(data1, child);
         list.append(data1);
         ++i;
     }
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 820515df6b2..b041c63eb2b 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -241,6 +241,7 @@ private:
     void debugMessage(const QString &msg);
     bool showToolTip();
 
+    void handleChildren(const WatchData &parent, const GdbMi &child);
     const bool m_dumperInjectionLoad;
 
     OutputCollector m_outputCollector;
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 7c5b221a630..3ab57db6fd6 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -843,7 +843,9 @@ void WatchModel::insertData(const WatchData &data)
 
 void WatchModel::insertBulkData(const QList<WatchData> &list)
 {
-    // qDebug() << "WMI:" << list.toString();
+    //qDebug() << "WMI:" << list.toString();
+    //foreach (const WatchItem &data, list)
+    //    qDebug() << data.toString();
     QTC_ASSERT(!list.isEmpty(), return);
     QString parentIName = parentName(list.at(0).iname);
     WatchItem *parent = findItem(parentIName, m_root);
-- 
GitLab