From 24cf802a58050ff088ee1133078a234233a50a03 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Wed, 17 Jun 2009 17:34:48 +0200
Subject: [PATCH] Compile new watch model for CDB.

---
 src/plugins/debugger/cdb/cdbdebugengine.cpp   | 85 +++++--------------
 src/plugins/debugger/cdb/cdbdebugengine.h     |  1 -
 .../debugger/cdb/cdbstackframecontext.cpp     | 45 ++++------
 .../debugger/cdb/cdbstackframecontext.h       |  6 +-
 .../debugger/cdb/cdbsymbolgroupcontext.h      |  4 +-
 .../debugger/cdb/cdbsymbolgroupcontext_tpl.h  | 34 ++++----
 6 files changed, 60 insertions(+), 115 deletions(-)

diff --git a/src/plugins/debugger/cdb/cdbdebugengine.cpp b/src/plugins/debugger/cdb/cdbdebugengine.cpp
index ccaba94aff3..fdb2eb084fb 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.cpp
+++ b/src/plugins/debugger/cdb/cdbdebugengine.cpp
@@ -813,23 +813,15 @@ bool CdbDebugEnginePrivate::updateLocals(int frameIndex,
                                          WatchHandler *wh,
                                          QString *errorMessage)
 {
-    wh->reinitializeWatchers();
-
-    QList<WatchData> incompletes = wh->takeCurrentIncompletes();
+    wh->beginCycle();
     if (debugCDB)
-        qDebug() << Q_FUNC_INFO << "\n    " << frameIndex << formatWatchList(incompletes);
-
-    m_engine->filterEvaluateWatchers(&incompletes, wh);
-    if (!incompletes.empty()) {
-        const QString msg = QLatin1String("Warning: Locals left in incomplete list: ") + formatWatchList(incompletes);
-        m_engine->warning(msg);
-    }
+        qDebug() << Q_FUNC_INFO << "\n    " << frameIndex;
 
     bool success = false;
     if (CdbStackFrameContext *sgc = getStackFrameContext(frameIndex, errorMessage))
         success = sgc->populateModelInitially(wh, errorMessage);
 
-    wh->rebuildModel();
+    wh->endCycle();
     return success;
 }
 
@@ -850,69 +842,36 @@ void CdbDebugEngine::evaluateWatcher(WatchData *wd)
     wd->setChildCount(0);
 }
 
-void CdbDebugEngine::filterEvaluateWatchers(QList<WatchData> *wd, WatchHandler *wh)
-{
-    typedef QList<WatchData> WatchList;
-    if (wd->empty())
-        return;
-
-    // Filter out actual watchers. Ignore the "<Edit>" top level place holders
-    SyntaxSetter syntaxSetter(m_d->m_cif.debugControl, DEBUG_EXPR_CPLUSPLUS);
-    const QString watcherPrefix = QLatin1String("watch.");
-    const QChar lessThan = QLatin1Char('<');
-    const QChar greaterThan = QLatin1Char('>');
-    bool placeHolderSeen = false;
-    for (WatchList::iterator it = wd->begin(); it != wd->end(); ) {
-        if (it->iname.startsWith(watcherPrefix)) {
-            const bool isPlaceHolder = it->exp.startsWith(lessThan) && it->exp.endsWith(greaterThan);
-            if (isPlaceHolder) {
-                if (!placeHolderSeen) { // Max one place holder
-                    it->setChildCount(0);
-                    it->setAllUnneeded();
-                    wh->insertData(*it);
-                    placeHolderSeen = true;
-                }
-            } else {
-                evaluateWatcher(&(*it));
-                wh->insertData(*it);
-            }
-            it = wd->erase(it);
-        } else {
-            ++it;
-        }
-    }
-}
-
-void CdbDebugEngine::updateWatchModel()
+void CdbDebugEngine::updateWatchData(const WatchData &incomplete)
 {
     // Stack trace exists and evaluation funcs can only be called
     // when running
     if (m_d->isDebuggeeRunning()) {
         qWarning("updateWatchModel() called while debuggee is running.");
+        return;    
+    }
+
+    WatchHandler *watchHandler = m_d->m_debuggerManagerAccess->watchHandler();
+    if (incomplete.iname.startsWith(QLatin1String("watch."))) {
+        WatchData watchData = incomplete;
+        evaluateWatcher(&watchData);
+        watchHandler->insertData(watchData);
         return;
     }
 
     const int frameIndex = m_d->m_debuggerManagerAccess->stackHandler()->currentIndex();
 
-    WatchHandler *watchHandler = m_d->m_debuggerManagerAccess->watchHandler();
-    WatchList incomplete = watchHandler->takeCurrentIncompletes();
-    if (incomplete.empty())
-        return;
     if (debugCDB)
-        qDebug() << Q_FUNC_INFO << "\n    fi=" << frameIndex << formatWatchList(incomplete);
+        qDebug() << Q_FUNC_INFO << "\n    fi=" << frameIndex << incomplete.iname;
 
     bool success = false;
     QString errorMessage;
     do {
-        // Filter out actual watchers
-        filterEvaluateWatchers(&incomplete, watchHandler);
-        // Do locals. We might get called while running when someone enters watchers
-        if (!incomplete.empty()) {
-            CdbStackFrameContext *sg = m_d->m_currentStackTrace->frameContextAt(frameIndex, &errorMessage);
-            if (!sg || !sg->completeModel(incomplete, watchHandler, &errorMessage))
-                break;
-        }
-        watchHandler->rebuildModel();
+        CdbStackFrameContext *sg = m_d->m_currentStackTrace->frameContextAt(frameIndex, &errorMessage);
+        if (!sg)
+            break;
+        if (!sg->completeData(incomplete, watchHandler, &errorMessage))
+            break;
         success = true;
     } while (false);
     if (!success)
@@ -1132,10 +1091,10 @@ void CdbDebugEngine::assignValueInDebugger(const QString &expr, const QString &v
             break;
         // Update view
         WatchHandler *watchHandler = m_d->m_debuggerManagerAccess->watchHandler();
-        if (WatchData *fwd = watchHandler->findData(expr)) {
+        if (WatchData *fwd = watchHandler->findItem(expr)) {
             fwd->setValue(newValue);
             watchHandler->insertData(*fwd);
-            watchHandler->rebuildModel();
+            watchHandler->updateWatchers();
         }
         success = true;
     } while (false);
@@ -1233,8 +1192,8 @@ void CdbDebugEngine::activateFrame(int frameIndex)
         const StackFrame &frame = stackHandler->currentFrame();
         if (!frame.isUsable()) {
             // Clean out model
-            watchHandler->reinitializeWatchers();
-            watchHandler->rebuildModel();
+            watchHandler->beginCycle();
+            watchHandler->endCycle();
             errorMessage = QString::fromLatin1("%1: file %2 unusable.").
                            arg(QLatin1String(Q_FUNC_INFO), frame.file);
             break;
diff --git a/src/plugins/debugger/cdb/cdbdebugengine.h b/src/plugins/debugger/cdb/cdbdebugengine.h
index 09f8850d4f8..00beb734c7c 100644
--- a/src/plugins/debugger/cdb/cdbdebugengine.h
+++ b/src/plugins/debugger/cdb/cdbdebugengine.h
@@ -119,7 +119,6 @@ private:
     bool executeDebuggerCommand(const QString &command, QString *errorMessage);
     bool evaluateExpression(const QString &expression, QString *value, QString *type, QString *errorMessage);
     void evaluateWatcher(WatchData *wd);
-    void filterEvaluateWatchers(QList<WatchData> *wd, WatchHandler *wh);
     QString editorToolTip(const QString &exp, const QString &function);
 
     CdbDebugEnginePrivate *m_d;
diff --git a/src/plugins/debugger/cdb/cdbstackframecontext.cpp b/src/plugins/debugger/cdb/cdbstackframecontext.cpp
index cc18301b35f..a3584310ffc 100644
--- a/src/plugins/debugger/cdb/cdbstackframecontext.cpp
+++ b/src/plugins/debugger/cdb/cdbstackframecontext.cpp
@@ -145,40 +145,31 @@ bool CdbStackFrameContext::populateModelInitially(WatchHandler *wh, QString *err
     return rc;
 }
 
-bool CdbStackFrameContext::completeModel(const QList<WatchData> &incompleteLocals,
-                                         WatchHandler *wh,
-                                         QString *errorMessage)
+bool CdbStackFrameContext::completeData(const WatchData &incompleteLocal,
+                                        WatchHandler *wh,
+                                        QString *errorMessage)
 {
-    if (debug) {
-        QDebug nsp = qDebug().nospace();
-        nsp << ">completeModel ";
-        foreach (const WatchData &wd, incompleteLocals)
-            nsp << wd.iname << ' ';
-        nsp << '\n';
-    }
+    if (debug)
+        qDebug() << ">completeData " << incompleteLocal.iname;
 
     if (!m_useDumpers) {
-        return CdbSymbolGroupContext::completeModel(m_symbolContext, incompleteLocals,
-                                                    WatchHandlerModelInserter(wh),
-                                                    errorMessage);
+        return CdbSymbolGroupContext::completeData(m_symbolContext, incompleteLocal,
+                                                   WatchHandlerModelInserter(wh),
+                                                   errorMessage);
     }
 
-    // Expand dumper items
-    int handledDumpers = 0;
-    foreach (const WatchData &cwd, incompleteLocals) {
-        if (cwd.source == OwnerDumper) { // You already know that.
-            WatchData wd = cwd;
-            wd.setAllUnneeded();
-            wh->insertData(wd);
-            handledDumpers++;
-        }
-    }
-    if (handledDumpers == incompleteLocals.size())
+    // Expand dumper items (not implemented)
+    if (incompleteLocal.source == OwnerDumper) {
+        WatchData wd = incompleteLocal;
+        wd.setAllUnneeded();
+        wh->insertData(wd);
         return true;
+    }
+
     // Expand symbol group items
-    return CdbSymbolGroupContext::completeModel(m_symbolContext, incompleteLocals,
-                                                WatchHandlerSorterInserter(wh, m_dumper),
-                                                errorMessage);
+    return CdbSymbolGroupContext::completeData(m_symbolContext, incompleteLocal,
+                                               WatchHandlerSorterInserter(wh, m_dumper),
+                                               errorMessage);
 }
 
 CdbStackFrameContext::~CdbStackFrameContext()
diff --git a/src/plugins/debugger/cdb/cdbstackframecontext.h b/src/plugins/debugger/cdb/cdbstackframecontext.h
index 59fb0027718..f9ba79c9f83 100644
--- a/src/plugins/debugger/cdb/cdbstackframecontext.h
+++ b/src/plugins/debugger/cdb/cdbstackframecontext.h
@@ -59,9 +59,9 @@ public:
 
     bool populateModelInitially(WatchHandler *wh, QString *errorMessage);
 
-    bool completeModel(const QList<WatchData> &incompleteLocals,
-                       WatchHandler *wh,
-                       QString *errorMessage);
+    bool completeData(const WatchData &incompleteLocal,
+                      WatchHandler *wh,
+                      QString *errorMessage);
 
 private:
     const bool m_useDumpers;
diff --git a/src/plugins/debugger/cdb/cdbsymbolgroupcontext.h b/src/plugins/debugger/cdb/cdbsymbolgroupcontext.h
index 242054b33fe..feb74b6f2d2 100644
--- a/src/plugins/debugger/cdb/cdbsymbolgroupcontext.h
+++ b/src/plugins/debugger/cdb/cdbsymbolgroupcontext.h
@@ -80,8 +80,8 @@ public:
                                        OutputIterator it, QString *errorMessage);
 
     template <class OutputIterator>
-    static bool completeModel(CdbSymbolGroupContext *sg,
-                              const QList<WatchData> &incompleteLocals,
+    static bool completeData (CdbSymbolGroupContext *sg,
+                              WatchData incompleteLocal,
                               OutputIterator it,
                               QString *errorMessage);
 
diff --git a/src/plugins/debugger/cdb/cdbsymbolgroupcontext_tpl.h b/src/plugins/debugger/cdb/cdbsymbolgroupcontext_tpl.h
index 632a4238466..afa6e49c722 100644
--- a/src/plugins/debugger/cdb/cdbsymbolgroupcontext_tpl.h
+++ b/src/plugins/debugger/cdb/cdbsymbolgroupcontext_tpl.h
@@ -192,27 +192,23 @@ bool CdbSymbolGroupContext::populateModelInitially(CdbSymbolGroupContext *sg,
 }
 
 template <class OutputIterator>
-bool CdbSymbolGroupContext::completeModel(CdbSymbolGroupContext *sg,
-                                          const QList<WatchData> &incompleteLocals,
-                                          OutputIterator it,
-                                          QString *errorMessage)
+bool CdbSymbolGroupContext::completeData(CdbSymbolGroupContext *sg,
+                                         WatchData incompleteLocal,
+                                         OutputIterator it,
+                                         QString *errorMessage)
 {
     if (debugSgRecursion)
-        qDebug().nospace() << "###>" << Q_FUNC_INFO << ' ' << incompleteLocals.size() << '\n';
-    // The view reinserts any node being expanded with flag 'ChildrenNeeded'.
-    // Recurse down one level in context unless this is already the case.
-    foreach(WatchData wd, incompleteLocals) {
-        const bool contextExpanded = sg->isExpanded(wd.iname);
-        if (debugSgRecursion)
-            qDebug() << "  " << wd.iname << "CE=" << contextExpanded;
-        if (contextExpanded) { // You know that already.
-            wd.setChildrenUnneeded();            
-            *it = wd;
-            ++it;
-        } else {
-            if (!insertSymbolRecursion(wd, sg, it, 1, 0, errorMessage))
-                return false;
-        }
+        qDebug().nospace() << "###>" << Q_FUNC_INFO << ' ' << incompleteLocal.iname << '\n';
+    const bool contextExpanded = sg->isExpanded(incompleteLocal.iname);
+    if (debugSgRecursion)
+        qDebug() << "  " << incompleteLocal.iname << "CE=" << contextExpanded;
+    if (contextExpanded) { // TODO: Legacy, should not be required any more
+        incompleteLocal.setChildrenUnneeded();
+        *it = incompleteLocal;
+        ++it;
+    } else {
+        if (!insertSymbolRecursion(incompleteLocal, sg, it, 1, 0, errorMessage))
+            return false;
     }
     return true;
 }
-- 
GitLab