llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Walter Erquinigo (walter-erquinigo) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/74865.diff 2 Files Affected: - (modified) lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py (+8-2) - (modified) lldb/tools/lldb-dap/JSONUtils.cpp (+41) ``````````diff 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 d2a21ad3cd1d4..9b0755eea7d3e 100644 --- a/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py +++ b/lldb/test/API/tools/lldb-dap/variables/TestDAP_variables.py @@ -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 * @@ -152,7 +152,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"}, diff --git a/lldb/tools/lldb-dap/JSONUtils.cpp b/lldb/tools/lldb-dap/JSONUtils.cpp index 03a43f9da87f2..d8b5636fd03a9 100644 --- a/lldb/tools/lldb-dap/JSONUtils.cpp +++ b/lldb/tools/lldb-dap/JSONUtils.cpp @@ -1101,6 +1101,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" ] // } @@ -1165,6 +1188,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)); } `````````` </details> https://github.com/llvm/llvm-project/pull/74865 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits