Skip to content

[lldb][lldb-dap] Return optional from json utils #129919

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Mar 14, 2025

Conversation

da-viper
Copy link
Contributor

@da-viper da-viper commented Mar 5, 2025

Completion of #129818

Did not want to put llvm::StringRef() as the default value instead it was ""

@llvmbot
Copy link
Member

llvmbot commented Mar 5, 2025

@llvm/pr-subscribers-lldb

Author: None (Da-Viper)

Changes

Completion of #129818

Did not want to put llvm::StringRef() as the default value instead it was ""


Patch is 34.46 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/129919.diff

25 Files Affected:

  • (modified) lldb/tools/lldb-dap/BreakpointBase.cpp (+2-2)
  • (modified) lldb/tools/lldb-dap/DAP.cpp (+12-9)
  • (modified) lldb/tools/lldb-dap/FunctionBreakpoint.cpp (+2-1)
  • (modified) lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp (+12-9)
  • (modified) lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp (+8-6)
  • (modified) lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp (+2-1)
  • (modified) lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp (+4-3)
  • (modified) lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp (+2-2)
  • (modified) lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp (+5-3)
  • (modified) lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp (+3-2)
  • (modified) lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp (+6-4)
  • (modified) lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp (+2-1)
  • (modified) lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp (+4-3)
  • (modified) lldb/tools/lldb-dap/Handler/RequestHandler.cpp (+4-3)
  • (modified) lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp (+1-1)
  • (modified) lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp (+4-4)
  • (modified) lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp (+3-2)
  • (modified) lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp (+2-2)
  • (modified) lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp (+1-1)
  • (modified) lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp (+3-3)
  • (modified) lldb/tools/lldb-dap/InstructionBreakpoint.cpp (+2-1)
  • (modified) lldb/tools/lldb-dap/JSONUtils.cpp (+30-31)
  • (modified) lldb/tools/lldb-dap/JSONUtils.h (+16-19)
  • (modified) lldb/tools/lldb-dap/SourceBreakpoint.cpp (+3-3)
  • (modified) lldb/tools/lldb-dap/Watchpoint.cpp (+2-2)
diff --git a/lldb/tools/lldb-dap/BreakpointBase.cpp b/lldb/tools/lldb-dap/BreakpointBase.cpp
index 1e28c29082a9f..7979bac098766 100644
--- a/lldb/tools/lldb-dap/BreakpointBase.cpp
+++ b/lldb/tools/lldb-dap/BreakpointBase.cpp
@@ -13,8 +13,8 @@
 using namespace lldb_dap;
 
 BreakpointBase::BreakpointBase(DAP &d, const llvm::json::Object &obj)
-    : dap(d), condition(std::string(GetString(obj, "condition"))),
-      hitCondition(std::string(GetString(obj, "hitCondition"))) {}
+    : dap(d), condition(std::string(GetString(obj, "condition").value_or(""))),
+      hitCondition(std::string(GetString(obj, "hitCondition").value_or(""))) {}
 
 void BreakpointBase::UpdateBreakpoint(const BreakpointBase &request_bp) {
   if (condition != request_bp.condition) {
diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index c4790414f64f9..435cd0f188d75 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -526,12 +526,13 @@ ExceptionBreakpoint *DAP::GetExceptionBPFromStopReason(lldb::SBThread &thread) {
 }
 
 lldb::SBThread DAP::GetLLDBThread(const llvm::json::Object &arguments) {
-  auto tid = GetSigned(arguments, "threadId", LLDB_INVALID_THREAD_ID);
+  auto tid = GetSigned(arguments, "threadId").value_or(LLDB_INVALID_THREAD_ID);
   return target.GetProcess().GetThreadByID(tid);
 }
 
 lldb::SBFrame DAP::GetLLDBFrame(const llvm::json::Object &arguments) {
-  const uint64_t frame_id = GetUnsigned(arguments, "frameId", UINT64_MAX);
+  const uint64_t frame_id =
+      GetUnsigned(arguments, "frameId").value_or(UINT64_MAX);
   lldb::SBProcess process = target.GetProcess();
   // Upper 32 bits is the thread index ID
   lldb::SBThread thread =
@@ -688,9 +689,11 @@ DAP::CreateTargetFromArguments(const llvm::json::Object &arguments,
   // enough information to determine correct arch and platform (or ELF can be
   // omitted at all), so it is good to leave the user an apportunity to specify
   // those. Any of those three can be left empty.
-  llvm::StringRef target_triple = GetString(arguments, "targetTriple");
-  llvm::StringRef platform_name = GetString(arguments, "platformName");
-  llvm::StringRef program = GetString(arguments, "program");
+  const llvm::StringRef target_triple =
+      GetString(arguments, "targetTriple").value_or("");
+  const llvm::StringRef platform_name =
+      GetString(arguments, "platformName").value_or("");
+  const llvm::StringRef program = GetString(arguments, "program").value_or("");
   auto target = this->debugger.CreateTarget(
       program.data(), target_triple.data(), platform_name.data(),
       true, // Add dependent modules.
@@ -754,9 +757,9 @@ PacketStatus DAP::GetNextObject(llvm::json::Object &object) {
 }
 
 bool DAP::HandleObject(const llvm::json::Object &object) {
-  const auto packet_type = GetString(object, "type");
+  const auto packet_type = GetString(object, "type").value_or("");
   if (packet_type == "request") {
-    const auto command = GetString(object, "command");
+    const auto command = GetString(object, "command").value_or("");
 
     auto new_handler_pos = request_handlers.find(command);
     if (new_handler_pos != request_handlers.end()) {
@@ -771,7 +774,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) {
   }
 
   if (packet_type == "response") {
-    auto id = GetSigned(object, "request_seq", 0);
+    auto id = GetSigned(object, "request_seq").value_or(0);
 
     std::unique_ptr<ResponseHandler> response_handler;
     {
@@ -794,7 +797,7 @@ bool DAP::HandleObject(const llvm::json::Object &object) {
       }
       (*response_handler)(Result);
     } else {
-      llvm::StringRef message = GetString(object, "message");
+      llvm::StringRef message = GetString(object, "message").value_or("");
       if (message.empty()) {
         message = "Unknown error, response failed";
       }
diff --git a/lldb/tools/lldb-dap/FunctionBreakpoint.cpp b/lldb/tools/lldb-dap/FunctionBreakpoint.cpp
index f266d751833c7..cafae32b662f2 100644
--- a/lldb/tools/lldb-dap/FunctionBreakpoint.cpp
+++ b/lldb/tools/lldb-dap/FunctionBreakpoint.cpp
@@ -13,7 +13,8 @@
 namespace lldb_dap {
 
 FunctionBreakpoint::FunctionBreakpoint(DAP &d, const llvm::json::Object &obj)
-    : Breakpoint(d, obj), functionName(std::string(GetString(obj, "name"))) {}
+    : Breakpoint(d, obj),
+      functionName(std::string(GetString(obj, "name").value_or(""))) {}
 
 void FunctionBreakpoint::SetBreakpoint() {
   if (functionName.empty())
diff --git a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
index 2733f58b74683..5d45dc4fe0b34 100644
--- a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
@@ -54,11 +54,11 @@ void AttachRequestHandler::operator()(const llvm::json::Object &request) const {
   const int invalid_port = 0;
   const auto *arguments = request.getObject("arguments");
   const lldb::pid_t pid =
-      GetUnsigned(arguments, "pid", LLDB_INVALID_PROCESS_ID);
+      GetUnsigned(arguments, "pid").value_or(LLDB_INVALID_PROCESS_ID);
   const auto gdb_remote_port =
-      GetUnsigned(arguments, "gdb-remote-port", invalid_port);
+      GetUnsigned(arguments, "gdb-remote-port").value_or(invalid_port);
   const auto gdb_remote_hostname =
-      GetString(arguments, "gdb-remote-hostname", "localhost");
+      GetString(arguments, "gdb-remote-hostname").value_or("localhost");
   if (pid != LLDB_INVALID_PROCESS_ID)
     attach_info.SetProcessID(pid);
   const auto wait_for = GetBoolean(arguments, "waitFor").value_or(false);
@@ -69,22 +69,25 @@ void AttachRequestHandler::operator()(const llvm::json::Object &request) const {
   dap.exit_commands = GetStrings(arguments, "exitCommands");
   dap.terminate_commands = GetStrings(arguments, "terminateCommands");
   auto attachCommands = GetStrings(arguments, "attachCommands");
-  llvm::StringRef core_file = GetString(arguments, "coreFile");
-  const uint64_t timeout_seconds = GetUnsigned(arguments, "timeout", 30);
+  llvm::StringRef core_file = GetString(arguments, "coreFile").value_or("");
+  const uint64_t timeout_seconds =
+      GetUnsigned(arguments, "timeout").value_or(30);
   dap.stop_at_entry = core_file.empty()
                           ? GetBoolean(arguments, "stopOnEntry").value_or(false)
                           : true;
   dap.post_run_commands = GetStrings(arguments, "postRunCommands");
-  const llvm::StringRef debuggerRoot = GetString(arguments, "debuggerRoot");
+  const llvm::StringRef debuggerRoot =
+      GetString(arguments, "debuggerRoot").value_or("");
   dap.enable_auto_variable_summaries =
       GetBoolean(arguments, "enableAutoVariableSummaries").value_or(false);
   dap.enable_synthetic_child_debugging =
       GetBoolean(arguments, "enableSyntheticChildDebugging").value_or(false);
   dap.display_extended_backtrace =
       GetBoolean(arguments, "displayExtendedBacktrace").value_or(false);
-  dap.command_escape_prefix = GetString(arguments, "commandEscapePrefix", "`");
-  dap.SetFrameFormat(GetString(arguments, "customFrameFormat"));
-  dap.SetThreadFormat(GetString(arguments, "customThreadFormat"));
+  dap.command_escape_prefix =
+      GetString(arguments, "commandEscapePrefix").value_or("`");
+  dap.SetFrameFormat(GetString(arguments, "customFrameFormat").value_or(""));
+  dap.SetThreadFormat(GetString(arguments, "customThreadFormat").value_or(""));
 
   PrintWelcomeMessage();
 
diff --git a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
index 1b5c8ba307dcb..66195fd5fb5bd 100644
--- a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
@@ -130,12 +130,14 @@ void BreakpointLocationsRequestHandler::operator()(
   FillResponse(request, response);
   auto *arguments = request.getObject("arguments");
   auto *source = arguments->getObject("source");
-  std::string path = GetString(source, "path").str();
-  uint64_t start_line = GetUnsigned(arguments, "line", 0);
-  uint64_t start_column = GetUnsigned(arguments, "column", 0);
-  uint64_t end_line = GetUnsigned(arguments, "endLine", start_line);
-  uint64_t end_column =
-      GetUnsigned(arguments, "endColumn", std::numeric_limits<uint64_t>::max());
+  std::string path = GetString(source, "path").value_or("").str();
+  const uint64_t start_line = GetUnsigned(arguments, "line").value_or(0);
+  const uint64_t start_column = GetUnsigned(arguments, "column").value_or(0);
+  const uint64_t end_line =
+      GetUnsigned(arguments, "endLine").value_or(start_line);
+  const uint64_t end_column =
+      GetUnsigned(arguments, "endColumn")
+          .value_or(std::numeric_limits<uint64_t>::max());
 
   lldb::SBFileSpec file_spec(path.c_str(), true);
   lldb::SBSymbolContextList compile_units =
diff --git a/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp
index 51ae44a0def9d..cd937116f7380 100644
--- a/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/CompileUnitsRequestHandler.cpp
@@ -60,7 +60,8 @@ void CompileUnitsRequestHandler::operator()(
   llvm::json::Object body;
   llvm::json::Array units;
   const auto *arguments = request.getObject("arguments");
-  std::string module_id = std::string(GetString(arguments, "moduleId"));
+  const std::string module_id =
+      GetString(arguments, "moduleId").value_or("").str();
   int num_modules = dap.target.GetNumModules();
   for (int i = 0; i < num_modules; i++) {
     auto curr_module = dap.target.GetModuleAtIndex(i);
diff --git a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
index 09b73054ca62f..96d573c48513c 100644
--- a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
@@ -142,9 +142,10 @@ void CompletionsRequestHandler::operator()(
     frame.GetThread().SetSelectedFrame(frame.GetFrameID());
   }
 
-  std::string text = GetString(arguments, "text").str();
-  auto original_column = GetSigned(arguments, "column", text.size());
-  auto original_line = GetSigned(arguments, "line", 1);
+  std::string text = GetString(arguments, "text").value_or("").str();
+  const auto original_column =
+      GetSigned(arguments, "column").value_or(text.size());
+  const auto original_line = GetSigned(arguments, "line").value_or(1);
   auto offset = original_column - 1;
   if (original_line > 1) {
     llvm::SmallVector<::llvm::StringRef, 2> lines;
diff --git a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
index 64829b93c783d..2926ede0c3f7a 100644
--- a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
@@ -116,8 +116,8 @@ void DataBreakpointInfoRequestHandler::operator()(
   llvm::json::Array accessTypes{"read", "write", "readWrite"};
   const auto *arguments = request.getObject("arguments");
   const auto variablesReference =
-      GetUnsigned(arguments, "variablesReference", 0);
-  llvm::StringRef name = GetString(arguments, "name");
+      GetUnsigned(arguments, "variablesReference").value_or(0);
+  const llvm::StringRef name = GetString(arguments, "name").value_or("");
   lldb::SBFrame frame = dap.GetLLDBFrame(*arguments);
   lldb::SBValue variable = dap.variables.FindVariable(variablesReference, name);
   std::string addr, size;
diff --git a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
index d6ff2a7fd8880..f401b52d2c5dd 100644
--- a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
@@ -93,7 +93,8 @@ void DisassembleRequestHandler::operator()(
   FillResponse(request, response);
   auto *arguments = request.getObject("arguments");
 
-  llvm::StringRef memoryReference = GetString(arguments, "memoryReference");
+  llvm::StringRef memoryReference =
+      GetString(arguments, "memoryReference").value_or("");
   auto addr_opt = DecodeMemoryReference(memoryReference);
   if (!addr_opt.has_value()) {
     response["success"] = false;
@@ -104,7 +105,7 @@ void DisassembleRequestHandler::operator()(
   }
   lldb::addr_t addr_ptr = *addr_opt;
 
-  addr_ptr += GetSigned(arguments, "instructionOffset", 0);
+  addr_ptr += GetSigned(arguments, "instructionOffset").value_or(0);
   lldb::SBAddress addr(addr_ptr, dap.target);
   if (!addr.IsValid()) {
     response["success"] = false;
@@ -113,7 +114,8 @@ void DisassembleRequestHandler::operator()(
     return;
   }
 
-  const auto inst_count = GetUnsigned(arguments, "instructionCount", 0);
+  const auto inst_count =
+      GetUnsigned(arguments, "instructionCount").value_or(0);
   lldb::SBInstructionList insts = dap.target.ReadInstructions(addr, inst_count);
 
   if (!insts.IsValid()) {
diff --git a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
index 36a9d9bff5db9..e9f08a1017abc 100644
--- a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp
@@ -145,8 +145,9 @@ void EvaluateRequestHandler::operator()(
   llvm::json::Object body;
   const auto *arguments = request.getObject("arguments");
   lldb::SBFrame frame = dap.GetLLDBFrame(*arguments);
-  std::string expression = GetString(arguments, "expression").str();
-  llvm::StringRef context = GetString(arguments, "context");
+  std::string expression =
+      GetString(arguments, "expression").value_or("").str();
+  const llvm::StringRef context = GetString(arguments, "context").value_or("");
   bool repeat_last_command =
       expression.empty() && dap.last_nonempty_var_expression.empty();
 
diff --git a/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp
index 9fa1ddd4e848c..f64c186376a36 100644
--- a/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/LaunchRequestHandler.cpp
@@ -61,16 +61,18 @@ void LaunchRequestHandler::operator()(const llvm::json::Object &request) const {
   dap.terminate_commands = GetStrings(arguments, "terminateCommands");
   dap.post_run_commands = GetStrings(arguments, "postRunCommands");
   dap.stop_at_entry = GetBoolean(arguments, "stopOnEntry").value_or(false);
-  const llvm::StringRef debuggerRoot = GetString(arguments, "debuggerRoot");
+  const llvm::StringRef debuggerRoot =
+      GetString(arguments, "debuggerRoot").value_or("");
   dap.enable_auto_variable_summaries =
       GetBoolean(arguments, "enableAutoVariableSummaries").value_or(false);
   dap.enable_synthetic_child_debugging =
       GetBoolean(arguments, "enableSyntheticChildDebugging").value_or(false);
   dap.display_extended_backtrace =
       GetBoolean(arguments, "displayExtendedBacktrace").value_or(false);
-  dap.command_escape_prefix = GetString(arguments, "commandEscapePrefix", "`");
-  dap.SetFrameFormat(GetString(arguments, "customFrameFormat"));
-  dap.SetThreadFormat(GetString(arguments, "customThreadFormat"));
+  dap.command_escape_prefix =
+      GetString(arguments, "commandEscapePrefix").value_or("`");
+  dap.SetFrameFormat(GetString(arguments, "customFrameFormat").value_or(""));
+  dap.SetThreadFormat(GetString(arguments, "customThreadFormat").value_or(""));
 
   PrintWelcomeMessage();
 
diff --git a/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
index fa763f3ffe931..3a2fecf350b9b 100644
--- a/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/LocationsRequestHandler.cpp
@@ -97,7 +97,8 @@ void LocationsRequestHandler::operator()(
   FillResponse(request, response);
   auto *arguments = request.getObject("arguments");
 
-  uint64_t location_id = GetUnsigned(arguments, "locationReference", 0);
+  uint64_t location_id =
+      GetUnsigned(arguments, "locationReference").value_or(0);
   // We use the lowest bit to distinguish between value location and declaration
   // location
   auto [var_ref, is_value_location] = UnpackLocation(location_id);
diff --git a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
index bc8158f9d3079..590bcd69912f5 100644
--- a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
@@ -98,7 +98,8 @@ void ReadMemoryRequestHandler::operator()(
   FillResponse(request, response);
   auto *arguments = request.getObject("arguments");
 
-  llvm::StringRef memoryReference = GetString(arguments, "memoryReference");
+  llvm::StringRef memoryReference =
+      GetString(arguments, "memoryReference").value_or("");
   auto addr_opt = DecodeMemoryReference(memoryReference);
   if (!addr_opt.has_value()) {
     response["success"] = false;
@@ -108,8 +109,8 @@ void ReadMemoryRequestHandler::operator()(
     return;
   }
   lldb::addr_t addr_int = *addr_opt;
-  addr_int += GetSigned(arguments, "offset", 0);
-  const uint64_t count_requested = GetUnsigned(arguments, "count", 0);
+  addr_int += GetSigned(arguments, "offset").value_or(0);
+  const uint64_t count_requested = GetUnsigned(arguments, "count").value_or(0);
 
   // We also need support reading 0 bytes
   // VS Code sends those requests to check if a `memoryReference`
diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
index d4030965869a1..c1450ce2fc687 100644
--- a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
@@ -42,7 +42,7 @@ void RequestHandler::SetSourceMapFromArguments(
   std::string sourceMapCommand;
   llvm::raw_string_ostream strm(sourceMapCommand);
   strm << "settings set target.source-map ";
-  const auto sourcePath = GetString(arguments, "sourcePath");
+  const auto sourcePath = GetString(arguments, "sourcePath").value_or("");
 
   // sourceMap is the new, more general form of sourcePath and overrides it.
   constexpr llvm::StringRef sourceMapKey = "sourceMap";
@@ -157,7 +157,7 @@ RequestHandler::LaunchProcess(const llvm::json::Object &request) const {
 
   // Grab the current working directory if there is one and set it in the
   // launch info.
-  const auto cwd = GetString(arguments, "cwd");
+  const auto cwd = GetString(arguments, "cwd").value_or("");
   if (!cwd.empty())
     launch_info.SetWorkingDirectory(cwd.data());
 
@@ -184,7 +184,8 @@ RequestHandler::LaunchProcess(const llvm::json::Object &request) const {
   launch_info.SetDetachOnError(detachOnError);
   launch_info.SetLaunchFlags(flags | lldb::eLaunchFlagDebug |
                              lldb::eLaunchFlagStopAtEntry);
-  const uint64_t timeout_seconds = GetUnsigned(arguments, "timeout", 30);
+  const uint64_t timeout_seconds =
+      GetUnsigned(arguments, "timeout").value_or(30);
 
   if (GetBoolean(arguments, "runInTerminal").value_or(false)) {
     if (llvm::Error err = RunInTerminal(dap, request, timeout_seconds))
diff --git a/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp
index 413db38733ffa..5ca2c9c01965e 100644
--- a/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SetBreakpointsRequestHandler.cpp
@@ -130,7 +130,7 @@ void SetBreakpointsRequestHandler::operator()(
   FillResponse(request, response);
   const auto *arguments = request.getObject("arguments");
   const auto *source = arguments->getObject("source");
-  const auto path = GetString(source, "path");
+  const auto path = GetString(source, "path").value_or("");
   const auto *breakpoints = arguments->getArray("breakpoints");
   llvm::json::Array response_breakpoints;
 
diff --git a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
index 3a271bc1a1db5..6274100446dcc 100644
--- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
@@ -115,10 +115,10 @@ void SetVariableRequestHandler::operator()(
   const auto *arguments = request.getObject("arguments");
   // This is a reference to the con...
[truncated]

@DavidSpickett DavidSpickett changed the title Return optional from json utils [lldb][lldb-dap]Return optional from json utils Mar 6, 2025
@DavidSpickett DavidSpickett changed the title [lldb][lldb-dap]Return optional from json utils [lldb][lldb-dap] Return optional from json utils Mar 6, 2025
@DavidSpickett
Copy link
Collaborator

I read through this and all the usages look correct. I suppose there are some places that could use the optional without doing value_or, but changing those now would complicate the patch.

I'll leave it to @JDevlieghere to review fully since they did the previous part.

@JDevlieghere
Copy link
Member

The two commits that change GetSigned and GetUnsigned are no longer necessary after #129823. The commit that updates GetString looks fine.

Thinking out loud: I see a handful of cases where we can check the optional (like should we pass "--launch-target" if there's no value). On the other hand, I think in the majority of cases, we don't really care about the value being empty or not set, but the new API is strictly more powerful. If we wanted to streamline the latter, we could have an overload with the empty string as the default value. If someone wants to specify anything else, they should use the value_or API.

@da-viper da-viper force-pushed the return-optional-from-json-utils branch from 9094e74 to 7d97648 Compare March 7, 2025 13:47
@@ -13,8 +13,8 @@
using namespace lldb_dap;

BreakpointBase::BreakpointBase(DAP &d, const llvm::json::Object &obj)
: dap(d), condition(std::string(GetString(obj, "condition"))),
hitCondition(std::string(GetString(obj, "hitCondition"))) {}
: dap(d), condition(std::string(GetString(obj, "condition").value_or(""))),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that instead of "" you should use {}, which would create an empty StringRef without an actual string being backed by it. That is closer to the original source code.
I don't think why "" would break with your patch, but if there's a place that does GetString().GetData() == nullptr, then there would be some divergence. So I'd rather play safe.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I did try that before, but I doesn't work because at the position the compiler sees it as an initializer list. and llvm::StringRef does not have an initializer-list constructor.

in the previous fuction
GetString(..... llvm::StringRef default_value = { } ) here it is treated as llvm::StringRef{} and can infer it.

Copy link
Member

@walter-erquinigo walter-erquinigo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

all good then!

@JDevlieghere JDevlieghere merged commit 217fc65 into llvm:main Mar 14, 2025
10 checks passed
@da-viper da-viper deleted the return-optional-from-json-utils branch March 16, 2025 03:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants