llvm-project/lldb/tools/lldb-dap/Handler/SetExceptionBreakpointsRequestHandler.cpp
Jonas Devlieghere 911e94c651
[lldb-dap] Finish refactoring the request handlers (NFC) (#128553)
Completes the work started in #128262. This PR removes the
old way of register request handlers with callbacks and makes
the operator const.
2025-02-24 16:46:12 -06:00

94 lines
3.2 KiB
C++

//===-- SetExceptionBreakpointsRequestHandler.cpp -------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "DAP.h"
#include "EventHelper.h"
#include "JSONUtils.h"
#include "RequestHandler.h"
#include <set>
namespace lldb_dap {
// "SetExceptionBreakpointsRequest": {
// "allOf": [ { "$ref": "#/definitions/Request" }, {
// "type": "object",
// "description": "SetExceptionBreakpoints request; value of command field
// is 'setExceptionBreakpoints'. The request configures the debuggers
// response to thrown exceptions. If an exception is configured to break, a
// StoppedEvent is fired (event type 'exception').", "properties": {
// "command": {
// "type": "string",
// "enum": [ "setExceptionBreakpoints" ]
// },
// "arguments": {
// "$ref": "#/definitions/SetExceptionBreakpointsArguments"
// }
// },
// "required": [ "command", "arguments" ]
// }]
// },
// "SetExceptionBreakpointsArguments": {
// "type": "object",
// "description": "Arguments for 'setExceptionBreakpoints' request.",
// "properties": {
// "filters": {
// "type": "array",
// "items": {
// "type": "string"
// },
// "description": "IDs of checked exception options. The set of IDs is
// returned via the 'exceptionBreakpointFilters' capability."
// },
// "exceptionOptions": {
// "type": "array",
// "items": {
// "$ref": "#/definitions/ExceptionOptions"
// },
// "description": "Configuration options for selected exceptions."
// }
// },
// "required": [ "filters" ]
// },
// "SetExceptionBreakpointsResponse": {
// "allOf": [ { "$ref": "#/definitions/Response" }, {
// "type": "object",
// "description": "Response to 'setExceptionBreakpoints' request. This is
// just an acknowledgement, so no body field is required."
// }]
// }
void SetExceptionBreakpointsRequestHandler::operator()(
const llvm::json::Object &request) const {
llvm::json::Object response;
lldb::SBError error;
FillResponse(request, response);
const auto *arguments = request.getObject("arguments");
const auto *filters = arguments->getArray("filters");
// Keep a list of any exception breakpoint filter names that weren't set
// so we can clear any exception breakpoints if needed.
std::set<std::string> unset_filters;
for (const auto &bp : *dap.exception_breakpoints)
unset_filters.insert(bp.filter);
for (const auto &value : *filters) {
const auto filter = GetAsString(value);
auto *exc_bp = dap.GetExceptionBreakpoint(std::string(filter));
if (exc_bp) {
exc_bp->SetBreakpoint();
unset_filters.erase(std::string(filter));
}
}
for (const auto &filter : unset_filters) {
auto *exc_bp = dap.GetExceptionBreakpoint(filter);
if (exc_bp)
exc_bp->ClearBreakpoint();
}
dap.SendJSON(llvm::json::Value(std::move(response)));
}
} // namespace lldb_dap