diff --git a/src/plugins/debugger/dap/dapengine.cpp b/src/plugins/debugger/dap/dapengine.cpp index 6b2bb5d6e7d..6be4aec835f 100644 --- a/src/plugins/debugger/dap/dapengine.cpp +++ b/src/plugins/debugger/dap/dapengine.cpp @@ -64,17 +64,6 @@ static Q_LOGGING_CATEGORY(dapEngineLog, "qtc.dbg.dapengine", QtWarningMsg) namespace Debugger::Internal { -DapEngine::DapEngine() -{ - m_rootWatchItem = new WatchItem(); - m_currentWatchItem = m_rootWatchItem; -} - -DapEngine::~DapEngine() -{ - delete m_rootWatchItem; -} - void DapEngine::executeDebuggerCommand(const QString &/*command*/) { QTC_ASSERT(state() == InferiorStopOk, qCDebug(dapEngineLog) << state()); @@ -558,8 +547,6 @@ void DapEngine::handleScopesResponse(const QJsonObject &response) const int variablesReference = scope.toObject().value("variablesReference").toInt(); qCDebug(dapEngineLog) << "scoped success" << name << variablesReference; if (name == "Locals") { // Fix for several scopes - m_rootWatchItem = new WatchItem(); - m_currentWatchItem = m_rootWatchItem; watchHandler()->removeAllData(); watchHandler()->notifyUpdateStarted(); m_dapClient->variables(variablesReference); @@ -701,6 +688,7 @@ void DapEngine::handleBreakpointEvent(const QJsonObject &event) void DapEngine::refreshLocals(const QJsonArray &variables) { + bool isFirstLayer = m_watchItems.isEmpty(); for (auto variable : variables) { WatchItem *item = new WatchItem; const QString name = variable.toObject().value("name").toString(); @@ -712,7 +700,10 @@ void DapEngine::refreshLocals(const QJsonArray &variables) item->type = variable.toObject().value("type").toString(); qCDebug(dapEngineLog) << "variable" << name << item->hexAddress(); - m_currentWatchItem->appendChild(item); + if (isFirstLayer) + m_watchItems.append(item); + else + m_currentWatchItem->appendChild(item); const int variablesReference = variable.toObject().value("variablesReference").toInt(); if (variablesReference > 0) @@ -720,8 +711,10 @@ void DapEngine::refreshLocals(const QJsonArray &variables) } if (m_variablesReferenceQueue.empty()) { - for (auto item = m_rootWatchItem->begin(); item != m_rootWatchItem->end(); ++item) - watchHandler()->insertItem(*item); + for (auto item : m_watchItems) + watchHandler()->insertItem(item); + m_watchItems.clear(); + watchHandler()->notifyUpdateFinished(); return; } diff --git a/src/plugins/debugger/dap/dapengine.h b/src/plugins/debugger/dap/dapengine.h index adcfa807fe3..b8ad63aab0a 100644 --- a/src/plugins/debugger/dap/dapengine.h +++ b/src/plugins/debugger/dap/dapengine.h @@ -26,8 +26,8 @@ enum class DapEventType; class DapEngine : public DebuggerEngine { public: - DapEngine(); - ~DapEngine() override; + DapEngine() = default; + ~DapEngine() override = default; protected: void executeStepIn(bool) override; @@ -115,7 +115,7 @@ protected: std::queue> m_variablesReferenceQueue; WatchItem *m_currentWatchItem = nullptr; - WatchItem *m_rootWatchItem = nullptr; + QList m_watchItems; }; } // Debugger::Internal