@@ -94,10 +94,10 @@ class LegacyRequestHandler : public BaseRequestHandler {
9494// / Base class for handling DAP requests. Handlers should declare their
9595// / arguments and response body types like:
9696// /
97- // / class MyRequestHandler : public RequestHandler<Arguments, ResponseBody > {
97+ // / class MyRequestHandler : public RequestHandler<Arguments, Response > {
9898// / ....
9999// / };
100- template <typename Args, typename Body >
100+ template <typename Args, typename Resp >
101101class RequestHandler : public BaseRequestHandler {
102102 using BaseRequestHandler::BaseRequestHandler;
103103
@@ -128,41 +128,29 @@ class RequestHandler : public BaseRequestHandler {
128128 << " ': " << llvm::toString (root.getError ()) << " \n " ;
129129 root.printErrorContext (*request.arguments , OS);
130130
131- protocol::ErrorMessage error_message;
132- error_message.format = parse_failure;
133-
134- protocol::ErrorResponseBody body;
135- body.error = error_message;
136-
137131 response.success = false ;
138- response.body = std::move (body );
132+ response.body = ToResponse (llvm::make_error<DAPError>(parse_failure) );
139133
140134 dap.Send (response);
141135 return ;
142136 }
143137
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+ }
162145 } 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 ;
165152 response.body = std::move (*body);
153+ }
166154 }
167155
168156 // Mark the request as 'cancelled' if the debugger was interrupted while
@@ -177,7 +165,25 @@ class RequestHandler : public BaseRequestHandler {
177165 dap.Send (response);
178166 };
179167
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+ }
181187};
182188
183189class AttachRequestHandler : public LegacyRequestHandler {
@@ -233,7 +239,7 @@ class DisconnectRequestHandler
233239 FeatureSet GetSupportedFeatures () const override {
234240 return {protocol::eAdapterFeatureTerminateDebuggee};
235241 }
236- llvm::Expected<protocol::DisconnectResponse>
242+ llvm::Error
237243 Run (const std::optional<protocol::DisconnectArguments> &args) const override ;
238244};
239245
@@ -259,7 +265,7 @@ class ExceptionInfoRequestHandler : public LegacyRequestHandler {
259265
260266class InitializeRequestHandler
261267 : public RequestHandler<protocol::InitializeRequestArguments,
262- protocol::InitializeResponseBody> {
268+ llvm::Expected< protocol::InitializeResponseBody> > {
263269public:
264270 using RequestHandler::RequestHandler;
265271 static llvm::StringLiteral GetCommand () { return " initialize" ; }
@@ -284,11 +290,12 @@ class RestartRequestHandler : public LegacyRequestHandler {
284290 void operator ()(const llvm::json::Object &request) const override ;
285291};
286292
287- class NextRequestHandler : public LegacyRequestHandler {
293+ class NextRequestHandler
294+ : public RequestHandler<protocol::NextArguments, protocol::NextResponse> {
288295public:
289- using LegacyRequestHandler::LegacyRequestHandler ;
296+ using RequestHandler::RequestHandler ;
290297 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 ;
292299};
293300
294301class StepInRequestHandler : public LegacyRequestHandler {
@@ -418,7 +425,7 @@ class SetVariableRequestHandler : public LegacyRequestHandler {
418425
419426class SourceRequestHandler
420427 : public RequestHandler<protocol::SourceArguments,
421- protocol::SourceResponseBody> {
428+ llvm::Expected< protocol::SourceResponseBody> > {
422429public:
423430 using RequestHandler::RequestHandler;
424431 static llvm::StringLiteral GetCommand () { return " source" ; }
@@ -486,8 +493,7 @@ class CancelRequestHandler
486493 FeatureSet GetSupportedFeatures () const override {
487494 return {protocol::eAdapterFeatureCancelRequest};
488495 }
489- llvm::Expected<protocol::CancelResponseBody>
490- Run (const protocol::CancelArguments &args) const override ;
496+ llvm::Error Run (const protocol::CancelArguments &args) const override ;
491497};
492498
493499// / A request used in testing to get the details on all breakpoints that are
0 commit comments