https://github.com/Da-Viper created 
https://github.com/llvm/llvm-project/pull/129919

Completion of #129818 

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

>From 14bd9a79299f2637dc400fa2bf718770674c38b0 Mon Sep 17 00:00:00 2001
From: Ezike Ebuka <yerimy...@gmail.com>
Date: Wed, 5 Mar 2025 11:15:35 +0000
Subject: [PATCH 1/3] [lldb] [lldb-dap] Return optional values for unsigned
 json values.

---
 lldb/tools/lldb-dap/DAP.cpp                     |  3 ++-
 .../lldb-dap/Handler/AttachRequestHandler.cpp   |  7 ++++---
 .../Handler/BreakpointLocationsHandler.cpp      | 12 +++++++-----
 .../DataBreakpointInfoRequestHandler.cpp        |  2 +-
 .../Handler/DisassembleRequestHandler.cpp       |  3 ++-
 .../Handler/LocationsRequestHandler.cpp         |  3 ++-
 .../Handler/ReadMemoryRequestHandler.cpp        |  2 +-
 lldb/tools/lldb-dap/Handler/RequestHandler.cpp  |  3 ++-
 .../Handler/SetVariableRequestHandler.cpp       |  4 ++--
 .../lldb-dap/Handler/SourceRequestHandler.cpp   |  5 +++--
 .../Handler/StackTraceRequestHandler.cpp        |  4 ++--
 .../lldb-dap/Handler/StepInRequestHandler.cpp   |  2 +-
 .../Handler/VariablesRequestHandler.cpp         |  2 +-
 lldb/tools/lldb-dap/JSONUtils.cpp               | 17 ++++++++---------
 lldb/tools/lldb-dap/JSONUtils.h                 | 10 +++++-----
 lldb/tools/lldb-dap/SourceBreakpoint.cpp        |  4 ++--
 16 files changed, 45 insertions(+), 38 deletions(-)

diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index c4790414f64f9..e908e4d7115f7 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -531,7 +531,8 @@ lldb::SBThread DAP::GetLLDBThread(const llvm::json::Object 
&arguments) {
 }
 
 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 =
diff --git a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
index 2733f58b74683..b2556f7ddff1c 100644
--- a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
@@ -54,9 +54,9 @@ 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");
   if (pid != LLDB_INVALID_PROCESS_ID)
@@ -70,7 +70,8 @@ void AttachRequestHandler::operator()(const 
llvm::json::Object &request) const {
   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);
+  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;
diff --git a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp 
b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
index 1b5c8ba307dcb..50b530349d0e4 100644
--- a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
@@ -131,11 +131,13 @@ void BreakpointLocationsRequestHandler::operator()(
   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());
+  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/DataBreakpointInfoRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
index 64829b93c783d..15c083fb5c14d 100644
--- a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
@@ -116,7 +116,7 @@ void DataBreakpointInfoRequestHandler::operator()(
   llvm::json::Array accessTypes{"read", "write", "readWrite"};
   const auto *arguments = request.getObject("arguments");
   const auto variablesReference =
-      GetUnsigned(arguments, "variablesReference", 0);
+      GetUnsigned(arguments, "variablesReference").value_or(0);
   llvm::StringRef name = GetString(arguments, "name");
   lldb::SBFrame frame = dap.GetLLDBFrame(*arguments);
   lldb::SBValue variable = dap.variables.FindVariable(variablesReference, 
name);
diff --git a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
index d6ff2a7fd8880..2df22357c5a45 100644
--- a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
@@ -113,7 +113,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/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..36be1fed33ccd 100644
--- a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
@@ -109,7 +109,7 @@ void ReadMemoryRequestHandler::operator()(
   }
   lldb::addr_t addr_int = *addr_opt;
   addr_int += GetSigned(arguments, "offset", 0);
-  const uint64_t count_requested = GetUnsigned(arguments, "count", 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..0efc63efee5f8 100644
--- a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
@@ -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/SetVariableRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
index 3a271bc1a1db5..752a15d09534d 100644
--- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
@@ -115,7 +115,7 @@ void SetVariableRequestHandler::operator()(
   const auto *arguments = request.getObject("arguments");
   // This is a reference to the containing variable/scope
   const auto variablesReference =
-      GetUnsigned(arguments, "variablesReference", 0);
+      GetUnsigned(arguments, "variablesReference").value_or(0);
   llvm::StringRef name = GetString(arguments, "name");
 
   const auto value = GetString(arguments, "value");
@@ -133,7 +133,7 @@ void SetVariableRequestHandler::operator()(
   // the name of the variable. We could have two shadowed variables with the
   // same name in "Locals" or "Globals". In our case the "id" absolute index
   // of the variable within the dap.variables list.
-  const auto id_value = GetUnsigned(arguments, "id", UINT64_MAX);
+  const auto id_value = GetUnsigned(arguments, "id").value_or(UINT64_MAX);
   if (id_value != UINT64_MAX) {
     variable = dap.variables.GetVariable(id_value);
   } else {
diff --git a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp
index 6b587b19aa6f2..7f82aec8daf3a 100644
--- a/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SourceRequestHandler.cpp
@@ -85,8 +85,9 @@ void SourceRequestHandler::operator()(const 
llvm::json::Object &request) const {
   const auto *arguments = request.getObject("arguments");
   const auto *source = arguments->getObject("source");
   llvm::json::Object body;
-  int64_t source_ref = GetUnsigned(
-      source, "sourceReference", GetUnsigned(arguments, "sourceReference", 0));
+  int64_t source_ref =
+      GetUnsigned(source, "sourceReference")
+          .value_or(GetUnsigned(arguments, "sourceReference").value_or(0));
 
   if (source_ref) {
     lldb::SBProcess process = dap.target.GetProcess();
diff --git a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp
index e5ba939134d25..4147b41ac16b2 100644
--- a/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/StackTraceRequestHandler.cpp
@@ -179,8 +179,8 @@ void StackTraceRequestHandler::operator()(
   llvm::json::Object body;
 
   if (thread.IsValid()) {
-    const auto start_frame = GetUnsigned(arguments, "startFrame", 0);
-    const auto levels = GetUnsigned(arguments, "levels", 0);
+    const auto start_frame = GetUnsigned(arguments, "startFrame").value_or(0);
+    const auto levels = GetUnsigned(arguments, "levels").value_or(0);
     int64_t offset = 0;
     bool reached_end_of_stack =
         FillStackFrames(dap, thread, stack_frames, offset, start_frame,
diff --git a/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp
index c2653322b8898..c28ba098f2091 100644
--- a/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/StepInRequestHandler.cpp
@@ -69,7 +69,7 @@ void StepInRequestHandler::operator()(const 
llvm::json::Object &request) const {
   const auto *arguments = request.getObject("arguments");
 
   std::string step_in_target;
-  uint64_t target_id = GetUnsigned(arguments, "targetId", 0);
+  uint64_t target_id = GetUnsigned(arguments, "targetId").value_or(0);
   auto it = dap.step_in_targets.find(target_id);
   if (it != dap.step_in_targets.end())
     step_in_target = it->second;
diff --git a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
index 05131c0dae276..356b427f4cfbe 100644
--- a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
@@ -93,7 +93,7 @@ void VariablesRequestHandler::operator()(
   llvm::json::Array variables;
   const auto *arguments = request.getObject("arguments");
   const auto variablesReference =
-      GetUnsigned(arguments, "variablesReference", 0);
+      GetUnsigned(arguments, "variablesReference").value_or(0);
   const int64_t start = GetSigned(arguments, "start", 0);
   const int64_t count = GetSigned(arguments, "count", 0);
   bool hex = false;
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp 
b/lldb/tools/lldb-dap/JSONUtils.cpp
index dac2346020454..1d011e3c284fc 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -86,18 +86,17 @@ llvm::StringRef GetString(const llvm::json::Object *obj, 
llvm::StringRef key,
 
 // Gets an unsigned integer from a JSON object using the key, or returns the
 // specified fail value.
-uint64_t GetUnsigned(const llvm::json::Object &obj, llvm::StringRef key,
-                     uint64_t fail_value) {
-  if (auto value = obj.getInteger(key))
-    return (uint64_t)*value;
-  return fail_value;
+std::optional<uint64_t> GetUnsigned(const llvm::json::Object &obj,
+                                    llvm::StringRef key) {
+  return obj.getInteger(key);
 }
 
-uint64_t GetUnsigned(const llvm::json::Object *obj, llvm::StringRef key,
-                     uint64_t fail_value) {
+std::optional<uint64_t> GetUnsigned(const llvm::json::Object *obj,
+                                    llvm::StringRef key) {
   if (obj == nullptr)
-    return fail_value;
-  return GetUnsigned(*obj, key, fail_value);
+    return std::nullopt;
+
+  return GetUnsigned(*obj, key);
 }
 
 std::optional<bool> GetBoolean(const llvm::json::Object &obj,
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index d212108ce6958..99d9ab90a2c49 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -85,12 +85,12 @@ llvm::StringRef GetString(const llvm::json::Object *obj, 
llvm::StringRef key,
 ///
 /// \return
 ///     The unsigned integer value for the specified \a key, or
-///     \a fail_value  if there is no key that matches or if the
+///     std::nullopt if there is no key that matches or if the
 ///     value is not an integer.
-uint64_t GetUnsigned(const llvm::json::Object &obj, llvm::StringRef key,
-                     uint64_t fail_value);
-uint64_t GetUnsigned(const llvm::json::Object *obj, llvm::StringRef key,
-                     uint64_t fail_value);
+std::optional<uint64_t> GetUnsigned(const llvm::json::Object &obj,
+                                    llvm::StringRef key);
+std::optional<uint64_t> GetUnsigned(const llvm::json::Object *obj,
+                                    llvm::StringRef key);
 
 /// Extract the boolean value for the specified key from the
 /// specified object.
diff --git a/lldb/tools/lldb-dap/SourceBreakpoint.cpp 
b/lldb/tools/lldb-dap/SourceBreakpoint.cpp
index 418e205312c9f..f2425f4b6aba7 100644
--- a/lldb/tools/lldb-dap/SourceBreakpoint.cpp
+++ b/lldb/tools/lldb-dap/SourceBreakpoint.cpp
@@ -27,8 +27,8 @@ namespace lldb_dap {
 SourceBreakpoint::SourceBreakpoint(DAP &dap, const llvm::json::Object &obj)
     : Breakpoint(dap, obj),
       logMessage(std::string(GetString(obj, "logMessage"))),
-      line(GetUnsigned(obj, "line", 0)), column(GetUnsigned(obj, "column", 0)) 
{
-}
+      line(GetUnsigned(obj, "line").value_or(0)),
+      column(GetUnsigned(obj, "column").value_or(0)) {}
 
 void SourceBreakpoint::SetBreakpoint(const llvm::StringRef source_path) {
   lldb::SBFileSpecList module_list;

>From a3fe301ac1fc9744c6a2b0d0994cf78cb29d0445 Mon Sep 17 00:00:00 2001
From: Ezike Ebuka <yerimy...@gmail.com>
Date: Wed, 5 Mar 2025 11:39:58 +0000
Subject: [PATCH 2/3] [lldb] [lldb-dap] Return optional values for signed json
 values.

---
 lldb/tools/lldb-dap/DAP.cpp                   |  4 ++--
 .../lldb-dap/Handler/CompletionsHandler.cpp   |  5 +++--
 .../Handler/DisassembleRequestHandler.cpp     |  2 +-
 .../Handler/ReadMemoryRequestHandler.cpp      |  2 +-
 .../Handler/VariablesRequestHandler.cpp       |  4 ++--
 lldb/tools/lldb-dap/InstructionBreakpoint.cpp |  2 +-
 lldb/tools/lldb-dap/JSONUtils.cpp             | 19 +++++++++----------
 lldb/tools/lldb-dap/JSONUtils.h               | 14 +++++++-------
 8 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/lldb/tools/lldb-dap/DAP.cpp b/lldb/tools/lldb-dap/DAP.cpp
index e908e4d7115f7..3502579cde0a6 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -526,7 +526,7 @@ 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);
 }
 
@@ -772,7 +772,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;
     {
diff --git a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp 
b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
index 09b73054ca62f..fc9b72b5b4f00 100644
--- a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
@@ -143,8 +143,9 @@ void CompletionsRequestHandler::operator()(
   }
 
   std::string text = GetString(arguments, "text").str();
-  auto original_column = GetSigned(arguments, "column", text.size());
-  auto original_line = GetSigned(arguments, "line", 1);
+  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/DisassembleRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
index 2df22357c5a45..e40e7084ce279 100644
--- a/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DisassembleRequestHandler.cpp
@@ -104,7 +104,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;
diff --git a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
index 36be1fed33ccd..a2ea0a6217264 100644
--- a/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
@@ -108,7 +108,7 @@ void ReadMemoryRequestHandler::operator()(
     return;
   }
   lldb::addr_t addr_int = *addr_opt;
-  addr_int += GetSigned(arguments, "offset", 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
diff --git a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
index 356b427f4cfbe..a4f04dd06fe5e 100644
--- a/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/VariablesRequestHandler.cpp
@@ -94,8 +94,8 @@ void VariablesRequestHandler::operator()(
   const auto *arguments = request.getObject("arguments");
   const auto variablesReference =
       GetUnsigned(arguments, "variablesReference").value_or(0);
-  const int64_t start = GetSigned(arguments, "start", 0);
-  const int64_t count = GetSigned(arguments, "count", 0);
+  const int64_t start = GetSigned(arguments, "start").value_or(0);
+  const int64_t count = GetSigned(arguments, "count").value_or(0);
   bool hex = false;
   const auto *format = arguments->getObject("format");
   if (format)
diff --git a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp 
b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp
index 37daa8f0bdd5f..d9d5a0b3e745b 100644
--- a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp
+++ b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp
@@ -20,7 +20,7 @@ namespace lldb_dap {
 InstructionBreakpoint::InstructionBreakpoint(DAP &d,
                                              const llvm::json::Object &obj)
     : Breakpoint(d, obj), instructionAddressReference(LLDB_INVALID_ADDRESS),
-      offset(GetSigned(obj, "offset", 0)) {
+      offset(GetSigned(obj, "offset").value_or(0)) {
   GetString(obj, "instructionReference")
       .getAsInteger(0, instructionAddressReference);
   instructionAddressReference += offset;
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp 
b/lldb/tools/lldb-dap/JSONUtils.cpp
index 1d011e3c284fc..c3684b027045a 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -115,18 +115,17 @@ std::optional<bool> GetBoolean(const llvm::json::Object 
*obj,
   return std::nullopt;
 }
 
-int64_t GetSigned(const llvm::json::Object &obj, llvm::StringRef key,
-                  int64_t fail_value) {
-  if (auto value = obj.getInteger(key))
-    return *value;
-  return fail_value;
+std::optional<int64_t> GetSigned(const llvm::json::Object &obj,
+                                 llvm::StringRef key) {
+  return obj.getInteger(key);
 }
 
-int64_t GetSigned(const llvm::json::Object *obj, llvm::StringRef key,
-                  int64_t fail_value) {
+std::optional<int64_t> GetSigned(const llvm::json::Object *obj,
+                                 llvm::StringRef key) {
   if (obj == nullptr)
-    return fail_value;
-  return GetSigned(*obj, key, fail_value);
+    return std::nullopt;
+
+  return GetSigned(*obj, key);
 }
 
 bool ObjectContainsKey(const llvm::json::Object &obj, llvm::StringRef key) {
@@ -279,7 +278,7 @@ void FillResponse(const llvm::json::Object &request,
   response.try_emplace("type", "response");
   response.try_emplace("seq", (int64_t)0);
   EmplaceSafeString(response, "command", GetString(request, "command"));
-  const int64_t seq = GetSigned(request, "seq", 0);
+  const int64_t seq = GetSigned(request, "seq").value_or(0);
   response.try_emplace("request_seq", seq);
   response.try_emplace("success", true);
 }
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index 99d9ab90a2c49..8e231406c2ef0 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -85,7 +85,7 @@ llvm::StringRef GetString(const llvm::json::Object *obj, 
llvm::StringRef key,
 ///
 /// \return
 ///     The unsigned integer value for the specified \a key, or
-///     std::nullopt if there is no key that matches or if the
+///     \a std::nullopt if there is no key that matches or if the
 ///     value is not an integer.
 std::optional<uint64_t> GetUnsigned(const llvm::json::Object &obj,
                                     llvm::StringRef key);
@@ -102,7 +102,7 @@ std::optional<uint64_t> GetUnsigned(const 
llvm::json::Object *obj,
 ///     The key to use when extracting the value
 ///
 /// \return
-///     The boolean value for the specified \a key, or std::nullopt
+///     The boolean value for the specified \a key, or \a std::nullopt
 ///     if there is no key that matches or if the value is not a
 ///     boolean value of an integer.
 /// @{
@@ -123,12 +123,12 @@ std::optional<bool> GetBoolean(const llvm::json::Object 
*obj,
 ///
 /// \return
 ///     The signed integer value for the specified \a key, or
-///     \a fail_value if there is no key that matches or if the
+///     \a std::nullopt if there is no key that matches or if the
 ///     value is not an integer.
-int64_t GetSigned(const llvm::json::Object &obj, llvm::StringRef key,
-                  int64_t fail_value);
-int64_t GetSigned(const llvm::json::Object *obj, llvm::StringRef key,
-                  int64_t fail_value);
+std::optional<int64_t> GetSigned(const llvm::json::Object &obj,
+                                 llvm::StringRef key);
+std::optional<int64_t> GetSigned(const llvm::json::Object *obj,
+                                 llvm::StringRef key);
 
 /// Check if the specified key exists in the specified object.
 ///

>From 9094e74dc7fabb86f0d694f46896e25b05d0d5e6 Mon Sep 17 00:00:00 2001
From: Ezike Ebuka <yerimy...@gmail.com>
Date: Wed, 5 Mar 2025 16:04:11 +0000
Subject: [PATCH 3/3] [lldb] [lldb-dap] Return optional values for string json
 values.

---
 lldb/tools/lldb-dap/BreakpointBase.cpp        |  4 +--
 lldb/tools/lldb-dap/DAP.cpp                   | 14 ++++++-----
 lldb/tools/lldb-dap/FunctionBreakpoint.cpp    |  3 ++-
 .../lldb-dap/Handler/AttachRequestHandler.cpp | 14 ++++++-----
 .../Handler/BreakpointLocationsHandler.cpp    |  2 +-
 .../Handler/CompileUnitsRequestHandler.cpp    |  3 ++-
 .../lldb-dap/Handler/CompletionsHandler.cpp   |  2 +-
 .../DataBreakpointInfoRequestHandler.cpp      |  2 +-
 .../Handler/DisassembleRequestHandler.cpp     |  3 ++-
 .../Handler/EvaluateRequestHandler.cpp        |  5 ++--
 .../lldb-dap/Handler/LaunchRequestHandler.cpp | 10 +++++---
 .../Handler/ReadMemoryRequestHandler.cpp      |  3 ++-
 .../tools/lldb-dap/Handler/RequestHandler.cpp |  4 +--
 .../Handler/SetBreakpointsRequestHandler.cpp  |  2 +-
 .../Handler/SetVariableRequestHandler.cpp     |  4 +--
 lldb/tools/lldb-dap/InstructionBreakpoint.cpp |  1 +
 lldb/tools/lldb-dap/JSONUtils.cpp             | 25 ++++++++++---------
 lldb/tools/lldb-dap/JSONUtils.h               | 13 ++++------
 lldb/tools/lldb-dap/SourceBreakpoint.cpp      |  2 +-
 lldb/tools/lldb-dap/Watchpoint.cpp            |  4 +--
 20 files changed, 65 insertions(+), 55 deletions(-)

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 3502579cde0a6..435cd0f188d75 100644
--- a/lldb/tools/lldb-dap/DAP.cpp
+++ b/lldb/tools/lldb-dap/DAP.cpp
@@ -689,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.
@@ -755,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()) {
@@ -795,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 b2556f7ddff1c..5d45dc4fe0b34 100644
--- a/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/AttachRequestHandler.cpp
@@ -58,7 +58,7 @@ void AttachRequestHandler::operator()(const 
llvm::json::Object &request) const {
   const auto gdb_remote_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,23 +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");
+  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 50b530349d0e4..66195fd5fb5bd 100644
--- a/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/BreakpointLocationsHandler.cpp
@@ -130,7 +130,7 @@ void BreakpointLocationsRequestHandler::operator()(
   FillResponse(request, response);
   auto *arguments = request.getObject("arguments");
   auto *source = arguments->getObject("source");
-  std::string path = GetString(source, "path").str();
+  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 =
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 fc9b72b5b4f00..96d573c48513c 100644
--- a/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/CompletionsHandler.cpp
@@ -142,7 +142,7 @@ void CompletionsRequestHandler::operator()(
     frame.GetThread().SetSelectedFrame(frame.GetFrameID());
   }
 
-  std::string text = GetString(arguments, "text").str();
+  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);
diff --git a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
index 15c083fb5c14d..2926ede0c3f7a 100644
--- a/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/DataBreakpointInfoRequestHandler.cpp
@@ -117,7 +117,7 @@ void DataBreakpointInfoRequestHandler::operator()(
   const auto *arguments = request.getObject("arguments");
   const auto variablesReference =
       GetUnsigned(arguments, "variablesReference").value_or(0);
-  llvm::StringRef name = GetString(arguments, "name");
+  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 e40e7084ce279..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;
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/ReadMemoryRequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/ReadMemoryRequestHandler.cpp
index a2ea0a6217264..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;
diff --git a/lldb/tools/lldb-dap/Handler/RequestHandler.cpp 
b/lldb/tools/lldb-dap/Handler/RequestHandler.cpp
index 0efc63efee5f8..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());
 
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 752a15d09534d..6274100446dcc 100644
--- a/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
+++ b/lldb/tools/lldb-dap/Handler/SetVariableRequestHandler.cpp
@@ -116,9 +116,9 @@ void SetVariableRequestHandler::operator()(
   // This is a reference to the containing variable/scope
   const auto variablesReference =
       GetUnsigned(arguments, "variablesReference").value_or(0);
-  llvm::StringRef name = GetString(arguments, "name");
+  llvm::StringRef name = GetString(arguments, "name").value_or("");
 
-  const auto value = GetString(arguments, "value");
+  const auto value = GetString(arguments, "value").value_or("");
   // Set success to false just in case we don't find the variable by name
   response.try_emplace("success", false);
 
diff --git a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp 
b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp
index d9d5a0b3e745b..faa6c982b0fd1 100644
--- a/lldb/tools/lldb-dap/InstructionBreakpoint.cpp
+++ b/lldb/tools/lldb-dap/InstructionBreakpoint.cpp
@@ -22,6 +22,7 @@ InstructionBreakpoint::InstructionBreakpoint(DAP &d,
     : Breakpoint(d, obj), instructionAddressReference(LLDB_INVALID_ADDRESS),
       offset(GetSigned(obj, "offset").value_or(0)) {
   GetString(obj, "instructionReference")
+      .value_or("")
       .getAsInteger(0, instructionAddressReference);
   instructionAddressReference += offset;
 }
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp 
b/lldb/tools/lldb-dap/JSONUtils.cpp
index c3684b027045a..fbb6ba91c876e 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -70,18 +70,17 @@ llvm::StringRef GetAsString(const llvm::json::Value &value) 
{
 }
 
 // Gets a string from a JSON object using the key, or returns an empty string.
-llvm::StringRef GetString(const llvm::json::Object &obj, llvm::StringRef key,
-                          llvm::StringRef defaultValue) {
-  if (std::optional<llvm::StringRef> value = obj.getString(key))
-    return *value;
-  return defaultValue;
+std::optional<llvm::StringRef> GetString(const llvm::json::Object &obj,
+                                         llvm::StringRef key) {
+  return obj.getString(key);
 }
 
-llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key,
-                          llvm::StringRef defaultValue) {
+std::optional<llvm::StringRef> GetString(const llvm::json::Object *obj,
+                                         llvm::StringRef key) {
   if (obj == nullptr)
-    return defaultValue;
-  return GetString(*obj, key, defaultValue);
+    return std::nullopt;
+
+  return GetString(*obj, key);
 }
 
 // Gets an unsigned integer from a JSON object using the key, or returns the
@@ -277,7 +276,8 @@ void FillResponse(const llvm::json::Object &request,
   // to true by default.
   response.try_emplace("type", "response");
   response.try_emplace("seq", (int64_t)0);
-  EmplaceSafeString(response, "command", GetString(request, "command"));
+  EmplaceSafeString(response, "command",
+                    GetString(request, "command").value_or(""));
   const int64_t seq = GetSigned(request, "seq").value_or(0);
   response.try_emplace("request_seq", seq);
   response.try_emplace("success", true);
@@ -1451,13 +1451,14 @@ CreateRunInTerminalReverseRequest(const 
llvm::json::Object &launch_request,
     args.push_back(std::to_string(debugger_pid));
   }
   args.push_back("--launch-target");
-  args.push_back(GetString(launch_request_arguments, "program").str());
+  args.push_back(
+      GetString(launch_request_arguments, "program").value_or("").str());
   std::vector<std::string> target_args =
       GetStrings(launch_request_arguments, "args");
   args.insert(args.end(), target_args.begin(), target_args.end());
   run_in_terminal_args.try_emplace("args", args);
 
-  const auto cwd = GetString(launch_request_arguments, "cwd");
+  const auto cwd = GetString(launch_request_arguments, "cwd").value_or("");
   if (!cwd.empty())
     run_in_terminal_args.try_emplace("cwd", cwd);
 
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index 8e231406c2ef0..613a6fae7f5bf 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -62,17 +62,14 @@ llvm::StringRef GetAsString(const llvm::json::Value &value);
 /// \param[in] key
 ///     The key to use when extracting the value
 ///
-/// \param[in] defaultValue
-///     The default value to return if the key is not present
-///
 /// \return
 ///     A llvm::StringRef that contains the string value for the
-///     specified \a key, or the default value if there is no key that
+///     specified \a key, or \a std::nullopt if there is no key that
 ///     matches or if the value is not a string.
-llvm::StringRef GetString(const llvm::json::Object &obj, llvm::StringRef key,
-                          llvm::StringRef defaultValue = {});
-llvm::StringRef GetString(const llvm::json::Object *obj, llvm::StringRef key,
-                          llvm::StringRef defaultValue = {});
+std::optional<llvm::StringRef> GetString(const llvm::json::Object &obj,
+                                         llvm::StringRef key);
+std::optional<llvm::StringRef> GetString(const llvm::json::Object *obj,
+                                         llvm::StringRef key);
 
 /// Extract the unsigned integer value for the specified key from
 /// the specified object.
diff --git a/lldb/tools/lldb-dap/SourceBreakpoint.cpp 
b/lldb/tools/lldb-dap/SourceBreakpoint.cpp
index f2425f4b6aba7..e44e95e486496 100644
--- a/lldb/tools/lldb-dap/SourceBreakpoint.cpp
+++ b/lldb/tools/lldb-dap/SourceBreakpoint.cpp
@@ -26,7 +26,7 @@ namespace lldb_dap {
 
 SourceBreakpoint::SourceBreakpoint(DAP &dap, const llvm::json::Object &obj)
     : Breakpoint(dap, obj),
-      logMessage(std::string(GetString(obj, "logMessage"))),
+      logMessage(GetString(obj, "logMessage").value_or("").str()),
       line(GetUnsigned(obj, "line").value_or(0)),
       column(GetUnsigned(obj, "column").value_or(0)) {}
 
diff --git a/lldb/tools/lldb-dap/Watchpoint.cpp 
b/lldb/tools/lldb-dap/Watchpoint.cpp
index 0e68a35877c66..8681057c8d3f2 100644
--- a/lldb/tools/lldb-dap/Watchpoint.cpp
+++ b/lldb/tools/lldb-dap/Watchpoint.cpp
@@ -20,8 +20,8 @@
 namespace lldb_dap {
 Watchpoint::Watchpoint(DAP &d, const llvm::json::Object &obj)
     : BreakpointBase(d, obj) {
-  llvm::StringRef dataId = GetString(obj, "dataId");
-  std::string accessType = GetString(obj, "accessType").str();
+  llvm::StringRef dataId = GetString(obj, "dataId").value_or("");
+  std::string accessType = GetString(obj, "accessType").value_or("").str();
   auto [addr_str, size_str] = dataId.split('/');
   llvm::to_integer(addr_str, addr, 16);
   llvm::to_integer(size_str, size);

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to