================
@@ -18,167 +19,64 @@
 
 namespace lldb_dap {
 
-// "LocationsRequest": {
-//   "allOf": [ { "$ref": "#/definitions/Request" }, {
-//     "type": "object",
-//     "description": "Looks up information about a location reference
-//                     previously returned by the debug adapter.",
-//     "properties": {
-//       "command": {
-//         "type": "string",
-//         "enum": [ "locations" ]
-//       },
-//       "arguments": {
-//         "$ref": "#/definitions/LocationsArguments"
-//       }
-//     },
-//     "required": [ "command", "arguments" ]
-//   }]
-// },
-// "LocationsArguments": {
-//   "type": "object",
-//   "description": "Arguments for `locations` request.",
-//   "properties": {
-//     "locationReference": {
-//       "type": "integer",
-//       "description": "Location reference to resolve."
-//     }
-//   },
-//   "required": [ "locationReference" ]
-// },
-// "LocationsResponse": {
-//   "allOf": [ { "$ref": "#/definitions/Response" }, {
-//     "type": "object",
-//     "description": "Response to `locations` request.",
-//     "properties": {
-//       "body": {
-//         "type": "object",
-//         "properties": {
-//           "source": {
-//             "$ref": "#/definitions/Source",
-//             "description": "The source containing the location; either
-//                             `source.path` or `source.sourceReference` must 
be
-//                             specified."
-//           },
-//           "line": {
-//             "type": "integer",
-//             "description": "The line number of the location. The client
-//                             capability `linesStartAt1` determines whether it
-//                             is 0- or 1-based."
-//           },
-//           "column": {
-//             "type": "integer",
-//             "description": "Position of the location within the `line`. It 
is
-//                             measured in UTF-16 code units and the client
-//                             capability `columnsStartAt1` determines whether
-//                             it is 0- or 1-based. If no column is given, the
-//                             first position in the start line is assumed."
-//           },
-//           "endLine": {
-//             "type": "integer",
-//             "description": "End line of the location, present if the 
location
-//                             refers to a range.  The client capability
-//                             `linesStartAt1` determines whether it is 0- or
-//                             1-based."
-//           },
-//           "endColumn": {
-//             "type": "integer",
-//             "description": "End position of the location within `endLine`,
-//                             present if the location refers to a range. It is
-//                             measured in UTF-16 code units and the client
-//                             capability `columnsStartAt1` determines whether
-//                             it is 0- or 1-based."
-//           }
-//         },
-//         "required": [ "source", "line" ]
-//       }
-//     }
-//   }]
-// },
-void LocationsRequestHandler::operator()(
-    const llvm::json::Object &request) const {
-  llvm::json::Object response;
-  FillResponse(request, response);
-  auto *arguments = request.getObject("arguments");
-
-  const auto location_id =
-      GetInteger<uint64_t>(arguments, "locationReference").value_or(0);
+// Looks up information about a location reference previously returned by the
+// debug adapter.
+llvm::Expected<protocol::LocationsResponseBody>
+LocationsRequestHandler::Run(const protocol::LocationsArguments &args) const {
+  protocol::LocationsResponseBody response;
   // We use the lowest bit to distinguish between value location and 
declaration
   // location
-  auto [var_ref, is_value_location] = UnpackLocation(location_id);
+  auto [var_ref, is_value_location] = UnpackLocation(args.locationReference);
   lldb::SBValue variable = dap.variables.GetVariable(var_ref);
-  if (!variable.IsValid()) {
-    response["success"] = false;
-    response["message"] = "Invalid variable reference";
-    dap.SendJSON(llvm::json::Value(std::move(response)));
-    return;
-  }
+  if (!variable.IsValid())
+    return llvm::make_error<DAPError>("Invalid variable reference");
 
-  llvm::json::Object body;
   if (is_value_location) {
     // Get the value location
     if (!variable.GetType().IsPointerType() &&
-        !variable.GetType().IsReferenceType()) {
-      response["success"] = false;
-      response["message"] =
-          "Value locations are only available for pointers and references";
-      dap.SendJSON(llvm::json::Value(std::move(response)));
-      return;
-    }
+        !variable.GetType().IsReferenceType())
+      return llvm::make_error<DAPError>(
+          "Value locations are only available for pointers and references");
 
     lldb::addr_t raw_addr = variable.GetValueAsAddress();
     lldb::SBAddress addr = dap.target.ResolveLoadAddress(raw_addr);
     lldb::SBLineEntry line_entry = GetLineEntryForAddress(dap.target, addr);
 
-    if (!line_entry.IsValid()) {
-      response["success"] = false;
-      response["message"] = "Failed to resolve line entry for location";
-      dap.SendJSON(llvm::json::Value(std::move(response)));
-      return;
-    }
+    if (!line_entry.IsValid())
+      return llvm::make_error<DAPError>(
+          "Failed to resolve line entry for location");
 
     const std::optional<protocol::Source> source =
         CreateSource(line_entry.GetFileSpec());
-    if (!source) {
-      response["success"] = false;
-      response["message"] = "Failed to resolve file path for location";
-      dap.SendJSON(llvm::json::Value(std::move(response)));
-      return;
-    }
+    if (!source)
+      return llvm::make_error<DAPError>(
+          "Failed to resolve file path for location");
 
-    body.try_emplace("source", *source);
+    response.source = std::move(*source);
     if (int line = line_entry.GetLine())
----------------
da-viper wrote:

no need for the checks for `GetLine` and `GetColumn` as we will be checking it 
in the `toJSON` 

https://github.com/llvm/llvm-project/pull/171099
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to