| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| #pragma once |
| |
| #include "cmConfigure.h" // IWYU pragma: keep |
| |
| #include <cstddef> |
| #include <mutex> |
| #include <string> |
| #include <unordered_map> |
| |
| #include <cm/optional> |
| |
| #include <cm3p/cppdap/protocol.h> |
| |
| #include "cmMessageType.h" // IWYU pragma: keep |
| |
| namespace dap { |
| class Session; |
| struct CMakeInitializeResponse; |
| } |
| |
| namespace cmDebugger { |
| |
| struct cmDebuggerException |
| { |
| std::string Id; |
| std::string Description; |
| }; |
| |
| struct cmDebuggerExceptionFilter |
| { |
| std::string Filter; |
| std::string Label; |
| }; |
| |
| /** The exception manager. */ |
| class cmDebuggerExceptionManager |
| { |
| // Some older C++ standard libraries cannot hash an enum class by default. |
| struct MessageTypeHash |
| { |
| std::size_t operator()(MessageType t) const |
| { |
| return std::hash<int>{}(static_cast<int>(t)); |
| } |
| }; |
| |
| dap::Session* DapSession; |
| std::mutex Mutex; |
| std::unordered_map<std::string, bool> RaiseExceptions; |
| std::unordered_map<MessageType, cmDebuggerExceptionFilter, MessageTypeHash> |
| ExceptionMap; |
| cm::optional<cmDebuggerException> TheException; |
| |
| dap::SetExceptionBreakpointsResponse HandleSetExceptionBreakpointsRequest( |
| dap::SetExceptionBreakpointsRequest const& request); |
| |
| dap::ExceptionInfoResponse HandleExceptionInfoRequest(); |
| |
| public: |
| cmDebuggerExceptionManager(dap::Session* dapSession); |
| void HandleInitializeRequest(dap::CMakeInitializeResponse& response); |
| cm::optional<dap::StoppedEvent> RaiseExceptionIfAny(MessageType t, |
| std::string const& text); |
| void ClearAll(); |
| }; |
| |
| } // namespace cmDebugger |