Skip to content

Commit b6850bf

Browse files
committed
[lldb-dap] Migrating DAP 'initialize' to new typed RequestHandler.
This adds new types and helpers to support the 'initialize' request with the new typed RequestHandler. While working on this I found there were a few cases where we incorrectly treated initialize arguments as capabilities. The new `lldb_dap::protocol::InitializeRequestArguments` and `lldb_dap::protocol::Capabilities` uncovered the inconsistencies.
1 parent 8f863fc commit b6850bf

File tree

13 files changed

+800
-223
lines changed

13 files changed

+800
-223
lines changed

lldb/packages/Python/lldbsuite/test/tools/lldb-dap/dap_server.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -776,7 +776,8 @@ def request_initialize(self, sourceInitFile):
776776
"supportsVariablePaging": True,
777777
"supportsVariableType": True,
778778
"supportsStartDebuggingRequest": True,
779-
"sourceInitFile": sourceInitFile,
779+
"supportsProgressReporting": True,
780+
"$__lldb_sourceInitFile": sourceInitFile,
780781
},
781782
}
782783
response = self.send_recv(command_dict)
@@ -1261,7 +1262,7 @@ def launch(cls, /, executable, env=None, log_file=None, connection=None):
12611262
expected_prefix = "Listening for: "
12621263
out = process.stdout.readline().decode()
12631264
if not out.startswith(expected_prefix):
1264-
self.process.kill()
1265+
process.kill()
12651266
raise ValueError(
12661267
"lldb-dap failed to print listening address, expected '{}', got '{}'".format(
12671268
expected_prefix, out

lldb/test/API/tools/lldb-dap/launch/TestDAP_launch.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -524,8 +524,7 @@ def test_version(self):
524524

525525
# The first line is the prompt line like "(lldb) version", so we skip it.
526526
version_eval_output_without_prompt_line = version_eval_output.splitlines()[1:]
527-
lldb_json = self.dap_server.get_initialize_value("__lldb")
528-
version_string = lldb_json["version"]
527+
version_string = self.dap_server.get_initialize_value("$__lldb_version")
529528
self.assertEqual(
530529
version_eval_output_without_prompt_line,
531530
version_string.splitlines(),

lldb/tools/lldb-dap/DAP.cpp

Lines changed: 126 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "LLDBUtils.h"
1515
#include "OutputRedirector.h"
1616
#include "Protocol/ProtocolBase.h"
17+
#include "Protocol/ProtocolTypes.h"
1718
#include "Transport.h"
1819
#include "lldb/API/SBBreakpoint.h"
1920
#include "lldb/API/SBCommandInterpreter.h"
@@ -1144,31 +1145,137 @@ lldb::SBValue Variables::FindVariable(uint64_t variablesReference,
11441145
return variable;
11451146
}
11461147

1147-
llvm::StringMap<bool> DAP::GetCapabilities() {
1148-
llvm::StringMap<bool> capabilities;
1148+
static void mergeCapabilities(protocol::Capabilities &into,
1149+
const protocol::Capabilities &from) {
1150+
if (from.supportsConfigurationDoneRequest)
1151+
into.supportsConfigurationDoneRequest =
1152+
*from.supportsConfigurationDoneRequest;
1153+
if (from.supportsFunctionBreakpoints)
1154+
into.supportsFunctionBreakpoints = *from.supportsFunctionBreakpoints;
1155+
if (from.supportsConditionalBreakpoints)
1156+
into.supportsConditionalBreakpoints = *from.supportsConditionalBreakpoints;
1157+
if (from.supportsHitConditionalBreakpoints)
1158+
into.supportsHitConditionalBreakpoints =
1159+
*from.supportsHitConditionalBreakpoints;
1160+
if (from.supportsEvaluateForHovers)
1161+
into.supportsEvaluateForHovers = *from.supportsEvaluateForHovers;
1162+
if (from.exceptionBreakpointFilters)
1163+
into.exceptionBreakpointFilters = *from.exceptionBreakpointFilters;
1164+
if (from.supportsStepBack)
1165+
into.supportsStepBack = *from.supportsStepBack;
1166+
if (from.supportsSetVariable)
1167+
into.supportsSetVariable = *from.supportsSetVariable;
1168+
if (from.supportsRestartFrame)
1169+
into.supportsRestartFrame = *from.supportsRestartFrame;
1170+
if (from.supportsGotoTargetsRequest)
1171+
into.supportsGotoTargetsRequest = *from.supportsGotoTargetsRequest;
1172+
if (from.supportsStepInTargetsRequest)
1173+
into.supportsStepInTargetsRequest = *from.supportsStepInTargetsRequest;
1174+
if (from.supportsCompletionsRequest)
1175+
into.supportsCompletionsRequest = *from.supportsCompletionsRequest;
1176+
if (from.completionTriggerCharacters)
1177+
into.completionTriggerCharacters = *from.completionTriggerCharacters;
1178+
if (from.supportsModulesRequest)
1179+
into.supportsModulesRequest = *from.supportsModulesRequest;
1180+
if (from.additionalModuleColumns)
1181+
into.additionalModuleColumns = *from.additionalModuleColumns;
1182+
if (from.supportedChecksumAlgorithms)
1183+
into.supportedChecksumAlgorithms = *from.supportedChecksumAlgorithms;
1184+
if (from.supportsRestartRequest)
1185+
into.supportsRestartRequest = *from.supportsRestartRequest;
1186+
if (from.supportsExceptionOptions)
1187+
into.supportsExceptionOptions = *from.supportsExceptionOptions;
1188+
if (from.supportsValueFormattingOptions)
1189+
into.supportsValueFormattingOptions = *from.supportsValueFormattingOptions;
1190+
if (from.supportsExceptionInfoRequest)
1191+
into.supportsExceptionInfoRequest = *from.supportsExceptionInfoRequest;
1192+
if (from.supportTerminateDebuggee)
1193+
into.supportTerminateDebuggee = *from.supportTerminateDebuggee;
1194+
if (from.supportSuspendDebuggee)
1195+
into.supportSuspendDebuggee = *from.supportSuspendDebuggee;
1196+
if (from.supportsDelayedStackTraceLoading)
1197+
into.supportsDelayedStackTraceLoading =
1198+
*from.supportsDelayedStackTraceLoading;
1199+
if (from.supportsLoadedSourcesRequest)
1200+
into.supportsLoadedSourcesRequest = *from.supportsLoadedSourcesRequest;
1201+
if (from.supportsLogPoints)
1202+
into.supportsLogPoints = *from.supportsLogPoints;
1203+
if (from.supportsTerminateThreadsRequest)
1204+
into.supportsTerminateThreadsRequest =
1205+
*from.supportsTerminateThreadsRequest;
1206+
if (from.supportsSetExpression)
1207+
into.supportsSetExpression = *from.supportsSetExpression;
1208+
if (from.supportsTerminateRequest)
1209+
into.supportsTerminateRequest = *from.supportsTerminateRequest;
1210+
if (from.supportsDataBreakpoints)
1211+
into.supportsDataBreakpoints = *from.supportsDataBreakpoints;
1212+
if (from.supportsReadMemoryRequest)
1213+
into.supportsReadMemoryRequest = *from.supportsReadMemoryRequest;
1214+
if (from.supportsWriteMemoryRequest)
1215+
into.supportsWriteMemoryRequest = *from.supportsWriteMemoryRequest;
1216+
if (from.supportsDisassembleRequest)
1217+
into.supportsDisassembleRequest = *from.supportsDisassembleRequest;
1218+
if (from.supportsCancelRequest)
1219+
into.supportsCancelRequest = *from.supportsCancelRequest;
1220+
if (from.supportsBreakpointLocationsRequest)
1221+
into.supportsBreakpointLocationsRequest =
1222+
*from.supportsBreakpointLocationsRequest;
1223+
if (from.supportsClipboardContext)
1224+
into.supportsClipboardContext = *from.supportsClipboardContext;
1225+
if (from.supportsSteppingGranularity)
1226+
into.supportsSteppingGranularity = *from.supportsSteppingGranularity;
1227+
if (from.supportsInstructionBreakpoints)
1228+
into.supportsInstructionBreakpoints = *from.supportsInstructionBreakpoints;
1229+
if (from.supportsExceptionFilterOptions)
1230+
into.supportsExceptionFilterOptions = *from.supportsExceptionFilterOptions;
1231+
if (from.supportsSingleThreadExecutionRequests)
1232+
into.supportsSingleThreadExecutionRequests =
1233+
*from.supportsSingleThreadExecutionRequests;
1234+
if (from.supportsDataBreakpointBytes)
1235+
into.supportsDataBreakpointBytes = *from.supportsDataBreakpointBytes;
1236+
if (from.breakpointModes)
1237+
into.breakpointModes = *from.breakpointModes;
1238+
if (from.supportsANSIStyling)
1239+
into.supportsANSIStyling = *from.supportsANSIStyling;
1240+
}
1241+
1242+
protocol::Capabilities DAP::GetCapabilities() {
1243+
protocol::Capabilities capabilities;
11491244

11501245
// Supported capabilities.
1151-
capabilities["supportTerminateDebuggee"] = true;
1152-
capabilities["supportsDataBreakpoints"] = true;
1153-
capabilities["supportsDelayedStackTraceLoading"] = true;
1154-
capabilities["supportsEvaluateForHovers"] = true;
1155-
capabilities["supportsExceptionOptions"] = true;
1156-
capabilities["supportsLogPoints"] = true;
1157-
capabilities["supportsProgressReporting"] = true;
1158-
capabilities["supportsSteppingGranularity"] = true;
1159-
capabilities["supportsValueFormattingOptions"] = true;
1246+
capabilities.supportTerminateDebuggee = true;
1247+
capabilities.supportsDataBreakpoints = true;
1248+
capabilities.supportsDelayedStackTraceLoading = true;
1249+
capabilities.supportsEvaluateForHovers = true;
1250+
capabilities.supportsExceptionOptions = true;
1251+
capabilities.supportsLogPoints = true;
1252+
capabilities.supportsSteppingGranularity = true;
1253+
capabilities.supportsValueFormattingOptions = true;
11601254

11611255
// Unsupported capabilities.
1162-
capabilities["supportsGotoTargetsRequest"] = false;
1163-
capabilities["supportsLoadedSourcesRequest"] = false;
1164-
capabilities["supportsRestartFrame"] = false;
1165-
capabilities["supportsStepBack"] = false;
1256+
capabilities.supportsGotoTargetsRequest = false;
1257+
capabilities.supportsLoadedSourcesRequest = false;
1258+
capabilities.supportsRestartFrame = false;
1259+
capabilities.supportsStepBack = false;
11661260

11671261
// Capabilities associated with specific requests.
1168-
for (auto &kv : request_handlers) {
1169-
for (auto &request_kv : kv.second->GetCapabilities())
1170-
capabilities[request_kv.getKey()] = request_kv.getValue();
1171-
}
1262+
for (auto &kv : request_handlers)
1263+
mergeCapabilities(capabilities, kv.second->GetCapabilities());
1264+
1265+
// Available filters or options for the setExceptionBreakpoints request.
1266+
std::vector<protocol::ExceptionBreakpointsFilter> filters;
1267+
for (const auto &exc_bp : *exception_breakpoints)
1268+
filters.emplace_back(CreateExceptionBreakpointFilter(exc_bp));
1269+
capabilities.exceptionBreakpointFilters = std::move(filters);
1270+
1271+
std::vector<std::string> completion_characters;
1272+
completion_characters.emplace_back(".");
1273+
completion_characters.emplace_back(" ");
1274+
completion_characters.emplace_back("\t");
1275+
capabilities.completionTriggerCharacters = std::move(completion_characters);
1276+
1277+
// Put in non-DAP specification lldb specific information.
1278+
capabilities.lldbVersion = debugger.GetVersionString();
11721279

11731280
return capabilities;
11741281
}

lldb/tools/lldb-dap/DAP.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "OutputRedirector.h"
1717
#include "ProgressEvent.h"
1818
#include "Protocol/ProtocolBase.h"
19+
#include "Protocol/ProtocolTypes.h"
1920
#include "SourceBreakpoint.h"
2021
#include "Transport.h"
2122
#include "lldb/API/SBBroadcaster.h"
@@ -180,6 +181,7 @@ struct DAP {
180181
bool enable_auto_variable_summaries;
181182
bool enable_synthetic_child_debugging;
182183
bool display_extended_backtrace;
184+
bool supports_run_in_terminal_request;
183185
// The process event thread normally responds to process exited events by
184186
// shutting down the entire adapter. When we're restarting, we keep the id of
185187
// the old process here so we can detect this case and keep running.
@@ -363,8 +365,8 @@ struct DAP {
363365
request_handlers[Handler::GetCommand()] = std::make_unique<Handler>(*this);
364366
}
365367

366-
/// Return a key-value list of capabilities.
367-
llvm::StringMap<bool> GetCapabilities();
368+
/// The set of capablities supported by this adapter.
369+
protocol::Capabilities GetCapabilities();
368370

369371
/// Debuggee will continue from stopped state.
370372
void WillContinue() { variables.Clear(); }

0 commit comments

Comments
 (0)