diff --git a/include/dap/protocol.h b/include/dap/protocol.h index 0fef586..7364bad 100644 --- a/include/dap/protocol.h +++ b/include/dap/protocol.h @@ -14,6 +14,8 @@ // Generated with protocol_gen.go -- do not edit this file. // go run scripts/protocol_gen/protocol_gen.go +// +// DAP version 1.41.0 #ifndef dap_protocol_h #define dap_protocol_h @@ -125,8 +127,8 @@ struct Source { DAP_DECLARE_STRUCT_TYPEINFO(Source); -// Information about a Breakpoint created in setBreakpoints or -// setFunctionBreakpoints. +// Information about a Breakpoint created in setBreakpoints, +// setFunctionBreakpoints, setInstructionBreakpoints, or setDataBreakpoints. struct Breakpoint { Breakpoint(); ~Breakpoint(); @@ -142,12 +144,17 @@ struct Breakpoint { // An optional identifier for the breakpoint. It is needed if breakpoint // events are used to update or remove breakpoints. optional id; + // An optional memory reference to where the breakpoint is set. + optional instructionReference; // The start line of the actual range covered by the breakpoint. optional line; // An optional message about the state of the breakpoint. // This is shown to the user and can be used to explain why a breakpoint could // not be verified. optional message; + // An optional offset from the instruction reference. + // This can be negative. + optional offset; // The source where the breakpoint is located. optional source; // If true breakpoint could be set (but not necessarily at the desired @@ -374,6 +381,9 @@ struct Capabilities { // The debug adapter supports breakpoints that break execution after a // specified number of hits. optional supportsHitConditionalBreakpoints; + // The debug adapter supports adding breakpoints based on instruction + // references. + optional supportsInstructionBreakpoints; // The debug adapter supports the 'loadedSources' request. optional supportsLoadedSourcesRequest; // The debug adapter supports logpoints by interpreting the 'logMessage' @@ -398,6 +408,9 @@ struct Capabilities { optional supportsStepBack; // The debug adapter supports the 'stepInTargets' request. optional supportsStepInTargetsRequest; + // The debug adapter supports stepping granularities (argument 'granularity') + // for the stepping requests. + optional supportsSteppingGranularity; // The debug adapter supports the 'terminate' request. optional supportsTerminateRequest; // The debug adapter supports the 'terminateThreads' request. @@ -1094,6 +1107,9 @@ struct InitializeResponse : public Response { // The debug adapter supports breakpoints that break execution after a // specified number of hits. optional supportsHitConditionalBreakpoints; + // The debug adapter supports adding breakpoints based on instruction + // references. + optional supportsInstructionBreakpoints; // The debug adapter supports the 'loadedSources' request. optional supportsLoadedSourcesRequest; // The debug adapter supports logpoints by interpreting the 'logMessage' @@ -1118,6 +1134,9 @@ struct InitializeResponse : public Response { optional supportsStepBack; // The debug adapter supports the 'stepInTargets' request. optional supportsStepInTargetsRequest; + // The debug adapter supports stepping granularities (argument 'granularity') + // for the stepping requests. + optional supportsSteppingGranularity; // The debug adapter supports the 'terminate' request. optional supportsTerminateRequest; // The debug adapter supports the 'terminateThreads' request. @@ -1376,6 +1395,15 @@ struct NextResponse : public Response { DAP_DECLARE_STRUCT_TYPEINFO(NextResponse); +// The granularity of one 'step' in the stepping requests 'next', 'stepIn', +// 'stepOut', and 'stepBack'. +struct SteppingGranularity { + SteppingGranularity(); + ~SteppingGranularity(); +}; + +DAP_DECLARE_STRUCT_TYPEINFO(SteppingGranularity); + // The request starts the debuggee to run again for one step. // The debug adapter first sends the response and then a 'stopped' event (with // reason 'step') after the step has completed. @@ -1385,6 +1413,9 @@ struct NextRequest : public Request { NextRequest(); ~NextRequest(); + // Optional granularity to step. If no granularity is specified, a granularity + // of 'statement' is assumed. + optional granularity; // Execute 'next' for this thread. integer threadId; }; @@ -2063,6 +2094,61 @@ struct SetFunctionBreakpointsRequest : public Request { DAP_DECLARE_STRUCT_TYPEINFO(SetFunctionBreakpointsRequest); +// Response to 'setInstructionBreakpoints' request +struct SetInstructionBreakpointsResponse : public Response { + SetInstructionBreakpointsResponse(); + ~SetInstructionBreakpointsResponse(); + + // Information about the breakpoints. The array elements correspond to the + // elements of the 'breakpoints' array. + array breakpoints; +}; + +DAP_DECLARE_STRUCT_TYPEINFO(SetInstructionBreakpointsResponse); + +// Properties of a breakpoint passed to the setInstructionBreakpoints request +struct InstructionBreakpoint { + InstructionBreakpoint(); + ~InstructionBreakpoint(); + + // An optional expression for conditional breakpoints. + // It is only honored by a debug adapter if the capability + // 'supportsConditionalBreakpoints' is true. + optional condition; + // An optional expression that controls how many hits of the breakpoint are + // ignored. The backend is expected to interpret the expression as needed. The + // attribute is only honored by a debug adapter if the capability + // 'supportsHitConditionalBreakpoints' is true. + optional hitCondition; + // The instruction reference of the breakpoint. + // This should be a memory or instruction pointer reference from an + // EvaluateResponse, Variable, StackFrame, GotoTarget, or Breakpoint. + string instructionReference; + // An optional offset from the instruction reference. + // This can be negative. + optional offset; +}; + +DAP_DECLARE_STRUCT_TYPEINFO(InstructionBreakpoint); + +// Replaces all existing instruction breakpoints. Typically, instruction +// breakpoints would be set from a diassembly window. To clear all instruction +// breakpoints, specify an empty array. When an instruction breakpoint is hit, a +// 'stopped' event (with reason 'instruction breakpoint') is generated. Clients +// should only call this request if the capability +// 'supportsInstructionBreakpoints' is true. +struct SetInstructionBreakpointsRequest : public Request { + using Response = SetInstructionBreakpointsResponse; + + SetInstructionBreakpointsRequest(); + ~SetInstructionBreakpointsRequest(); + + // The instruction references of the breakpoints + array breakpoints; +}; + +DAP_DECLARE_STRUCT_TYPEINFO(SetInstructionBreakpointsRequest); + // Response to 'setVariable' request. struct SetVariableResponse : public Response { SetVariableResponse(); @@ -2263,6 +2349,9 @@ struct StepBackRequest : public Request { StepBackRequest(); ~StepBackRequest(); + // Optional granularity to step. If no granularity is specified, a granularity + // of 'statement' is assumed. + optional granularity; // Execute 'stepBack' for this thread. integer threadId; }; @@ -2292,6 +2381,9 @@ struct StepInRequest : public Request { StepInRequest(); ~StepInRequest(); + // Optional granularity to step. If no granularity is specified, a granularity + // of 'statement' is assumed. + optional granularity; // Optional id of the target to step into. optional targetId; // Execute 'stepIn' for this thread. @@ -2360,6 +2452,9 @@ struct StepOutRequest : public Request { StepOutRequest(); ~StepOutRequest(); + // Optional granularity to step. If no granularity is specified, a granularity + // of 'statement' is assumed. + optional granularity; // Execute 'stepOut' for this thread. integer threadId; }; @@ -2368,7 +2463,7 @@ DAP_DECLARE_STRUCT_TYPEINFO(StepOutRequest); // The event indicates that the execution of the debuggee has stopped due to // some condition. This can be caused by a break point previously set, a -// stepping action has completed, by executing a debugger statement etc. +// stepping request has completed, by executing a debugger statement etc. struct StoppedEvent : public Event { StoppedEvent(); ~StoppedEvent(); @@ -2392,7 +2487,7 @@ struct StoppedEvent : public Event { // // May be one of the following enumeration values: // 'step', 'breakpoint', 'exception', 'pause', 'entry', 'goto', 'function - // breakpoint', 'data breakpoint' + // breakpoint', 'data breakpoint', 'instruction breakpoint' string reason; // Additional information. E.g. if reason is 'exception', text contains the // exception name. This string is shown in the UI. diff --git a/src/protocol_events.cpp b/src/protocol_events.cpp index 35b4ac1..d5dc01b 100644 --- a/src/protocol_events.cpp +++ b/src/protocol_events.cpp @@ -14,6 +14,8 @@ // Generated with protocol_gen.go -- do not edit this file. // go run scripts/protocol_gen/protocol_gen.go +// +// DAP version 1.41.0 #include "dap/protocol.h" diff --git a/src/protocol_requests.cpp b/src/protocol_requests.cpp index 6906739..7ae4cd8 100644 --- a/src/protocol_requests.cpp +++ b/src/protocol_requests.cpp @@ -14,6 +14,8 @@ // Generated with protocol_gen.go -- do not edit this file. // go run scripts/protocol_gen/protocol_gen.go +// +// DAP version 1.41.0 #include "dap/protocol.h" @@ -157,6 +159,7 @@ NextRequest::NextRequest() = default; NextRequest::~NextRequest() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(NextRequest, "next", + DAP_FIELD(granularity, "granularity"), DAP_FIELD(threadId, "threadId")); PauseRequest::PauseRequest() = default; @@ -242,6 +245,12 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(SetFunctionBreakpointsRequest, "setFunctionBreakpoints", DAP_FIELD(breakpoints, "breakpoints")); +SetInstructionBreakpointsRequest::SetInstructionBreakpointsRequest() = default; +SetInstructionBreakpointsRequest::~SetInstructionBreakpointsRequest() = default; +DAP_IMPLEMENT_STRUCT_TYPEINFO(SetInstructionBreakpointsRequest, + "setInstructionBreakpoints", + DAP_FIELD(breakpoints, "breakpoints")); + SetVariableRequest::SetVariableRequest() = default; SetVariableRequest::~SetVariableRequest() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(SetVariableRequest, @@ -272,12 +281,14 @@ StepBackRequest::StepBackRequest() = default; StepBackRequest::~StepBackRequest() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(StepBackRequest, "stepBack", + DAP_FIELD(granularity, "granularity"), DAP_FIELD(threadId, "threadId")); StepInRequest::StepInRequest() = default; StepInRequest::~StepInRequest() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(StepInRequest, "stepIn", + DAP_FIELD(granularity, "granularity"), DAP_FIELD(targetId, "targetId"), DAP_FIELD(threadId, "threadId")); @@ -291,6 +302,7 @@ StepOutRequest::StepOutRequest() = default; StepOutRequest::~StepOutRequest() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(StepOutRequest, "stepOut", + DAP_FIELD(granularity, "granularity"), DAP_FIELD(threadId, "threadId")); TerminateRequest::TerminateRequest() = default; diff --git a/src/protocol_response.cpp b/src/protocol_response.cpp index a832fcc..ccf04cc 100644 --- a/src/protocol_response.cpp +++ b/src/protocol_response.cpp @@ -14,6 +14,8 @@ // Generated with protocol_gen.go -- do not edit this file. // go run scripts/protocol_gen/protocol_gen.go +// +// DAP version 1.41.0 #include "dap/protocol.h" @@ -134,6 +136,7 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO( DAP_FIELD(supportsGotoTargetsRequest, "supportsGotoTargetsRequest"), DAP_FIELD(supportsHitConditionalBreakpoints, "supportsHitConditionalBreakpoints"), + DAP_FIELD(supportsInstructionBreakpoints, "supportsInstructionBreakpoints"), DAP_FIELD(supportsLoadedSourcesRequest, "supportsLoadedSourcesRequest"), DAP_FIELD(supportsLogPoints, "supportsLogPoints"), DAP_FIELD(supportsModulesRequest, "supportsModulesRequest"), @@ -144,6 +147,7 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO( DAP_FIELD(supportsSetVariable, "supportsSetVariable"), DAP_FIELD(supportsStepBack, "supportsStepBack"), DAP_FIELD(supportsStepInTargetsRequest, "supportsStepInTargetsRequest"), + DAP_FIELD(supportsSteppingGranularity, "supportsSteppingGranularity"), DAP_FIELD(supportsTerminateRequest, "supportsTerminateRequest"), DAP_FIELD(supportsTerminateThreadsRequest, "supportsTerminateThreadsRequest"), @@ -240,6 +244,14 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(SetFunctionBreakpointsResponse, "", DAP_FIELD(breakpoints, "breakpoints")); +SetInstructionBreakpointsResponse::SetInstructionBreakpointsResponse() = + default; +SetInstructionBreakpointsResponse::~SetInstructionBreakpointsResponse() = + default; +DAP_IMPLEMENT_STRUCT_TYPEINFO(SetInstructionBreakpointsResponse, + "", + DAP_FIELD(breakpoints, "breakpoints")); + SetVariableResponse::SetVariableResponse() = default; SetVariableResponse::~SetVariableResponse() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(SetVariableResponse, diff --git a/src/protocol_types.cpp b/src/protocol_types.cpp index 58eca28..7d30567 100644 --- a/src/protocol_types.cpp +++ b/src/protocol_types.cpp @@ -14,6 +14,8 @@ // Generated with protocol_gen.go -- do not edit this file. // go run scripts/protocol_gen/protocol_gen.go +// +// DAP version 1.41.0 #include "dap/protocol.h" @@ -51,8 +53,11 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(Breakpoint, DAP_FIELD(endColumn, "endColumn"), DAP_FIELD(endLine, "endLine"), DAP_FIELD(id, "id"), + DAP_FIELD(instructionReference, + "instructionReference"), DAP_FIELD(line, "line"), DAP_FIELD(message, "message"), + DAP_FIELD(offset, "offset"), DAP_FIELD(source, "source"), DAP_FIELD(verified, "verified")); @@ -112,6 +117,7 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO( DAP_FIELD(supportsGotoTargetsRequest, "supportsGotoTargetsRequest"), DAP_FIELD(supportsHitConditionalBreakpoints, "supportsHitConditionalBreakpoints"), + DAP_FIELD(supportsInstructionBreakpoints, "supportsInstructionBreakpoints"), DAP_FIELD(supportsLoadedSourcesRequest, "supportsLoadedSourcesRequest"), DAP_FIELD(supportsLogPoints, "supportsLogPoints"), DAP_FIELD(supportsModulesRequest, "supportsModulesRequest"), @@ -122,6 +128,7 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO( DAP_FIELD(supportsSetVariable, "supportsSetVariable"), DAP_FIELD(supportsStepBack, "supportsStepBack"), DAP_FIELD(supportsStepInTargetsRequest, "supportsStepInTargetsRequest"), + DAP_FIELD(supportsSteppingGranularity, "supportsSteppingGranularity"), DAP_FIELD(supportsTerminateRequest, "supportsTerminateRequest"), DAP_FIELD(supportsTerminateThreadsRequest, "supportsTerminateThreadsRequest"), @@ -230,6 +237,10 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(Module, DAP_FIELD(symbolStatus, "symbolStatus"), DAP_FIELD(version, "version")); +SteppingGranularity::SteppingGranularity() = default; +SteppingGranularity::~SteppingGranularity() = default; +DAP_IMPLEMENT_STRUCT_TYPEINFO(SteppingGranularity, ""); + Scope::Scope() = default; Scope::~Scope() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(Scope, @@ -288,6 +299,16 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(FunctionBreakpoint, DAP_FIELD(hitCondition, "hitCondition"), DAP_FIELD(name, "name")); +InstructionBreakpoint::InstructionBreakpoint() = default; +InstructionBreakpoint::~InstructionBreakpoint() = default; +DAP_IMPLEMENT_STRUCT_TYPEINFO(InstructionBreakpoint, + "", + DAP_FIELD(condition, "condition"), + DAP_FIELD(hitCondition, "hitCondition"), + DAP_FIELD(instructionReference, + "instructionReference"), + DAP_FIELD(offset, "offset")); + StackFrame::StackFrame() = default; StackFrame::~StackFrame() = default; DAP_IMPLEMENT_STRUCT_TYPEINFO(StackFrame, diff --git a/tools/protocol_gen/protocol_gen.go b/tools/protocol_gen/protocol_gen.go index d036418..781c053 100644 --- a/tools/protocol_gen/protocol_gen.go +++ b/tools/protocol_gen/protocol_gen.go @@ -33,29 +33,29 @@ import ( "strings" ) -var ( - cache = flag.String("cache", "", "File cache of the .json schema") -) - const ( - jsonURL = "https://raw.githubusercontent.com/microsoft/vscode-debugadapter-node/master/debugProtocol.json" + protocolURL = "https://raw.githubusercontent.com/microsoft/vscode-debugadapter-node/master/debugProtocol.json" + packageURL = "https://raw.githubusercontent.com/microsoft/vscode-debugadapter-node/master/protocol/package.json" + versionTag = "${version}" commonPrologue = `// Copyright 2019 Google LLC - // - // Licensed under the Apache License, Version 2.0 (the "License"); - // you may not use this file except in compliance with the License. - // You may obtain a copy of the License at - // - // https://www.apache.org/licenses/LICENSE-2.0 - // - // Unless required by applicable law or agreed to in writing, software - // distributed under the License is distributed on an "AS IS" BASIS, - // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - // See the License for the specific language governing permissions and - // limitations under the License. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. - // Generated with protocol_gen.go -- do not edit this file. - // go run scripts/protocol_gen/protocol_gen.go +// Generated with protocol_gen.go -- do not edit this file. +// go run scripts/protocol_gen/protocol_gen.go +// +// DAP version ${version} ` headerPrologue = commonPrologue + ` @@ -527,18 +527,20 @@ type cppFilePaths map[structType]string type cppFiles map[structType]*os.File func run() error { - data, err := loadJSONFile() - if err != nil { + pkg := struct { + Version string `json:"version"` + }{} + if err := loadJSONFile(packageURL, &pkg); err != nil { return err } - r := root{} - d := json.NewDecoder(bytes.NewReader(data)) - if err := d.Decode(&r); err != nil { + + protocol := root{} + if err := loadJSONFile(protocolURL, &protocol); err != nil { return err } hPath, cppPaths := outputPaths() - if err := emitFiles(&r, hPath, cppPaths); err != nil { + if err := emitFiles(&protocol, hPath, cppPaths, pkg.Version); err != nil { return err } @@ -551,12 +553,14 @@ func run() error { return err } } + } else { + fmt.Printf("clang-format not found on PATH. Please format before committing.") } return nil } -func emitFiles(r *root, hPath string, cppPaths map[structType]string) error { +func emitFiles(r *root, hPath string, cppPaths map[structType]string, version string) error { h, err := os.Create(hPath) if err != nil { return err @@ -572,9 +576,9 @@ func emitFiles(r *root, hPath string, cppPaths map[structType]string) error { defer f.Close() } - h.WriteString(headerPrologue) + h.WriteString(strings.ReplaceAll(headerPrologue, versionTag, version)) for _, f := range cppFiles { - f.WriteString(cppPrologue) + f.WriteString(strings.ReplaceAll(cppPrologue, versionTag, version)) } structs, err := buildStructs(r) @@ -618,25 +622,19 @@ func emitFiles(r *root, hPath string, cppPaths map[structType]string) error { return nil } -func loadJSONFile() ([]byte, error) { - if *cache != "" { - data, err := ioutil.ReadFile(*cache) - if err == nil { - return data, nil - } - } - resp, err := http.Get(jsonURL) +func loadJSONFile(url string, obj interface{}) error { + resp, err := http.Get(url) if err != nil { - return nil, err + return err } data, err := ioutil.ReadAll(resp.Body) if err != nil { - return nil, err + return err } - if *cache != "" { - ioutil.WriteFile(*cache, data, 0777) + if err := json.NewDecoder(bytes.NewReader(data)).Decode(obj); err != nil { + return err } - return data, nil + return nil } func outputPaths() (string, cppFilePaths) {