From c35672eaa8d8f6714b3299bb4f0ef8ad1c776e65 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Mon, 22 Nov 2010 17:06:08 +0100 Subject: [PATCH] Debugger: Remove 'friend gdbengine' from stackhandler. Preparing the introduction of tooltips for the new CDB engine. Fix some breakpoint states in CDB. --- src/plugins/debugger/cdb/cdbengine.cpp | 8 +++++--- src/plugins/debugger/cdb2/cdbengine2.cpp | 24 ++++++++++++++++++++++-- src/plugins/debugger/gdb/gdbengine.cpp | 10 ++++------ src/plugins/debugger/watchhandler.cpp | 18 +++++++++++++++++- src/plugins/debugger/watchhandler.h | 6 ++++-- 5 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 08341eb5309..ab2172fba79 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -1096,9 +1096,10 @@ void CdbEngine::assignValueInDebugger(const WatchData *w, const QString &expr, c v.toString(); } // Update view - if (WatchData *fwd = watchHandler()->findItem(w->iname)) { - fwd->setValue(newValueObtained); - watchHandler()->insertData(*fwd); + if (const WatchData *fwd = watchHandler()->findItem(w->iname)) { + WatchData modified = *fwd; + modified.setValue(newValueObtained); + watchHandler()->insertData(modified); watchHandler()->updateWatchers(); } success = true; @@ -1319,6 +1320,7 @@ bool CdbEngine::attemptBreakpointSynchronizationI(QString *errorMessage) } break; case BreakpointRemoveRequested: + handler->notifyBreakpointRemoveProceeding(id); handler->notifyBreakpointRemoveOk(id); break; case BreakpointInserted: diff --git a/src/plugins/debugger/cdb2/cdbengine2.cpp b/src/plugins/debugger/cdb2/cdbengine2.cpp index 25d4d8055a9..f89383bf366 100644 --- a/src/plugins/debugger/cdb2/cdbengine2.cpp +++ b/src/plugins/debugger/cdb2/cdbengine2.cpp @@ -41,12 +41,14 @@ #include "debuggercore.h" #include "registerhandler.h" #include "debuggeragents.h" +#include "debuggertooltip.h" #include "cdbparsehelpers.h" #include "watchutils.h" #include "gdb/gdbmi.h" #include "shared/cdbsymbolpathlisteditor.h" #include <coreplugin/icore.h> +#include <texteditor/itexteditor.h> #include <utils/synchronousprocess.h> #include <utils/winutils.h> @@ -328,9 +330,26 @@ void CdbEngine::syncOperateByInstruction(bool operateByInstruction) void CdbEngine::setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos) { + if (debug) + qDebug() << Q_FUNC_INFO; + // Need a stopped debuggee and a cpp file in a valid frame + if (state() != InferiorStopOk || !isCppEditor(editor) || stackHandler()->currentIndex() < 0) + return; + // Determine expression and function + int line; + int column; + QString function; + const QString exp = cppExpressionAt(editor, cursorPos, &line, &column, &function); + // Are we in the current stack frame + if (function.isEmpty() || exp.isEmpty() || function != stackHandler()->currentFrame().function) + return; + // No numerical or any other expressions [yet] + if (!(exp.at(0).isLetter() || exp.at(0) == QLatin1Char('_'))) + return; + const QByteArray iname = QByteArray("local.") + exp.toAscii(); + const QModelIndex index = watchHandler()->itemIndex(iname); + Q_UNUSED(index) Q_UNUSED(mousePos) - Q_UNUSED(editor) - Q_UNUSED(cursorPos) } void CdbEngine::setupEngine() @@ -1678,6 +1697,7 @@ void CdbEngine::attemptBreakpointSynchronization() } break; case BreakpointRemoveRequested: + handler->notifyBreakpointRemoveProceeding(id); handler->notifyBreakpointRemoveOk(id); break; case BreakpointInserted: diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index bdb6eb2060d..8fb8fd5f6fe 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -3268,22 +3268,20 @@ bool GdbEngine::supportsThreads() const bool GdbEngine::showToolTip() { - QByteArray iname = tooltipIName(m_toolTipExpression); + const QByteArray iname = tooltipIName(m_toolTipExpression); if (!debuggerCore()->boolSetting(UseToolTipsInMainEditor)) { watchHandler()->removeData(iname); return true; } - WatchModel *model = watchHandler()->model(TooltipsWatch); - WatchItem *item = model->findItem(iname, model->rootItem()); - if (!item) { + const QModelIndex index = watchHandler()->itemIndex(iname); + if (!index.isValid()) { watchHandler()->removeData(iname); hideDebuggerToolTip(); return false; } - QModelIndex index = model->watchIndex(item); - showDebuggerToolTip(m_toolTipPos, model, index, m_toolTipExpression); + showDebuggerToolTip(m_toolTipPos, watchHandler()->model(TooltipsWatch), index, m_toolTipExpression); return true; } diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 484b3a2a903..4c8f3eaf134 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -1590,13 +1590,29 @@ WatchModel *WatchHandler::modelForIName(const QByteArray &iname) const return 0; } -WatchData *WatchHandler::findItem(const QByteArray &iname) const +const WatchData *WatchHandler::watchData(WatchType type, const QModelIndex &index) const +{ + if (index.isValid()) + if (const WatchModel *m = model(type)) + return m->watchItem(index); + return 0; +} + +const WatchData *WatchHandler::findItem(const QByteArray &iname) const { const WatchModel *model = modelForIName(iname); QTC_ASSERT(model, return 0); return model->findItem(iname, model->m_root); } +QModelIndex WatchHandler::itemIndex(const QByteArray &iname) const +{ + if (const WatchModel *model = modelForIName(iname)) + if (WatchItem *item = model->findItem(iname, model->m_root)) + return model->watchIndex(item); + return QModelIndex(); +} + void WatchHandler::setFormat(const QByteArray &type, int format) { if (format == -1) diff --git a/src/plugins/debugger/watchhandler.h b/src/plugins/debugger/watchhandler.h index 3bffa6470dc..2b5f8bcc76b 100644 --- a/src/plugins/debugger/watchhandler.h +++ b/src/plugins/debugger/watchhandler.h @@ -87,7 +87,6 @@ private: void fetchMore(const QModelIndex &parent); friend class WatchHandler; - friend class GdbEngine; WatchItem *watchItem(const QModelIndex &) const; QModelIndex watchIndex(const WatchItem *needle) const; @@ -151,7 +150,10 @@ public: void insertData(const WatchData &data); void insertBulkData(const QList<WatchData> &data); void removeData(const QByteArray &iname); - WatchData *findItem(const QByteArray &iname) const; + + const WatchData *watchData(WatchType type, const QModelIndex &) const; + const WatchData *findItem(const QByteArray &iname) const; + QModelIndex itemIndex(const QByteArray &iname) const; static void loadSessionData(); static void saveSessionData(); -- GitLab