#pragma once #include "dap/protocol.hpp" #include namespace ecode { using namespace dap; class DebuggerClient { public: enum class State { None, Initializing, Initialized, Running, Terminated, Failed }; class Listener { public: virtual void stateChanged( State ) = 0; virtual void initialized() = 0; virtual void launched() = 0; virtual void configured() = 0; virtual void failed() = 0; virtual void debuggeeRunning() = 0; virtual void debuggeeTerminated() = 0; virtual void capabilitiesReceived( const Capabilities& capabilities ) = 0; virtual void debuggeeExited( int exitCode ) = 0; virtual void debuggeeStopped( const StoppedEvent& ) = 0; virtual void debuggeeContinued( const ContinuedEvent& ) = 0; virtual void outputProduced( const Output& ) = 0; virtual void debuggingProcess( const ProcessInfo& ) = 0; virtual void errorResponse( const std::string& summary, const std::optional& message ) = 0; virtual void threadChanged( const ThreadEvent& ) = 0; virtual void moduleChanged( const ModuleEvent& ) = 0; virtual void threads( const std::vector& ) = 0; virtual void stackTrace( const int threadId, const StackTraceInfo& ) = 0; virtual void scopes( const int frameId, const std::vector& ) = 0; virtual void variables( const int variablesReference, const std::vector& ) = 0; virtual void modules( const ModulesInfo& ) = 0; virtual void serverDisconnected() = 0; virtual void sourceContent( const std::string& path, int reference = 0, const SourceContent& content = SourceContent() ) = 0; virtual void sourceBreakpoints( const std::string& path, int reference, const std::optional>& breakpoints ) = 0; virtual void breakpointChanged( const BreakpointEvent& ) = 0; virtual void expressionEvaluated( const std::string& expression, const std::optional& ) = 0; virtual void gotoTargets( const Source& source, const int line, const std::vector& targets ) = 0; }; State state() const { return mState; } virtual bool start() = 0; virtual bool started() const = 0; virtual bool resume( int threadId, bool singleThread = false ) = 0; virtual bool pause( int threadId ) = 0; virtual bool stepOver( int threadId, bool singleThread = false ) = 0; virtual bool goTo( int threadId, int targetId ) = 0; virtual bool stepInto( int threadId, bool singleThread = false ) = 0; virtual bool stepOut( int threadId, bool singleThread = false ) = 0; virtual bool terminate( bool restart ) = 0; virtual bool disconnect( bool restart = false ) = 0; virtual bool threads() = 0; virtual bool stackTrace( int threadId, int startFrame = 0, int levels = 0 ) = 0; virtual bool scopes( int frameId ) = 0; virtual bool modules( int start, int count ) = 0; virtual bool variables( int variablesReference, Variable::Type filter = Variable::Type::Both, int start = 0, int count = 0 ) = 0; virtual bool evaluate( const std::string& expression, const std::string& context, std::optional frameId ) = 0; virtual bool isServerConnected() const = 0; virtual bool supportsTerminate() const = 0; virtual bool setBreakpoints( const std::string& path, const std::vector& breakpoints, bool sourceModified = false ) = 0; virtual bool setBreakpoints( const dap::Source& source, const std::vector& breakpoints, bool sourceModified = false ) = 0; virtual bool gotoTargets( const std::string& path, const int line, const std::optional column = std::nullopt ) = 0; virtual bool gotoTargets( const dap::Source& source, const int line, const std::optional column = std::nullopt ) = 0; virtual bool watch( const std::string& expression, std::optional frameId ) = 0; virtual bool configurationDone() = 0; void addListener( Listener* listener ); void removeListener( Listener* listener ); virtual ~DebuggerClient() {} protected: void setState( const State& state ); State mState{ State::None }; bool mLaunched{ false }; bool mConfigured{ false }; std::vector mListeners; void checkRunning(); void stateChanged( State ); void initialized(); void debuggeeRunning(); void debuggeeTerminated(); void failed(); }; } // namespace ecode