From 4bf3d32f61ef545abed89641893e8e9248b878f1 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 14 Jul 2009 11:21:52 +0200
Subject: [PATCH] debugger: assume that not-known-to-be-simple types have
 children

This might lead to false positives in corner cases like empty structures
but speed up the display of arrays and lists of user-defined types a lot.
---
 src/plugins/debugger/watchhandler.cpp | 13 +++++++++++--
 src/plugins/debugger/watchutils.cpp   | 11 +++++++++++
 src/plugins/debugger/watchutils.h     |  4 ++++
 3 files changed, 26 insertions(+), 2 deletions(-)

diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index b6dad71d4ac..953b91b67ca 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -180,8 +180,17 @@ void WatchData::setType(const QString &str)
             changed = false;
     }
     setTypeUnneeded();
-    if (isIntOrFloatType(type))
-        setHasChildren(false);
+    switch (guessChildren(type)) {
+        case HasChildren:
+            setHasChildren(true);
+            break;
+        case HasNoChildren:
+            setHasChildren(false);
+            break;
+        case HasPossiblyChildren:
+            setHasChildren(true); // FIXME: bold assumption
+            break;
+    }
 }
 
 void WatchData::setAddress(const QString &str)
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index 4ca9b22b980..cd6c7e21b32 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -337,6 +337,17 @@ bool isIntOrFloatType(const QString &type)
     return isIntType(type) || types.contains(type);
 }
 
+GuessChildrenResult guessChildren(const QString &type)
+{
+    if (isIntOrFloatType(type))
+        return HasNoChildren;
+    if (isPointerType(type))
+        return HasChildren;
+    if (type.endsWith(QLatin1String("QString")))
+        return HasNoChildren;
+    return HasPossiblyChildren;
+}
+
 QString sizeofTypeExpression(const QString &type)
 {
     if (type.endsWith(QLatin1Char('*')))
diff --git a/src/plugins/debugger/watchutils.h b/src/plugins/debugger/watchutils.h
index 9d02ad75f89..4d828bbc156 100644
--- a/src/plugins/debugger/watchutils.h
+++ b/src/plugins/debugger/watchutils.h
@@ -73,6 +73,10 @@ bool extractTemplate(const QString &type, QString *tmplate, QString *inner);
 QString extractTypeFromPTypeOutput(const QString &str);
 bool isIntOrFloatType(const QString &type);
 bool isIntType(const QString &type);
+
+enum GuessChildrenResult { HasChildren, HasNoChildren, HasPossiblyChildren };
+GuessChildrenResult guessChildren(const QString &type);
+
 QString sizeofTypeExpression(const QString &type);
 QString quoteUnprintableLatin1(const QByteArray &ba);
 
-- 
GitLab