diff --git a/src/plugins/debugger/dap/cmakedapengine.cpp b/src/plugins/debugger/dap/cmakedapengine.cpp index d4e766521cf..1b3614a5f12 100644 --- a/src/plugins/debugger/dap/cmakedapengine.cpp +++ b/src/plugins/debugger/dap/cmakedapengine.cpp @@ -136,4 +136,30 @@ bool CMakeDapEngine::hasCapability(unsigned cap) const /*| RunToLineCapability*/); // disable while the #25176 bug is not fixed } +void CMakeDapEngine::insertBreakpoint(const Breakpoint &bp) +{ + DapEngine::insertBreakpoint(bp); + notifyBreakpointInsertOk(bp); // Needed for CMake support issue:25176 +} + +void CMakeDapEngine::removeBreakpoint(const Breakpoint &bp) +{ + DapEngine::removeBreakpoint(bp); + notifyBreakpointRemoveOk(bp); // Needed for CMake support issue:25176 +} + +void CMakeDapEngine::updateBreakpoint(const Breakpoint &bp) +{ + DapEngine::updateBreakpoint(bp); + + /* Needed for CMake support issue:25176 */ + BreakpointParameters parameters = bp->requestedParameters(); + if (parameters.enabled != bp->isEnabled()) { + parameters.pending = false; + bp->setParameters(parameters); + } + notifyBreakpointChangeOk(bp); + /* Needed for CMake support issue:25176 */ +} + } // namespace Debugger::Internal diff --git a/src/plugins/debugger/dap/cmakedapengine.h b/src/plugins/debugger/dap/cmakedapengine.h index 00b0ac7044d..4d03249e348 100644 --- a/src/plugins/debugger/dap/cmakedapengine.h +++ b/src/plugins/debugger/dap/cmakedapengine.h @@ -16,6 +16,12 @@ private: void handleDapStarted() override; void setupEngine() override; + /* Needed for CMake support issue:25176 */ + void insertBreakpoint(const Breakpoint &bp) override; + void updateBreakpoint(const Breakpoint &bp) override; + void removeBreakpoint(const Breakpoint &bp) override; + /* Needed for CMake support issue:25176 */ + bool hasCapability(unsigned cap) const override; }; diff --git a/src/plugins/debugger/dap/dapengine.cpp b/src/plugins/debugger/dap/dapengine.cpp index be299018d2c..75497ed103d 100644 --- a/src/plugins/debugger/dap/dapengine.cpp +++ b/src/plugins/debugger/dap/dapengine.cpp @@ -378,8 +378,13 @@ void DapEngine::insertBreakpoint(const Breakpoint &bp) QTC_CHECK(bp->state() == BreakpointInsertionRequested); notifyBreakpointInsertProceeding(bp); - const BreakpointParameters ¶ms = bp->requestedParameters(); + dapInsertBreakpoint(bp); +} + +void DapEngine::dapInsertBreakpoint(const Breakpoint &bp) +{ bp->setResponseId(QString::number(m_nextBreakpointId++)); + const BreakpointParameters ¶ms = bp->requestedParameters(); QJsonArray breakpoints; for (const auto &breakpoint : breakHandler()->breakpoints()) { @@ -401,30 +406,21 @@ void DapEngine::insertBreakpoint(const Breakpoint &bp) }} }); - notifyBreakpointInsertOk(bp); qCDebug(dapEngineLog) << "insertBreakpoint" << bp->modelId() << bp->responseId(); } void DapEngine::updateBreakpoint(const Breakpoint &bp) { + BreakpointParameters parameters = bp->requestedParameters(); notifyBreakpointChangeProceeding(bp); -// QTC_ASSERT(bp, return); -// const BreakpointState state = bp->state(); -// if (QTC_GUARD(state == BreakpointUpdateRequested)) -// if (bp->responseId().isEmpty()) // FIXME postpone update somehow (QTimer::singleShot?) -// return; + qDebug() << "updateBreakpoint"; -// // FIXME figure out what needs to be changed (there might be more than enabled state) -// const BreakpointParameters &requested = bp->requestedParameters(); -// if (requested.enabled != bp->isEnabled()) { -// if (bp->isEnabled()) -// postDirectCommand("disable " + bp->responseId()); -// else -// postDirectCommand("enable " + bp->responseId()); -// bp->setEnabled(!bp->isEnabled()); -// } -// // Pretend it succeeds without waiting for response. - notifyBreakpointChangeOk(bp); + if (parameters.enabled != bp->isEnabled()) { + if (bp->isEnabled()) + dapRemoveBreakpoint(bp); + else + dapInsertBreakpoint(bp); + } } void DapEngine::removeBreakpoint(const Breakpoint &bp) @@ -433,6 +429,11 @@ void DapEngine::removeBreakpoint(const Breakpoint &bp) QTC_CHECK(bp->state() == BreakpointRemoveRequested); notifyBreakpointRemoveProceeding(bp); + dapRemoveBreakpoint(bp); +} + +void DapEngine::dapRemoveBreakpoint(const Breakpoint &bp) +{ const BreakpointParameters ¶ms = bp->requestedParameters(); QJsonArray breakpoints; @@ -455,7 +456,6 @@ void DapEngine::removeBreakpoint(const Breakpoint &bp) }); qCDebug(dapEngineLog) << "removeBreakpoint" << bp->modelId() << bp->responseId(); - notifyBreakpointRemoveOk(bp); } void DapEngine::loadSymbols(const Utils::FilePath &/*moduleName*/) @@ -870,6 +870,16 @@ void DapEngine::handleBreakpointEvent(const QJsonObject &event) QString::number(breakpoint.value("id").toInt())); qCDebug(dapEngineLog) << "breakpoint id :" << breakpoint.value("id").toInt(); + if (bp) { + BreakpointParameters parameters = bp->requestedParameters(); + if (parameters.enabled != bp->isEnabled()) { + parameters.pending = false; + bp->setParameters(parameters); + notifyBreakpointChangeOk(bp); + return; + } + } + if (body.value("reason").toString() == "new") { if (breakpoint.value("verified").toBool()) { notifyBreakpointInsertOk(bp); diff --git a/src/plugins/debugger/dap/dapengine.h b/src/plugins/debugger/dap/dapengine.h index 935350e4698..6871e3e468e 100644 --- a/src/plugins/debugger/dap/dapengine.h +++ b/src/plugins/debugger/dap/dapengine.h @@ -113,6 +113,8 @@ protected: void dapScopes(int frameId); void threads(); void dapVariables(int variablesReference); + void dapRemoveBreakpoint(const Breakpoint &bp); + void dapInsertBreakpoint(const Breakpoint &bp); void handleDapDone(); void readDapStandardOutput();