/* ** See LICENSE Notice in lua.h ** Copyright (C) 2015-2016 Dibyendu Majumdar */ #ifndef RAVI_VSCODE_PROTOCOL_H #define RAVI_VSCODE_PROTOCOL_H #include "../../src/ravi_membuf.h" #include "json.h" #include #include #include enum { VSCODE_REQUEST = 1, VSCODE_EVENT = 2, VSCODE_RESPONSE = 3, VSCODE_UNKNOWN = 4 }; enum { VSCODE_INITIALIZED_EVENT = 1, VSCODE_STOPPED_EVENT = 2, VSCODE_EXITED_EVENT = 3, VSCODE_TERMINATED_EVENT = 4, VSCODE_THREAD_EVENT = 5, VSCODE_OUTPUT_EVENT = 6, VSCODE_BREAKPOINT_EVENT = 7, }; enum { VSCODE_ERROR_RESPONSE = 1, }; enum { VSCODE_EOF = -2, VSCODE_UNKNOWN_REQUEST = -1, VSCODE_INITIALIZE_REQUEST = 1, VSCODE_CONFIGURATION_DONE_REQUEST = 2, VSCODE_LAUNCH_REQUEST = 3, VSCODE_ATTACH_REQUEST = 4, VSCODE_DISCONNECT_REQUEST = 5, VSCODE_SET_BREAKPOINTS_REQUEST = 6, VSCODE_SET_FUNCTION_BREAKPOINTS_REQUEST = 7, VSCODE_SET_EXCEPTION_BREAKPOINTS_REQUEST = 8, VSCODE_CONTINUE_REQUEST = 9, VSCODE_NEXT_REQUEST = 10, VSCODE_STEPIN_REQUEST = 11, VSCODE_STEPOUT_REQUEST = 12, VSCODE_PAUSE_REQUEST = 13, VSCODE_STACK_TRACE_REQUEST = 14, VSCODE_SCOPES_REQUEST = 15, VSCODE_VARIABLES_REQUEST = 16, VSCODE_SOURCE_REQUEST = 17, VSCODE_THREAD_REQUEST = 18, VSCODE_EVALUATE_REQUEST = 19, }; enum { VSCODE_INITIALIZE_RESPONSE = 1, VSCODE_CONFIGURATION_DONE_RESPONSE = 2, VSCODE_LAUNCH_RESPONSE = 3, VSCODE_ATTACH_RESPONSE = 4, VSCODE_DISCONNECT_RESPONSE = 5, VSCODE_SET_BREAKPOINTS_RESPONSE = 6, VSCODE_SET_FUNCTION_BREAKPOINTS_RESPONSE = 7, VSCODE_SET_EXCEPTION_BREAKPOINTS_RESPONSE = 8, VSCODE_CONTINUE_RESPONSE = 9, VSCODE_NEXT_RESPONSE = 10, VSCODE_STEPIN_RESPONSE = 11, VSCODE_STEPOUT_RESPONSE = 12, VSCODE_PAUSE_RESPONSE = 13, VSCODE_STACK_TRACE_RESPONSE = 14, VSCODE_SCOPES_RESPONSE = 15, VSCODE_VARIABLES_RESPONSE = 16, VSCODE_SOURCE_RESPONSE = 17, VSCODE_THREAD_RESPONSE = 18, VSCODE_EVALUATE_RESPONSE = 19, }; enum { NAME_LEN = 50, PATH_LEN = 256, VALUE_LEN = 80, COMMAND_LEN = 30, EVENT_LEN = 30, REASON_LEN = 100, CATEGORY_LEN = 30, TEXT_LEN = 256, MAX_BREAKPOINTS = 5, MAX_STACK_FRAMES = 50, MAX_SCOPES = 4, MAX_VARIABLES = 251, MAX_THREADS = 1, SOURCE_LEN = 8196, MAX_TOTAL_BREAKPOINTS = 20 }; /* The max integer that can be transferred to a Javascript number (and hence JSON number) is 2^53-1 which is equal to 9007199254740991. This takes up 53 bits. The integer 4503599627370495 takes up 52 bits - so that means 6 8-bit values and 1 4-bit value can be accomodated. */ typedef struct { unsigned int x8[5]; unsigned int depth; unsigned int vartype; } PackedInteger; typedef struct { int id; char format[TEXT_LEN]; } Message; typedef struct { int id; char name[NAME_LEN]; } Thread; typedef struct { char name[NAME_LEN]; char path[PATH_LEN]; int64_t sourceReference; } Source; typedef struct { int id; char name[NAME_LEN]; Source source; int line; int column; } StackFrame; typedef struct { char name[NAME_LEN]; int64_t variablesReference; int expensive; } Scope; typedef struct { char name[NAME_LEN]; char type[NAME_LEN]; char value[VALUE_LEN]; int64_t variablesReference; } Variable; typedef struct { int line; int column; } SourceBreakpoint; typedef struct { char name[NAME_LEN]; } FunctionBreakpoint; typedef struct { int id; int verified; char message[TEXT_LEN]; Source source; int line; int column; } Breakpoint; typedef struct { int supportsConfigurationDoneRequest; int supportsFunctionBreakpoints; int supportsConditionalBreakpoints; int supportsEvaluateForHovers; } Capabilities; /* See * https://github.com/Microsoft/vscode-debugadapter-node/blob/master/protocol/src/debugProtocol.ts */ typedef struct { int type; int64_t seq; union { struct { int event_type; char event[EVENT_LEN]; union { struct { char reason[REASON_LEN]; int threadId; char text[TEXT_LEN]; int allThreadsStopped; } StoppedEvent; struct { int exitCode; } ExitedEvent; struct { int restart; } TerminatedEvent; struct { char reason[REASON_LEN]; int threadId; } ThreadEvent; struct { char category[CATEGORY_LEN]; char output[TEXT_LEN]; } OutputEvent; struct { char reason[TEXT_LEN]; Breakpoint breakpoint; } BreakpointEvent; } u; } Event; struct { int request_type; char command[COMMAND_LEN]; union { struct { char adapterID[NAME_LEN]; int linesStartAt1; int columnsStartAt1; char pathFormat[NAME_LEN]; } InitializeRequest; struct { int noDebug; char program[TEXT_LEN]; int stopOnEntry; char lua_path[PATH_LEN]; char lua_cpath[PATH_LEN]; char cwd[PATH_LEN]; } LaunchRequest; struct { Source source; Breakpoint breakpoints[MAX_BREAKPOINTS]; } SetBreakpointsRequest; struct { FunctionBreakpoint breakpoints[MAX_BREAKPOINTS]; } SetFunctionBreakpointsRequest; struct { char filters[1][TEXT_LEN]; } SetExceptionBreakpointsRequest; struct { int integer; } CommonIntRequest; struct { int64_t integer64; } CommonInt64Request; struct { int threadId; } ContinueRequest; struct { int threadId; } NextRequest; struct { int threadId; } StepInRequest; struct { int threadId; } StepOutRequest; struct { int threadId; } PauseRequest; struct { int threadId; int startFrame; int levels; } StackTraceRequest; struct { int frameId; } ScopesRequest; struct { int64_t variablesReference; } VariablesRequest; struct { int64_t sourceReference; } SourceRequest; struct { char expression[TEXT_LEN]; int frameId; char context[TEXT_LEN]; } EvaluateRequest; } u; } Request; struct { int response_type; int64_t request_seq; int success; char command[COMMAND_LEN]; char message[TEXT_LEN]; union { struct { char error[TEXT_LEN]; } ErrorResponse; struct { Capabilities body; } InitializeResponse; struct { Breakpoint breakpoints[MAX_BREAKPOINTS]; } SetBreakpointsResponse; struct { Breakpoint breakpoints[MAX_BREAKPOINTS]; } SetFunctionBreakpointsResponse; struct { StackFrame stackFrames[MAX_STACK_FRAMES]; int totalFrames; } StackTraceResponse; struct { Scope scopes[MAX_SCOPES]; } ScopesResponse; struct { Variable variables[MAX_VARIABLES+1]; } VariablesResponse; struct { char content[SOURCE_LEN]; } SourceResponse; struct { Thread threads[MAX_THREADS]; } ThreadResponse; struct { char result[TEXT_LEN]; int64_t variablesReference; } EvaluateResponse; } u; } Response; } u; } ProtocolMessage; extern int vscode_parse_message(char *buf, size_t len, ProtocolMessage *msg, FILE *log); extern void vscode_make_error_response(ProtocolMessage *req, ProtocolMessage *res, int restype, const char *errormsg); extern void vscode_make_success_response(ProtocolMessage *req, ProtocolMessage *res, int restype); extern void vscode_serialize_response_new(membuff_t *mb, ProtocolMessage *res); extern void vscode_serialize_event_new(membuff_t *mb, ProtocolMessage *res); extern void vscode_make_initialized_event(ProtocolMessage *res); extern void vscode_make_stopped_event(ProtocolMessage *res, const char *reason); extern void vscode_make_thread_event(ProtocolMessage *res, bool started); extern void vscode_make_terminated_event(ProtocolMessage *res); extern void vscode_send(ProtocolMessage *msg, FILE *out, FILE *log); extern void vscode_send_stopped_event(ProtocolMessage *res, const char *msg, FILE *out, FILE *log); extern void vscode_send_thread_event(ProtocolMessage *res, bool started, FILE *out, FILE *log); extern void vscode_send_terminated_event(ProtocolMessage *res, FILE *out, FILE *log); extern void vscode_send_output_event(ProtocolMessage *res, const char *category, const char *msg, FILE *out, FILE *log); extern void vscode_send_error_response(ProtocolMessage *req, ProtocolMessage *res, int responseType, const char *msg, FILE *out, FILE *log); extern void vscode_send_success_response(ProtocolMessage *req, ProtocolMessage *res, int responseType, FILE *out, FILE *log); extern int vscode_get_request(FILE *in, membuff_t *mb, ProtocolMessage *req, FILE *log); extern void vscode_json_stringify(const char *src, char *dest, size_t len); extern int64_t vscode_pack(PackedInteger *pi); extern void vscode_unpack(int64_t i, PackedInteger *pi); #endif