https://github.com/ashgti created https://github.com/llvm/llvm-project/pull/146773
This partially fixes https://github.com/llvm/llvm-project/issues/146559. When hovering over variables while debugging with lldb-dap we are receiving hover requests that include symbols. For example, if you have: ``` MyClass *foo; ``` and hover over 'foo', the request will contain the expression `expression="*foo"` and we're evaluating the dereference, so you end up with different hover results vs the variables view. A more complete solution would be to implement an [EvaluatableExpressionProvider](https://code.visualstudio.com/api/references/vscode-api#EvaluatableExpressionProvider) in the VS Code extension. For example, if you have a declaration without any whitespace like ```c char*foo = "bar"; ``` And try to hover over 'foo', the request will be `expression="char*foo"`. >From 2674e5af817e1e6b06521c7b7f39b23150aed747 Mon Sep 17 00:00:00 2001 From: John Harrison <harj...@google.com> Date: Wed, 2 Jul 2025 13:05:31 -0700 Subject: [PATCH] [lldb-dap] Improving 'variables' hover requests. This partially fixes https://github.com/llvm/llvm-project/issues/146559. When hovering over variables while debugging with lldb-dap we are receiving hover requests that include symbols. For example, if you have: ``` MyClass *foo; ``` and hover over 'foo', the request will contain the expression `expression="*foo"` and we're evaluating the dereference, so you end up with different hover results vs the variables view. A more complete solution would be to implement an [EvaluatableExpressionProvider](https://code.visualstudio.com/api/references/vscode-api#EvaluatableExpressionProvider) in the VS Code extension. For example, if you have a declaration without any whitespace like ```c char*foo = "bar"; ``` And try to hover over 'foo', the request will be `expression="char*foo"`. --- lldb/test/API/tools/lldb-dap/memory/TestDAP_memory.py | 2 +- lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lldb/test/API/tools/lldb-dap/memory/TestDAP_memory.py b/lldb/test/API/tools/lldb-dap/memory/TestDAP_memory.py index 55fb4a961e783..30ee7a1631e29 100644 --- a/lldb/test/API/tools/lldb-dap/memory/TestDAP_memory.py +++ b/lldb/test/API/tools/lldb-dap/memory/TestDAP_memory.py @@ -92,7 +92,7 @@ def test_readMemory(self): ) self.continue_to_next_stop() - ptr_deref = self.dap_server.request_evaluate("*rawptr")["body"] + ptr_deref = self.dap_server.request_evaluate("*rawptr", context="repl")["body"] memref = ptr_deref["memoryReference"] # We can read the complete string diff --git a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp index e1556846dff19..e2161eb999e82 100644 --- a/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp +++ b/lldb/tools/lldb-dap/Handler/EvaluateRequestHandler.cpp @@ -181,7 +181,17 @@ void EvaluateRequestHandler::operator()( expression = dap.last_nonempty_var_expression; else dap.last_nonempty_var_expression = expression; + } else { + // If this isn't a REPL context, trim leading pointer/reference characters + // to ensure we return the actual value of the expression. + // This can come up if you hover over a pointer or reference declaration + // like 'MyType *foo;' or `void fn(std::string &arg)`, which results in + // the hover request sending '*foo' or `&arg`. When we're not in the REPL, + // we should trim these characters to get to the actual variable, which + // should have the proper type encoded by the compiler. + expression = llvm::StringRef(expression).ltrim("*&").str(); } + // Always try to get the answer from the local variables if possible. If // this fails, then if the context is not "hover", actually evaluate an // expression using the expression parser. _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits