[Lldb-commits] [lldb] [lldb-dap] Provide `declarationLocation` for variables (PR #102928)
Adrian Vogelsgesang via lldb-commits
lldb-commits at lists.llvm.org
Mon Aug 12 09:20:40 PDT 2024
https://github.com/vogelsgesang created https://github.com/llvm/llvm-project/pull/102928
`declarationLocation` is about to become part of the upstream debug adapter protocol (see microsoft/debug-adapter-protocol#343). This is a draft implementation, to be finalized and merged after the corresponding changes were merged into DAP.
TODO:
* Adjust comment on `CreateVariable` function with updated jsonschema as soon as the upstream changes were merged to DAP.
* Update based on final protocol merged to DAP
>From 5c3b3458eb3426e58ead2d66f0cc9530eb368dd3 Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <avogelsgesang at salesforce.com>
Date: Sat, 10 Aug 2024 23:59:55 +0000
Subject: [PATCH] [lldb-dap] Provide `declarationLocation` for variables
TODO:
* Adjust comment on `CreateVariable` function with updated jsonschema as
soon as the upstream changes were merged to DAP.
`declarationLocation` is about to become part of the upstream
debug-adapter-protocol. This is a draft implementation, to be finalized
and merged after the corresponding changes were merged into DAP.
---
.../lldb-dap/variables/TestDAP_variables.py | 4 ++++
lldb/tools/lldb-dap/JSONUtils.cpp | 18 ++++++++++++++++--
lldb/tools/lldb-dap/JSONUtils.h | 14 ++++++++++++--
3 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
index 3c6901b2fd99a5..7d982e801f741e 100644
--- a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
+++ b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
@@ -168,6 +168,10 @@ def do_test_scopes_variables_setVariable_evaluate(
"type": "int",
"value": "1",
},
+ "declarationLocation": {
+ "equals": {"line": 12, "column": 14},
+ "contains": {"path": ["lldb-dap", "variables", "main.cpp"]},
+ },
"$__lldb_extensions": {
"equals": {
"value": "1",
diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp
index a8b85f55939e17..3e0c1076643260 100644
--- a/lldb/tools/lldb-dap/JSONUtils.cpp
+++ b/lldb/tools/lldb-dap/JSONUtils.cpp
@@ -614,9 +614,8 @@ CreateExceptionBreakpointFilter(const ExceptionBreakpoint &bp) {
// }
// }
// }
-llvm::json::Value CreateSource(lldb::SBLineEntry &line_entry) {
+llvm::json::Value CreateSource(const lldb::SBFileSpec &file) {
llvm::json::Object object;
- lldb::SBFileSpec file = line_entry.GetFileSpec();
if (file.IsValid()) {
const char *name = file.GetFilename();
if (name)
@@ -630,6 +629,10 @@ llvm::json::Value CreateSource(lldb::SBLineEntry &line_entry) {
return llvm::json::Value(std::move(object));
}
+llvm::json::Value CreateSource(const lldb::SBLineEntry &line_entry) {
+ return CreateSource(line_entry.GetFileSpec());
+}
+
llvm::json::Value CreateSource(llvm::StringRef source_path) {
llvm::json::Object source;
llvm::StringRef name = llvm::sys::path::filename(source_path);
@@ -1253,6 +1256,17 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t variablesReference,
else
object.try_emplace("variablesReference", (int64_t)0);
+ if (lldb::SBDeclaration decl = v.GetDeclaration(); decl.IsValid()) {
+ llvm::json::Object decl_obj;
+ decl_obj.try_emplace("source", CreateSource(decl.GetFileSpec()));
+ if (int line = decl.GetLine())
+ decl_obj.try_emplace("line", line);
+ if (int column = decl.GetColumn())
+ decl_obj.try_emplace("column", column);
+
+ object.try_emplace("declarationLocation", std::move(decl_obj));
+ }
+
object.try_emplace("$__lldb_extensions", desc.GetVariableExtensionsJSON());
return llvm::json::Value(std::move(object));
}
diff --git a/lldb/tools/lldb-dap/JSONUtils.h b/lldb/tools/lldb-dap/JSONUtils.h
index 1515f5ba2e5f4d..610f920952e77c 100644
--- a/lldb/tools/lldb-dap/JSONUtils.h
+++ b/lldb/tools/lldb-dap/JSONUtils.h
@@ -282,6 +282,16 @@ llvm::json::Value CreateScope(const llvm::StringRef name,
int64_t variablesReference,
int64_t namedVariables, bool expensive);
+/// Create a "Source" JSON object as described in the debug adaptor definition.
+///
+/// \param[in] file
+/// The SBFileSpec to use when populating out the "Source" object
+///
+/// \return
+/// A "Source" JSON object that follows the formal JSON
+/// definition outlined by Microsoft.
+llvm::json::Value CreateSource(const lldb::SBFileSpec &file);
+
/// Create a "Source" JSON object as described in the debug adaptor definition.
///
/// \param[in] line_entry
@@ -289,9 +299,9 @@ llvm::json::Value CreateScope(const llvm::StringRef name,
/// object
///
/// \return
-/// A "Source" JSON object with that follows the formal JSON
+/// A "Source" JSON object that follows the formal JSON
/// definition outlined by Microsoft.
-llvm::json::Value CreateSource(lldb::SBLineEntry &line_entry);
+llvm::json::Value CreateSource(const lldb::SBLineEntry &line_entry);
/// Create a "Source" object for a given source path.
///
More information about the lldb-commits
mailing list