@@ -94,10 +94,10 @@ class LegacyRequestHandler : public BaseRequestHandler {
94
94
// / Base class for handling DAP requests. Handlers should declare their
95
95
// / arguments and response body types like:
96
96
// /
97
- // / class MyRequestHandler : public RequestHandler<Arguments, ResponseBody > {
97
+ // / class MyRequestHandler : public RequestHandler<Arguments, Response > {
98
98
// / ....
99
99
// / };
100
- template <typename Args, typename Body >
100
+ template <typename Args, typename Resp >
101
101
class RequestHandler : public BaseRequestHandler {
102
102
using BaseRequestHandler::BaseRequestHandler;
103
103
@@ -128,41 +128,29 @@ class RequestHandler : public BaseRequestHandler {
128
128
<< " ': " << llvm::toString (root.getError ()) << " \n " ;
129
129
root.printErrorContext (*request.arguments , OS);
130
130
131
- protocol::ErrorMessage error_message;
132
- error_message.format = parse_failure;
133
-
134
- protocol::ErrorResponseBody body;
135
- body.error = error_message;
136
-
137
131
response.success = false ;
138
- response.body = std::move (body );
132
+ response.body = ToResponse (llvm::make_error<DAPError>(parse_failure) );
139
133
140
134
dap.Send (response);
141
135
return ;
142
136
}
143
137
144
- llvm::Expected<Body> body = Run (arguments);
145
- if (auto Err = body.takeError ()) {
146
- protocol::ErrorMessage error_message;
147
- error_message.sendTelemetry = false ;
148
- if (llvm::Error unhandled = llvm::handleErrors (
149
- std::move (Err), [&](const DAPError &E) -> llvm::Error {
150
- error_message.format = E.getMessage ();
151
- error_message.showUser = E.getShowUser ();
152
- error_message.id = E.convertToErrorCode ().value ();
153
- error_message.url = E.getURL ();
154
- error_message.urlLabel = E.getURLLabel ();
155
- return llvm::Error::success ();
156
- }))
157
- error_message.format = llvm::toString (std::move (unhandled));
158
- protocol::ErrorResponseBody body;
159
- body.error = error_message;
160
- response.success = false ;
161
- response.body = std::move (body);
138
+ if constexpr (std::is_same_v<Resp, llvm::Error>) {
139
+ if (llvm::Error err = Run (arguments)) {
140
+ response.success = false ;
141
+ response.body = ToResponse (std::move (err));
142
+ } else {
143
+ response.success = true ;
144
+ }
162
145
} else {
163
- response.success = true ;
164
- if constexpr (!std::is_same_v<Body, std::monostate>)
146
+ Resp body = Run (arguments);
147
+ if (llvm::Error err = body.takeError ()) {
148
+ response.success = false ;
149
+ response.body = ToResponse (std::move (err));
150
+ } else {
151
+ response.success = true ;
165
152
response.body = std::move (*body);
153
+ }
166
154
}
167
155
168
156
// Mark the request as 'cancelled' if the debugger was interrupted while
@@ -177,7 +165,25 @@ class RequestHandler : public BaseRequestHandler {
177
165
dap.Send (response);
178
166
};
179
167
180
- virtual llvm::Expected<Body> Run (const Args &) const = 0;
168
+ virtual Resp Run (const Args &) const = 0;
169
+
170
+ protocol::ErrorResponseBody ToResponse (llvm::Error err) const {
171
+ protocol::ErrorMessage error_message;
172
+ error_message.sendTelemetry = false ;
173
+ if (llvm::Error unhandled = llvm::handleErrors (
174
+ std::move (err), [&](const DAPError &E) -> llvm::Error {
175
+ error_message.format = E.getMessage ();
176
+ error_message.showUser = E.getShowUser ();
177
+ error_message.id = E.convertToErrorCode ().value ();
178
+ error_message.url = E.getURL ();
179
+ error_message.urlLabel = E.getURLLabel ();
180
+ return llvm::Error::success ();
181
+ }))
182
+ error_message.format = llvm::toString (std::move (unhandled));
183
+ protocol::ErrorResponseBody body;
184
+ body.error = error_message;
185
+ return body;
186
+ }
181
187
};
182
188
183
189
class AttachRequestHandler : public LegacyRequestHandler {
@@ -233,7 +239,7 @@ class DisconnectRequestHandler
233
239
FeatureSet GetSupportedFeatures () const override {
234
240
return {protocol::eAdapterFeatureTerminateDebuggee};
235
241
}
236
- llvm::Expected<protocol::DisconnectResponse>
242
+ llvm::Error
237
243
Run (const std::optional<protocol::DisconnectArguments> &args) const override ;
238
244
};
239
245
@@ -259,7 +265,7 @@ class ExceptionInfoRequestHandler : public LegacyRequestHandler {
259
265
260
266
class InitializeRequestHandler
261
267
: public RequestHandler<protocol::InitializeRequestArguments,
262
- protocol::InitializeResponseBody> {
268
+ llvm::Expected< protocol::InitializeResponseBody> > {
263
269
public:
264
270
using RequestHandler::RequestHandler;
265
271
static llvm::StringLiteral GetCommand () { return " initialize" ; }
@@ -284,11 +290,12 @@ class RestartRequestHandler : public LegacyRequestHandler {
284
290
void operator ()(const llvm::json::Object &request) const override ;
285
291
};
286
292
287
- class NextRequestHandler : public LegacyRequestHandler {
293
+ class NextRequestHandler
294
+ : public RequestHandler<protocol::NextArguments, protocol::NextResponse> {
288
295
public:
289
- using LegacyRequestHandler::LegacyRequestHandler ;
296
+ using RequestHandler::RequestHandler ;
290
297
static llvm::StringLiteral GetCommand () { return " next" ; }
291
- void operator ()( const llvm::json::Object &request ) const override ;
298
+ llvm::Error Run ( const protocol::NextArguments &args ) const override ;
292
299
};
293
300
294
301
class StepInRequestHandler : public LegacyRequestHandler {
@@ -418,7 +425,7 @@ class SetVariableRequestHandler : public LegacyRequestHandler {
418
425
419
426
class SourceRequestHandler
420
427
: public RequestHandler<protocol::SourceArguments,
421
- protocol::SourceResponseBody> {
428
+ llvm::Expected< protocol::SourceResponseBody> > {
422
429
public:
423
430
using RequestHandler::RequestHandler;
424
431
static llvm::StringLiteral GetCommand () { return " source" ; }
@@ -486,8 +493,7 @@ class CancelRequestHandler
486
493
FeatureSet GetSupportedFeatures () const override {
487
494
return {protocol::eAdapterFeatureCancelRequest};
488
495
}
489
- llvm::Expected<protocol::CancelResponseBody>
490
- Run (const protocol::CancelArguments &args) const override ;
496
+ llvm::Error Run (const protocol::CancelArguments &args) const override ;
491
497
};
492
498
493
499
// / A request used in testing to get the details on all breakpoints that are
0 commit comments