From: Andy Yankovsky Date: Mon, 8 Nov 2021 14:44:31 +0000 (+0100) Subject: [lldb-vscode] Add presentation hints for scopes X-Git-Tag: upstream/15.0.7~26329 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=dc8f0035ca990fc5587bd508fed609f995e7c842;p=platform%2Fupstream%2Fllvm.git [lldb-vscode] Add presentation hints for scopes Scopes can have an optional hint for how to present this scope in the UI: https://microsoft.github.io/debug-adapter-protocol/specification#Types_Scope The IDEs can use the hint to present the data accordingly. For example, Visual Studio has a separate Registers window, which is populated with the data from the scope with `presentationHint: "registers"`. Reviewed By: wallace Differential Revision: https://reviews.llvm.org/D113400 --- diff --git a/lldb/test/API/tools/lldb-vscode/variables/TestVSCode_variables.py b/lldb/test/API/tools/lldb-vscode/variables/TestVSCode_variables.py index 30a85ec..9a4a5de 100644 --- a/lldb/test/API/tools/lldb-vscode/variables/TestVSCode_variables.py +++ b/lldb/test/API/tools/lldb-vscode/variables/TestVSCode_variables.py @@ -394,3 +394,17 @@ class TestVSCode_variables(lldbvscode_testcase.VSCodeTestCaseBase): self.verify_variables( expandable_expression["children"], response["body"]["variables"] ) + + # Test that frame scopes have corresponding presentation hints. + frame_id = self.vscode.get_stackFrame()["id"] + scopes = self.vscode.request_scopes(frame_id)["body"]["scopes"] + + scope_names = [scope["name"] for scope in scopes] + self.assertIn("Locals", scope_names) + self.assertIn("Registers", scope_names) + + for scope in scopes: + if scope["name"] == "Locals": + self.assertEquals(scope.get("presentationHint"), "locals") + if scope["name"] == "Registers": + self.assertEquals(scope.get("presentationHint"), "registers") diff --git a/lldb/tools/lldb-vscode/JSONUtils.cpp b/lldb/tools/lldb-vscode/JSONUtils.cpp index 0e6227f..58a0879 100644 --- a/lldb/tools/lldb-vscode/JSONUtils.cpp +++ b/lldb/tools/lldb-vscode/JSONUtils.cpp @@ -175,6 +175,13 @@ void FillResponse(const llvm::json::Object &request, // "type": "string", // "description": "Name of the scope such as 'Arguments', 'Locals'." // }, +// "presentationHint": { +// "type": "string", +// "description": "An optional hint for how to present this scope in the +// UI. If this attribute is missing, the scope is shown +// with a generic UI.", +// "_enum": [ "arguments", "locals", "registers" ], +// }, // "variablesReference": { // "type": "integer", // "description": "The variables of this scope can be retrieved by @@ -229,6 +236,15 @@ llvm::json::Value CreateScope(const llvm::StringRef name, int64_t namedVariables, bool expensive) { llvm::json::Object object; EmplaceSafeString(object, "name", name.str()); + + // TODO: Support "arguments" scope. At the moment lldb-vscode includes the + // arguments into the "locals" scope. + if (variablesReference == VARREF_LOCALS) { + object.try_emplace("presentationHint", "locals"); + } else if (variablesReference == VARREF_REGS) { + object.try_emplace("presentationHint", "registers"); + } + object.try_emplace("variablesReference", variablesReference); object.try_emplace("expensive", expensive); object.try_emplace("namedVariables", namedVariables);