CdbExt: Setting actively which nodes should be expanded.

Change-Id: I1470a67aa559e4d93a01cc70701fb160e873317d
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
David Schulz
2015-05-05 12:24:33 +02:00
parent e855de4037
commit f97069ebb2
4 changed files with 40 additions and 42 deletions

View File

@@ -203,12 +203,9 @@ std::string SymbolGroup::dump(const std::string &iname,
DebugPrint() << "SymbolGroup::dump(" << iname << '/'
<< aNode->absoluteFullIName() <<" resolves to " << node->absoluteFullIName()
<< " expanded=" << node->isExpanded();
if (node->isExpanded()) { // Mark expand request by watch model
node->clearFlags(SymbolGroupNode::ExpandedByDumper);
} else {
if (node->canExpand() && !node->expand(errorMessage))
return std::string();
}
if (!node->isExpanded() && node->canExpand() && !node->expand(errorMessage))
return std::string();
node->addFlags(SymbolGroupNode::ExpandedByRequest);
// After expansion, run the complex dumpers
if (p.dumpFlags & DumpParameters::DumpComplexDumpers)
node->runComplexDumpers(ctx);
@@ -378,8 +375,12 @@ static inline SymbolGroupNode *
bool SymbolGroup::expand(const std::string &nodeName, std::string *errorMessage)
{
if (SymbolGroupNode *node = findNodeForExpansion(this, nodeName, errorMessage))
return node == m_root ? true : node->expand(errorMessage);
if (SymbolGroupNode *node = findNodeForExpansion(this, nodeName, errorMessage)) {
if (node == m_root)
return true;
node->addFlags(SymbolGroupNode::ExpandedByRequest);
return node->expand(errorMessage);
}
return false;
}
@@ -393,8 +394,12 @@ bool SymbolGroup::collapse(const std::string &nodeName, std::string *errorMessag
bool SymbolGroup::expandRunComplexDumpers(const std::string &nodeName, const SymbolGroupValueContext &ctx, std::string *errorMessage)
{
if (SymbolGroupNode *node = findNodeForExpansion(this, nodeName, errorMessage))
return node == m_root ? true : node->expandRunComplexDumpers(ctx, errorMessage);
if (SymbolGroupNode *node = findNodeForExpansion(this, nodeName, errorMessage)) {
if (node == m_root)
return true;
node->addFlags(SymbolGroupNode::ExpandedByRequest);
return node->expandRunComplexDumpers(ctx, errorMessage);
}
return false;
}

View File

@@ -62,8 +62,8 @@ static inline void debugNodeFlags(std::ostream &str, unsigned f)
str << " DumperOk";
if (f & SymbolGroupNode::SimpleDumperFailed)
str << " DumperFailed";
if (f & SymbolGroupNode::ExpandedByDumper)
str << " ExpandedByDumper";
if (f & SymbolGroupNode::ExpandedByRequest)
str << " ExpandedByRequest";
if (f & SymbolGroupNode::AdditionalSymbol)
str << " AdditionalSymbol";
if (f & SymbolGroupNode::Obscured)
@@ -594,8 +594,8 @@ void ErrorSymbolGroupNode::debug(std::ostream &os, const std::string &visitingFu
\endlist
The dumping is mostly based on SymbolGroupValue expressions.
in the debugger. Evaluating those dumpers might expand symbol nodes, which are
then marked as 'ExpandedByDumper'. This stops the dump recursion to prevent
in the debugger. Evaluating those dumpers might expand symbol nodes, but those
are not marked as 'ExpandedByRequest'. This stops the dump recursion to prevent
outputting data that were not explicitly expanded by the watch handler.
\ingroup qtcreatorcdbext */
@@ -1022,7 +1022,6 @@ void SymbolGroupNode::runComplexDumpers(const SymbolGroupValueContext &ctx)
if (ctChildren.empty())
return;
clearFlags(ExpandedByDumper);
// Mark current children as obscured. We cannot show both currently
// as this would upset the numerical sorting of the watch model
AbstractSymbolGroupNodePtrVectorConstIterator cend = children().end();
@@ -1269,11 +1268,8 @@ bool SymbolGroupNode::expand(std::string *errorMessage)
DebugPrint() << "SymbolGroupNode::expand " << name()
<<'/' << absoluteFullIName() << ' '
<< m_index << DebugNodeFlags(flags());
if (isExpanded()) {
// Clear the flag indication dumper expansion on a second, explicit request
clearFlags(ExpandedByDumper);
if (isExpanded())
return true;
}
if (!canExpand()) {
*errorMessage = msgExpandFailed(name(), absoluteFullIName(), m_index,
"No subelements to expand in node.");
@@ -1661,6 +1657,17 @@ SymbolGroupNodeVisitor::VisitResult
return VisitSkipChildren;
if (node->testFlags(SymbolGroupNode::AdditionalSymbol) && !node->testFlags(SymbolGroupNode::WatchNode))
return VisitSkipChildren;
// Recurse to children only if expanded by explicit watchmodel request
// and initialized.
bool visitChildren = true; // Report only one level for Qt Creator.
// Visit children of a SymbolGroupNode only if not expanded by its dumpers.
if (const SymbolGroupNode *realNode = node->resolveReference()->asSymbolGroupNode()) {
if (!realNode->isExpanded()
|| realNode->testFlags(SymbolGroupNode::Uninitialized)
|| !realNode->testFlags(SymbolGroupNode::ExpandedByRequest)) {
visitChildren = false;
}
}
// Comma between same level children given obscured children
if (depth == m_lastDepth)
m_os << ',';
@@ -1673,28 +1680,16 @@ SymbolGroupNodeVisitor::VisitResult
m_os << '{';
const int childCount = node->dump(m_os, fullIname, m_parameters, m_context);
m_os << ",numchild=\"" << childCount << '"';
if (childCount) {
// Recurse to children only if expanded by explicit watchmodel request
// and initialized.
// Visit children of a SymbolGroupNode only if not expanded by its dumpers.
bool skipit = false;
if (const SymbolGroupNode *realNode = node->resolveReference()->asSymbolGroupNode()) {
if (!realNode->isExpanded() || realNode->testFlags(SymbolGroupNode::Uninitialized | SymbolGroupNode::ExpandedByDumper))
skipit = true;
}
if (!skipit) {
m_os << ",children=[";
if (m_parameters.humanReadable())
m_os << '\n';
return VisitContinue;
}
if (!childCount)
visitChildren = false;
if (visitChildren) { // open children array
m_os << ",children=[";
} else { // No children, close array.
m_os << '}';
}
// No children, close array.
m_os << '}';
if (m_parameters.humanReadable())
m_os << '\n';
return VisitSkipChildren;
return visitChildren ? VisitContinue : VisitSkipChildren;
}
void DumpSymbolGroupNodeVisitor::childrenVisited(const AbstractSymbolGroupNode *n, unsigned)

View File

@@ -224,7 +224,7 @@ public:
SimpleDumperOk = 0x4, // Internal dumper ran, value set
SimpleDumperFailed = 0x8, // Internal dumper failed
SimpleDumperMask = SimpleDumperNotApplicable|SimpleDumperOk|SimpleDumperFailed,
ExpandedByDumper = 0x10,
ExpandedByRequest = 0x10,
AdditionalSymbol = 0x20, // Introduced by addSymbol, should not be visible
Obscured = 0x40, // Symbol is obscured by (for example) fake container children
ComplexDumperOk = 0x80,

View File

@@ -160,10 +160,8 @@ bool SymbolGroupValue::ensureExpanded() const
// Set a flag indicating the node was expanded by SymbolGroupValue
// and not by an explicit request from the watch model.
if (m_node->expand(&m_errorMessage)) {
m_node->addFlags(SymbolGroupNode::ExpandedByDumper);
if (m_node->expand(&m_errorMessage))
return true;
}
if (SymbolGroupValue::verbose)
DebugPrint() << "Expand failure of '" << name() << "': " << m_errorMessage;
return false;