Auto-update cmakelists on protocol sync, update to 1.59.0 (#93)

* CMake: Fix target options

* update CMake package version after protocol sync

* Update protocol to 1.59.0

* protocol_gen: change OneOf to `object` type

The DAP spec introduces ambiguities with its particular uses of OneOf,
which means that we can't deserialize the variants generated from it.
Just set OneOf to an `object` type, like godap does.
This commit is contained in:
nikitalita 2023-02-13 14:55:48 -08:00 committed by GitHub
parent 0a340c6d71
commit d9041149a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 100 additions and 81 deletions

View File

@ -13,7 +13,7 @@
# limitations under the License.
cmake_policy(SET CMP0048 NEW)
project(cppdap VERSION 1.58.0 LANGUAGES CXX C)
project(cppdap VERSION 1.59.0 LANGUAGES CXX C)
cmake_minimum_required(VERSION 3.13)
@ -198,7 +198,7 @@ function(cppdap_set_target_options target)
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
cppdap_set_json_links(${target})
target_link_libraries(cppdap PRIVATE ${CPPDAP_OS_LIBS})
target_link_libraries(${target} PRIVATE ${CPPDAP_OS_LIBS})
endfunction(cppdap_set_target_options)
###########################################################
@ -334,7 +334,7 @@ if(CPPDAP_BUILD_EXAMPLES)
FOLDER "Examples"
)
cppdap_set_target_options(${target})
target_link_libraries(${target} cppdap "${CPPDAP_OS_LIBS}")
target_link_libraries(${target} PRIVATE cppdap)
if(CPPDAP_INSTALL_VSCODE_EXAMPLES)
if(CMAKE_SYSTEM_NAME MATCHES "Windows")

View File

@ -15,7 +15,7 @@
// Generated with protocol_gen.go -- do not edit this file.
// go run scripts/protocol_gen/protocol_gen.go
//
// DAP version 1.58.0
// DAP version 1.59.0
#ifndef dap_protocol_h
#define dap_protocol_h
@ -593,11 +593,17 @@ DAP_DECLARE_STRUCT_TYPEINFO(DataBreakpointInfoResponse);
// corresponding capability `supportsDataBreakpoints` is true.
struct DataBreakpointInfoRequest : public Request {
using Response = DataBreakpointInfoResponse;
// When `name` is an expression, evaluate it in the scope of this stack frame.
// If not specified, the expression is evaluated in the global scope. When
// `variablesReference` is specified, this property has no effect.
optional<integer> frameId;
// The name of the variable's child to obtain data breakpoint information for.
// If `variablesReference` isn't specified, this can be an expression.
string name;
// Reference to the variable container if the data breakpoint is requested for
// a child of the container.
// a child of the container. The `variablesReference` must have been obtained
// in the current suspended state. See 'Lifetime of Object References' in the
// Overview section for details.
optional<integer> variablesReference;
};
@ -709,7 +715,11 @@ struct Message {
// If variable name starts with an underscore character, the variable does not
// contain user data (PII) and can be safely used for telemetry purposes.
string format;
// Unique identifier for the message.
// Unique (within a debug adapter implementation) identifier for the message.
// The purpose of these error IDs is to help extension authors that have the
// requirement that every user visible error message needs a corresponding
// error number, so that users or customer support can find information about
// the specific error more easily.
integer id;
// If true send to telemetry.
optional<boolean> sendTelemetry;
@ -795,8 +805,8 @@ struct EvaluateResponse : public Response {
optional<string> type;
// If `variablesReference` is > 0, the evaluate result is structured and its
// children can be retrieved by passing `variablesReference` to the
// `variables` request. The value should be less than or equal to 2147483647
// (2^31-1).
// `variables` request as long as execution remains suspended. See 'Lifetime
// of Object References' in the Overview section for details.
integer variablesReference;
};
@ -817,7 +827,7 @@ struct EvaluateRequest : public Request {
// The context in which the evaluate request is used.
//
// May be one of the following enumeration values:
// 'variables', 'watch', 'repl', 'hover', 'clipboard'
// 'watch', 'repl', 'hover', 'clipboard', 'variables'
optional<string> context;
// The expression to evaluate.
string expression;
@ -1390,8 +1400,9 @@ struct OutputEvent : public Event {
optional<Source> source;
// If an attribute `variablesReference` exists and its value is > 0, the
// output contains objects which can be retrieved by passing
// `variablesReference` to the `variables` request. The value should be less
// than or equal to 2147483647 (2^31-1).
// `variablesReference` to the `variables` request as long as execution
// remains suspended. See 'Lifetime of Object References' in the Overview
// section for details.
optional<integer> variablesReference;
};
@ -1507,7 +1518,10 @@ struct ReadMemoryResponse : public Response {
// Treated as a hex value if prefixed with `0x`, or as a decimal value
// otherwise.
string address;
// The bytes read from memory, encoded using base64.
// The bytes read from memory, encoded using base64. If the decoded length of
// `data` is less than the requested `count` in the original `readMemory`
// request, and `unreadableBytes` is zero or omitted, then the client should
// assume it's reached the end of readable memory.
optional<string> data;
// The number of unreadable bytes encountered after the last successfully read
// byte. This can be used to determine the number of bytes that should be
@ -1545,7 +1559,9 @@ DAP_DECLARE_STRUCT_TYPEINFO(RestartFrameResponse);
// this request if the corresponding capability `supportsRestartFrame` is true.
struct RestartFrameRequest : public Request {
using Response = RestartFrameResponse;
// Restart this stackframe.
// Restart the stack frame identified by `frameId`. The `frameId` must have
// been obtained in the current suspended state. See 'Lifetime of Object
// References' in the Overview section for details.
integer frameId;
};
@ -1557,33 +1573,6 @@ struct RestartResponse : public Response {};
DAP_DECLARE_STRUCT_TYPEINFO(RestartResponse);
// Arguments for `launch` request. Additional attributes are implementation
// specific.
struct LaunchRequestArguments {
// Arbitrary data from the previous, restarted session.
// The data is sent as the `restart` attribute of the `terminated` event.
// The client should leave the data intact.
optional<variant<array<any>, boolean, integer, null, number, object, string>>
restart;
// If true, the launch request should launch the program without enabling
// debugging.
optional<boolean> noDebug;
};
DAP_DECLARE_STRUCT_TYPEINFO(LaunchRequestArguments);
// Arguments for `attach` request. Additional attributes are implementation
// specific.
struct AttachRequestArguments {
// Arbitrary data from the previous, restarted session.
// The data is sent as the `restart` attribute of the `terminated` event.
// The client should leave the data intact.
optional<variant<array<any>, boolean, integer, null, number, object, string>>
restart;
};
DAP_DECLARE_STRUCT_TYPEINFO(AttachRequestArguments);
// Restarts a debug session. Clients should only call this request if the
// corresponding capability `supportsRestartRequest` is true. If the capability
// is missing or has the value false, a typical client emulates `restart` by
@ -1591,7 +1580,7 @@ DAP_DECLARE_STRUCT_TYPEINFO(AttachRequestArguments);
struct RestartRequest : public Request {
using Response = RestartResponse;
// The latest version of the `launch` or `attach` configuration.
optional<variant<LaunchRequestArguments, AttachRequestArguments>> arguments;
optional<object> arguments;
};
DAP_DECLARE_STRUCT_TYPEINFO(RestartRequest);
@ -1666,7 +1655,7 @@ struct RunInTerminalRequest : public Request {
// Environment key-value pairs that are added to or removed from the default
// environment.
optional<object> env;
// What kind of terminal to launch.
// What kind of terminal to launch. Defaults to `integrated` if not specified.
//
// Must be one of the following enumeration values:
// 'integrated', 'external'
@ -1715,7 +1704,9 @@ struct Scope {
// The source for this scope.
optional<Source> source;
// The variables of this scope can be retrieved by passing the value of
// `variablesReference` to the `variables` request.
// `variablesReference` to the `variables` request as long as execution
// remains suspended. See 'Lifetime of Object References' in the Overview
// section for details.
integer variablesReference;
};
@ -1733,7 +1724,9 @@ DAP_DECLARE_STRUCT_TYPEINFO(ScopesResponse);
// The request returns the variable scopes for a given stack frame ID.
struct ScopesRequest : public Request {
using Response = ScopesResponse;
// Retrieve the scopes for this stackframe.
// Retrieve the scopes for the stack frame identified by `frameId`. The
// `frameId` must have been obtained in the current suspended state. See
// 'Lifetime of Object References' in the Overview section for details.
integer frameId;
};
@ -1767,14 +1760,19 @@ struct SourceBreakpoint {
// The expression that controls how many hits of the breakpoint are ignored.
// The debug adapter is expected to interpret the expression as needed.
// The attribute is only honored by a debug adapter if the corresponding
// capability `supportsHitConditionalBreakpoints` is true.
// capability `supportsHitConditionalBreakpoints` is true. If both this
// property and `condition` are specified, `hitCondition` should be evaluated
// only if the `condition` is met, and the debug adapter should stop only if
// both conditions are met.
optional<string> hitCondition;
// The source line of the breakpoint or logpoint.
integer line;
// If this attribute exists and is non-empty, the debug adapter must not
// 'break' (stop) but log the message instead. Expressions within `{}` are
// interpolated. The attribute is only honored by a debug adapter if the
// corresponding capability `supportsLogPoints` is true.
// corresponding capability `supportsLogPoints` is true. If either
// `hitCondition` or `condition` is specified, then the message should only be
// logged if those conditions are met.
optional<string> logMessage;
};
@ -1953,9 +1951,10 @@ struct SetExpressionResponse : public Response {
optional<string> type;
// The new value of the expression.
string value;
// If `variablesReference` is > 0, the value is structured and its children
// can be retrieved by passing `variablesReference` to the `variables`
// request. The value should be less than or equal to 2147483647 (2^31-1).
// If `variablesReference` is > 0, the evaluate result is structured and its
// children can be retrieved by passing `variablesReference` to the
// `variables` request as long as execution remains suspended. See 'Lifetime
// of Object References' in the Overview section for details.
optional<integer> variablesReference;
};
@ -2088,8 +2087,8 @@ struct SetVariableResponse : public Response {
string value;
// If `variablesReference` is > 0, the new value is structured and its
// children can be retrieved by passing `variablesReference` to the
// `variables` request. The value should be less than or equal to 2147483647
// (2^31-1).
// `variables` request as long as execution remains suspended. See 'Lifetime
// of Object References' in the Overview section for details.
optional<integer> variablesReference;
};
@ -2108,7 +2107,9 @@ struct SetVariableRequest : public Request {
string name;
// The value of the variable.
string value;
// The reference of the variable container.
// The reference of the variable container. The `variablesReference` must have
// been obtained in the current suspended state. See 'Lifetime of Object
// References' in the Overview section for details.
integer variablesReference;
};
@ -2143,6 +2144,8 @@ struct StackFrame {
// Indicates whether this frame can be restarted with the `restart` request.
// Clients should only use this if the debug adapter supports the `restart`
// request and the corresponding capability `supportsRestartRequest` is true.
// If a debug adapter has this capability, then `canRestart` defaults to
// `true` if the property is absent.
optional<boolean> canRestart;
// Start position of the range covered by the stack frame. It is measured in
// UTF-16 code units and the client capability `columnsStartAt1` determines
@ -2591,8 +2594,9 @@ struct Variable {
// should be shown in the UI.
string value;
// If `variablesReference` is > 0, the variable is structured and its children
// can be retrieved by passing `variablesReference` to the `variables`
// request.
// can be retrieved by passing `variablesReference` to the `variables` request
// as long as execution remains suspended. See 'Lifetime of Object References'
// in the Overview section for details.
integer variablesReference;
};
@ -2626,7 +2630,9 @@ struct VariablesRequest : public Request {
optional<ValueFormat> format;
// The index of the first variable to return; if omitted children start at 0.
optional<integer> start;
// The Variable reference.
// The variable for which to retrieve its children. The `variablesReference`
// must have been obtained in the current suspended state. See 'Lifetime of
// Object References' in the Overview section for details.
integer variablesReference;
};

View File

@ -15,7 +15,7 @@
// Generated with protocol_gen.go -- do not edit this file.
// go run scripts/protocol_gen/protocol_gen.go
//
// DAP version 1.58.0
// DAP version 1.59.0
#include "dap/protocol.h"

View File

@ -15,7 +15,7 @@
// Generated with protocol_gen.go -- do not edit this file.
// go run scripts/protocol_gen/protocol_gen.go
//
// DAP version 1.58.0
// DAP version 1.59.0
#include "dap/protocol.h"
@ -54,6 +54,7 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(ContinueRequest,
DAP_IMPLEMENT_STRUCT_TYPEINFO(DataBreakpointInfoRequest,
"dataBreakpointInfo",
DAP_FIELD(frameId, "frameId"),
DAP_FIELD(name, "name"),
DAP_FIELD(variablesReference,
"variablesReference"));

View File

@ -15,7 +15,7 @@
// Generated with protocol_gen.go -- do not edit this file.
// go run scripts/protocol_gen/protocol_gen.go
//
// DAP version 1.58.0
// DAP version 1.59.0
#include "dap/protocol.h"

View File

@ -15,7 +15,7 @@
// Generated with protocol_gen.go -- do not edit this file.
// go run scripts/protocol_gen/protocol_gen.go
//
// DAP version 1.58.0
// DAP version 1.59.0
#include "dap/protocol.h"
@ -202,15 +202,6 @@ DAP_IMPLEMENT_STRUCT_TYPEINFO(Module,
DAP_FIELD(symbolStatus, "symbolStatus"),
DAP_FIELD(version, "version"));
DAP_IMPLEMENT_STRUCT_TYPEINFO(LaunchRequestArguments,
"",
DAP_FIELD(restart, "__restart"),
DAP_FIELD(noDebug, "noDebug"));
DAP_IMPLEMENT_STRUCT_TYPEINFO(AttachRequestArguments,
"",
DAP_FIELD(restart, "__restart"));
DAP_IMPLEMENT_STRUCT_TYPEINFO(Scope,
"",
DAP_FIELD(column, "column"),

View File

@ -487,8 +487,8 @@ func (r *root) getType(def *definition) (builtType cppType, err error) {
return ref.def.cppType, nil
}
// The DAP spec introduces ambiguities with its particular uses of OneOf, just set to object
if len(def.OneOf) != 0 {
args := make([]string, len(def.OneOf))
deps := make([]cppType, len(def.OneOf))
for i, oneOf := range def.OneOf {
if oneOf == nil {
@ -499,10 +499,9 @@ func (r *root) getType(def *definition) (builtType cppType, err error) {
return nil, err
}
deps[i] = elTy
args[i] = elTy.Name()
}
return &cppBasicType{
name: "variant<" + strings.Join(args, ", ") + ">",
name: "object",
desc: def.Description,
deps: deps,
}, nil
@ -681,11 +680,15 @@ func run() error {
return fmt.Errorf("Failed to load JSON file from '%v': %w", protocolURL, err)
}
hPath, cppPaths := outputPaths()
hPath, cppPaths, cMakeListsPath := outputPaths()
if err := emitFiles(&protocol, hPath, cppPaths, pkg.Version); err != nil {
return fmt.Errorf("Failed to emit files: %w", err)
}
if err := updateCMakePackageVersion(cMakeListsPath, pkg.Version); err != nil {
return fmt.Errorf("Failed to update CMakeLists.txt: %w", err)
}
if clangfmt, err := exec.LookPath("clang-format"); err == nil {
if out, err := exec.Command(clangfmt, "-i", hPath).CombinedOutput(); err != nil {
return fmt.Errorf("Failed to run clang-format on '%v':\n%v\n%w", hPath, string(out), err)
@ -702,6 +705,23 @@ func run() error {
return nil
}
// Updates package version in CMakeLists.txt to current
func updateCMakePackageVersion(cMakeListsPath string, version string) error {
text, err := os.ReadFile(cMakeListsPath)
if err != nil {
return err
}
lines := strings.Split(string(text), "\n")
for i, line := range lines {
if strings.Contains(line, "project(cppdap") {
lines[i] = "project(cppdap VERSION " + version + " LANGUAGES CXX C)"
break
}
}
output := strings.Join(lines, "\n")
return os.WriteFile(cMakeListsPath, []byte(output), 0644)
}
// emitFiles() opens each of the C++ files, generates the cppType definitions
// from the schema root, then writes the types to the C++ files in dependency
// order.
@ -790,8 +810,8 @@ func loadJSONFile(url string, obj interface{}) error {
return nil
}
// outputPaths() returns a path to the target C++ .h file and .cpp files
func outputPaths() (string, cppTargetFilePaths) {
// outputPaths() returns a path to the target C++ .h file and .cpp files, and the CMakeLists.txt
func outputPaths() (string, cppTargetFilePaths, string) {
_, thisFile, _, _ := runtime.Caller(1)
thisDir := path.Dir(thisFile)
h := path.Join(thisDir, "../../include/dap/protocol.h")
@ -801,5 +821,6 @@ func outputPaths() (string, cppTargetFilePaths) {
event: path.Join(thisDir, "../../src/protocol_events.cpp"),
types: path.Join(thisDir, "../../src/protocol_types.cpp"),
}
return h, cpp
CMakeLists := path.Join(thisDir, "../../CMakeLists.txt")
return h, cpp, CMakeLists
}