Skip to content

Commit

Permalink
[lldb-dap] Emit declarations along with variables (llvm#74865)
Browse files Browse the repository at this point in the history
This is an extension to the protocol that emits the declaration
information along with the metadata of each variable. This can be used
by vscode extensions to implement, for example, a "goToDefinition"
action in the debug tab, or for showing the value of a variable right
next to where it's declared during a debug session.
As this is cheap, I'm not gating this information under any setting.

(cherry picked from commit 0ea19bd)
  • Loading branch information
walter-erquinigo authored and adrian-prantl committed Jan 19, 2024
1 parent 42ee7f7 commit ad6510e
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 2 deletions.
10 changes: 8 additions & 2 deletions lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

import os

import lldbdap_testcase
import dap_server
import lldbdap_testcase
from lldbsuite.test import lldbutil
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
Expand Down Expand Up @@ -151,7 +151,13 @@ def do_test_scopes_variables_setVariable_evaluate(
globals = self.dap_server.get_global_variables()
buffer_children = make_buffer_verify_dict(0, 32)
verify_locals = {
"argc": {"equals": {"type": "int", "value": "1"}},
"argc": {
"equals": {"type": "int", "value": "1"},
"declaration": {
"equals": {"line": 12, "column": 14},
"contains": {"path": ["lldb-dap", "variables", "main.cpp"]},
},
},
"argv": {
"equals": {"type": "const char **"},
"startswith": {"value": "0x"},
Expand Down
41 changes: 41 additions & 0 deletions lldb/tools/lldb-dap/JSONUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1098,6 +1098,29 @@ std::string CreateUniqueVariableNameForDisplay(lldb::SBValue v,
// can use this optional information to present the
// children in a paged UI and fetch them in chunks."
// }
// "declaration": {
// "type": "object | undefined",
// "description": "Extension to the protocol that indicates the source
// location where the variable was declared. This value
// might not be present if no declaration is available.",
// "properties": {
// "path": {
// "type": "string | undefined",
// "description": "The source file path where the variable was
// declared."
// },
// "line": {
// "type": "number | undefined",
// "description": "The 1-indexed source line where the variable was
// declared."
// },
// "column": {
// "type": "number | undefined",
// "description": "The 1-indexed source column where the variable was
// declared."
// }
// }
// }
// },
// "required": [ "name", "value", "variablesReference" ]
// }
Expand Down Expand Up @@ -1162,6 +1185,24 @@ llvm::json::Value CreateVariable(lldb::SBValue v, int64_t variablesReference,
const char *evaluateName = evaluateStream.GetData();
if (evaluateName && evaluateName[0])
EmplaceSafeString(object, "evaluateName", std::string(evaluateName));

if (lldb::SBDeclaration decl = v.GetDeclaration(); decl.IsValid()) {
llvm::json::Object decl_obj;
if (lldb::SBFileSpec file = decl.GetFileSpec(); file.IsValid()) {
char path[PATH_MAX] = "";
if (file.GetPath(path, sizeof(path)) &&
lldb::SBFileSpec::ResolvePath(path, path, PATH_MAX)) {
decl_obj.try_emplace("path", std::string(path));
}
}

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("declaration", std::move(decl_obj));
}
return llvm::json::Value(std::move(object));
}

Expand Down

0 comments on commit ad6510e

Please sign in to comment.