From c6ebc1c697b43c31500aa6d97a183adc150479e6 Mon Sep 17 00:00:00 2001
From: hjk <qthjk@ovi.com>
Date: Tue, 15 Nov 2011 23:27:59 +0100
Subject: [PATCH] debugger: add display variants for assosiative containers

Change-Id: I8ce5449bf2717e7989e401482f9dbf39fafdd7d0
Reviewed-by: hjk <qthjk@ovi.com>
---
 share/qtcreator/dumper/dumper.py  | 17 ++++++-
 share/qtcreator/dumper/qttypes.py | 74 ++++++++++++++++++-------------
 2 files changed, 59 insertions(+), 32 deletions(-)

diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py
index 9942ad8c4ed..61770db911a 100644
--- a/share/qtcreator/dumper/dumper.py
+++ b/share/qtcreator/dumper/dumper.py
@@ -1223,6 +1223,16 @@ class Dumper:
     def putName(self, name):
         self.put('name="%s",' % name)
 
+    def putMapName(self, value):
+        if str(value.type) == qqNs + "QString":
+            self.put('key="%s",' % encodeString(value))
+            self.put('keyencoded="%s",' % Hex4EncodedLittleEndian)
+        elif str(value.type) == qqNs + "QByteArray":
+            self.put('key="%s",' % encodeByteArray(value))
+            self.put('keyencoded="%s",' % Hex2EncodedLatin1)
+        else:
+            self.put('name="%s",' % value)
+
     def isExpanded(self):
         #warn("IS EXPANDED: %s in %s: %s" % (self.currentIName,
         #    self.expandedINames, self.currentIName in self.expandedINames))
@@ -1268,7 +1278,12 @@ class Dumper:
     def currentItemFormat(self):
         format = self.formats.get(self.currentIName)
         if format is None:
-            format = self.typeformats.get(stripClassTag(str(self.currentType)))
+            type = stripClassTag(str(self.currentType))
+            pos = type.find('<')
+            if pos == -1:
+                format = self.typeformats.get(type)
+            else:
+                format = self.typeformats.get(type[0:pos])
         return format
 
     def putSubItem(self, component, value):
diff --git a/share/qtcreator/dumper/qttypes.py b/share/qtcreator/dumper/qttypes.py
index d306d32a45a..a04b407c65a 100644
--- a/share/qtcreator/dumper/qttypes.py
+++ b/share/qtcreator/dumper/qttypes.py
@@ -7,6 +7,16 @@
 
 from __future__ import with_statement
 
+
+def mapForms():
+    return "Normal,Compact"
+
+def mapCompact(format, keyType, valueType):
+    if format == 2:
+        return True # Compact.
+    return isSimpleType(keyType) and isSimpleType(valueType)
+
+
 def qdump__QAtomicInt(d, value):
     d.putValue(value["_q_value"])
     d.putNumChild(0)
@@ -337,6 +347,9 @@ def qdump__QFlags(d, value):
     d.putNumChild(0)
 
 
+def qform__QHash():
+    return mapForms()
+
 def qdump__QHash(d, value):
 
     def hashDataFirstNode(value):
@@ -382,22 +395,19 @@ def qdump__QHash(d, value):
     d.putItemCount(size)
     d.putNumChild(size)
     if d.isExpanded():
-        isSimpleKey = isSimpleType(keyType)
-        isSimpleValue = isSimpleType(valueType)
+        isCompact = mapCompact(d.currentItemFormat(), keyType, valueType)
         node = hashDataFirstNode(value)
         innerType = e_ptr.dereference().type
         childType = innerType
-        if isSimpleKey and isSimpleValue:
+        if isCompact:
             childType = valueType
         with Children(d, size, maxNumChild=1000, childType=childType):
             for i in d.childRange():
                 it = node.dereference().cast(innerType)
                 with SubItem(d, i):
-                    key = it["key"]
-                    val = it["value"]
-                    if isSimpleKey and isSimpleValue:
-                        d.putName(key)
-                        d.putItem(val)
+                    if isCompact:
+                        d.putMapName(it["key"])
+                        d.putItem(it["value"])
                         d.putType(valueType)
                     else:
                         d.putItem(it)
@@ -410,11 +420,11 @@ def qdump__QHashNode(d, value):
     key = value["key"]
     val = value["value"]
 
-    if isSimpleType(keyType) and isSimpleType(valueType):
-        d.putName(key)
-        d.putValue(val)
-    else:
-        d.putValue(" ")
+    #if isSimpleType(keyType) and isSimpleType(valueType):
+    #    d.putName(key)
+    #    d.putValue(val)
+    #else:
+    d.putValue(" ")
 
     d.putNumChild(2)
     if d.isExpanded():
@@ -616,9 +626,7 @@ def qdumpHelper__QMap(d, value, forceLong):
 
         keyType = templateArgument(value.type, 0)
         valueType = templateArgument(value.type, 1)
-
-        isSimpleKey = isSimpleType(keyType)
-        isSimpleValue = isSimpleType(valueType)
+        isCompact = mapCompact(d.currentItemFormat(), keyType, valueType)
 
         it = e_ptr["forward"].dereference()
 
@@ -629,7 +637,7 @@ def qdumpHelper__QMap(d, value, forceLong):
         payloadSize = nodeType.sizeof - 2 * lookupType("void").pointer().sizeof
         charPtr = lookupType("char").pointer()
 
-        if isSimpleKey and isSimpleValue:
+        if isCompact:
             innerType = valueType
         else:
             innerType = nodeType
@@ -640,25 +648,27 @@ def qdumpHelper__QMap(d, value, forceLong):
                 base = it.cast(charPtr) - payloadSize
                 node = base.cast(nodeType.pointer()).dereference()
                 with SubItem(d, i):
-                    key = node["key"]
-                    val = node["value"]
-                    #if isSimpleType(value.type):
-                    # or isStringType(d, value.type):
-                    if isSimpleKey and isSimpleValue:
+                    if isCompact:
                         #d.putType(valueType)
                         if forceLong:
-                            d.putName("[%s] %s" % (i, key))
+                            d.putName("[%s] %s" % (i, node["key"]))
                         else:
-                            d.putName(key)
-                        d.putItem(val)
+                            d.putMapName(node["key"])
+                        d.putItem(node["value"])
                     else:
                         d.putItem(node)
                 it = it.dereference()["forward"].dereference()
 
 
+def qform__QMap():
+    return mapForms()
+
 def qdump__QMap(d, value):
     qdumpHelper__QMap(d, value, False)
 
+def qform__QMultiMap():
+    return mapForms()
+
 def qdump__QMultiMap(d, value):
     qdumpHelper__QMap(d, value, True)
 
@@ -1745,6 +1755,9 @@ def qdump__std__list(d, value):
                 p = p["_M_next"]
 
 
+def qform__std__map():
+    return mapForms()
+
 def qdump__std__map(d, value):
     impl = value["_M_t"]["_M_impl"]
     size = impl["_M_node_count"]
@@ -1760,10 +1773,9 @@ def qdump__std__map(d, value):
         #   pairType = templateArgument(templateArgument(value.type, 3), 0)
         # So use this as workaround:
         pairType = templateArgument(impl.type, 1)
-        isSimpleKey = isSimpleType(keyType)
-        isSimpleValue = isSimpleType(valueType)
+        isCompact = mapCompact(d.currentItemFormat(), keyType, valueType)
         innerType = pairType
-        if isSimpleKey and isSimpleValue:
+        if isCompact:
             innerType = valueType
         pairPointer = pairType.pointer()
         node = impl["_M_header"]["_M_left"]
@@ -1771,15 +1783,15 @@ def qdump__std__map(d, value):
         if size == 0:
             childType = pairType
         childNumChild = 2
-        if isSimpleKey and isSimpleValue:
+        if isCompact:
             childNumChild = None
         with Children(d, size, maxNumChild=1000,
                 childType=childType, childNumChild=childNumChild):
             for i in d.childRange():
                 with SubItem(d, i):
                     pair = (node + 1).cast(pairPointer).dereference()
-                    if isSimpleKey and isSimpleValue:
-                        d.putName(pair["first"])
+                    if isCompact:
+                        d.putMapName(pair["first"])
                         d.putItem(pair["second"])
                     else:
                         d.putValue(" ")
-- 
GitLab