diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index 24114497a1e..c1a2c03ccc0 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -1312,6 +1312,11 @@ class DumperBase(): savedCurrentChildType = self.currentChildType self.currentChildType = innerType.name derefValue.name = '*' + derefValue.autoDerefCount = value.autoDerefCount + 1 + + if derefValue.type.code != TypeCode.Pointer: + self.putField('autoderefcount', '{}'.format(derefValue.autoDerefCount)) + self.putItem(derefValue) self.currentChildType = savedCurrentChildType @@ -2920,6 +2925,7 @@ class DumperBase(): self.targetValue = None # For references. self.isBaseClass = None self.nativeValue = None + self.autoDerefCount = 0 def copy(self): val = self.dumper.Value(self.dumper) diff --git a/src/plugins/debugger/watchdata.cpp b/src/plugins/debugger/watchdata.cpp index 26afbc75705..f5173b857c5 100644 --- a/src/plugins/debugger/watchdata.cpp +++ b/src/plugins/debugger/watchdata.cpp @@ -115,6 +115,7 @@ WatchItem::WatchItem() : wantsChildren(false), valueEnabled(true), valueEditable(true), + autoDerefCount(0), outdated(false) { } @@ -388,6 +389,14 @@ void WatchItem::parseHelper(const GdbMi &input, bool maySort) else if (mi.data() == "false") valueEditable = false; + mi = input["autoderefcount"]; + if (mi.isValid()) { + bool ok = false; + uint derefCount = mi.data().toUInt(&ok); + if (ok) + autoDerefCount = derefCount; + } + mi = input["numchild"]; // GDB/MI if (mi.isValid()) setHasChildren(mi.toInt() > 0); diff --git a/src/plugins/debugger/watchdata.h b/src/plugins/debugger/watchdata.h index 0169d73bea2..5cfddead45c 100644 --- a/src/plugins/debugger/watchdata.h +++ b/src/plugins/debugger/watchdata.h @@ -99,6 +99,7 @@ public: bool wantsChildren; bool valueEnabled; // Value will be enabled or not bool valueEditable; // Value will be editable + uint autoDerefCount; // number of levels of automatic dereferencing that has taken place (for pointer types) bool outdated; // \internal item is to be removed. double time = 0; // Time used on the dumper side to produce this item diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index ad117331ab9..bba04a5d497 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -869,6 +869,19 @@ static QString displayName(const WatchItem *item) else result = watchModel(item)->removeNamespaces(item->name); + // prepend '*'s to indicate where autodereferencing has taken place + if (item->autoDerefCount > 0) { + // add parentheses for everything except simple variable names (e.g. pointer arithmetics,...) + QRegularExpression variableNameRegex("^[a-zA-Z0-9_]+$"); + bool addParanthesis = !variableNameRegex.match(result).hasMatch(); + if (addParanthesis) + result = "(" + result; + for (uint i = 0; i < item->autoDerefCount; i++) + result = "*" + result; + if (addParanthesis) + result += ")"; + } + // Simplify names that refer to base classes. if (result.startsWith('[')) { result = simplifyType(result);