[lldb-dap] Migrate pause request to structured types (#171096)

This patch migrates `pause` request into structured types and adds test
for it.
This commit is contained in:
Sergei Druzhkov
2025-12-08 21:35:24 +03:00
committed by GitHub
parent 7305ed7e15
commit 371da58cfa
5 changed files with 40 additions and 44 deletions

View File

@@ -8,53 +8,20 @@
#include "DAP.h"
#include "EventHelper.h"
#include "JSONUtils.h"
#include "LLDBUtils.h"
#include "Protocol/ProtocolRequests.h"
#include "RequestHandler.h"
namespace lldb_dap {
// "PauseRequest": {
// "allOf": [ { "$ref": "#/definitions/Request" }, {
// "type": "object",
// "description": "Pause request; value of command field is 'pause'. The
// request suspenses the debuggee. The debug adapter first sends the
// PauseResponse and then a StoppedEvent (event type 'pause') after the
// thread has been paused successfully.", "properties": {
// "command": {
// "type": "string",
// "enum": [ "pause" ]
// },
// "arguments": {
// "$ref": "#/definitions/PauseArguments"
// }
// },
// "required": [ "command", "arguments" ]
// }]
// },
// "PauseArguments": {
// "type": "object",
// "description": "Arguments for 'pause' request.",
// "properties": {
// "threadId": {
// "type": "integer",
// "description": "Pause execution for this thread."
// }
// },
// "required": [ "threadId" ]
// },
// "PauseResponse": {
// "allOf": [ { "$ref": "#/definitions/Response" }, {
// "type": "object",
// "description": "Response to 'pause' request. This is just an
// acknowledgement, so no body field is required."
// }]
// }
void PauseRequestHandler::operator()(const llvm::json::Object &request) const {
llvm::json::Object response;
FillResponse(request, response);
/// The request suspenses the debuggee. The debug adapter first sends the
/// PauseResponse and then a StoppedEvent (event type 'pause') after the thread
/// has been paused successfully.
llvm::Error
PauseRequestHandler::Run(const protocol::PauseArguments &args) const {
lldb::SBProcess process = dap.target.GetProcess();
lldb::SBError error = process.Stop();
dap.SendJSON(llvm::json::Value(std::move(response)));
return ToError(error);
}
} // namespace lldb_dap

View File

@@ -492,11 +492,12 @@ public:
Run(const std::optional<protocol::ModulesArguments> &args) const override;
};
class PauseRequestHandler : public LegacyRequestHandler {
class PauseRequestHandler
: public RequestHandler<protocol::PauseArguments, protocol::PauseResponse> {
public:
using LegacyRequestHandler::LegacyRequestHandler;
using RequestHandler::RequestHandler;
static llvm::StringLiteral GetCommand() { return "pause"; }
void operator()(const llvm::json::Object &request) const override;
llvm::Error Run(const protocol::PauseArguments &args) const override;
};
class ScopesRequestHandler final

View File

@@ -695,4 +695,10 @@ llvm::json::Value toJSON(const EvaluateResponseBody &Body) {
return result;
}
bool fromJSON(const llvm::json::Value &Params, PauseArguments &Args,
llvm::json::Path Path) {
json::ObjectMapper O(Params, Path);
return O && O.map("threadId", Args.threadId);
}
} // namespace lldb_dap::protocol

View File

@@ -1184,6 +1184,17 @@ struct EvaluateResponseBody {
};
llvm::json::Value toJSON(const EvaluateResponseBody &);
/// Arguments for `pause` request.
struct PauseArguments {
/// Pause execution for this thread.
lldb::tid_t threadId = LLDB_INVALID_THREAD_ID;
};
bool fromJSON(const llvm::json::Value &, PauseArguments &, llvm::json::Path);
/// Response to `pause` request. This is just an acknowledgement, so no body
/// field is required.
using PauseResponse = VoidResponse;
} // namespace lldb_dap::protocol
#endif

View File

@@ -182,3 +182,14 @@ TEST(ProtocolRequestsTest, InitializeRequestArguments) {
EXPECT_THAT_EXPECTED(parse<InitializeRequestArguments>(R"({})"),
FailedWithMessage("missing value at (root).adapterID"));
}
TEST(ProtocolRequestsTest, PauseRequestArguments) {
llvm::Expected<PauseArguments> expected =
parse<PauseArguments>(R"({"threadId": 123})");
ASSERT_THAT_EXPECTED(expected, llvm::Succeeded());
EXPECT_EQ(expected->threadId, 123U);
// Check required keys.
EXPECT_THAT_EXPECTED(parse<PauseArguments>(R"({})"),
FailedWithMessage("missing value at (root).threadId"));
}