mirror of
https://github.com/intel/llvm.git
synced 2026-01-13 19:08:21 +08:00
[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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user