[PATCH] D74054: [clangd] Include the underlying decls in go-to-definition.

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 26 07:33:43 PDT 2020


sammccall added a comment.

Sorry about being late coming back to this.



================
Comment at: clang-tools-extra/clangd/XRefs.cpp:307
+    // alias.
+    if (llvm::isa<UsingDecl>(D)) {
+      llvm::for_each(targetDecl(ast_type_traits::DynTypedNode::create(*D),
----------------
I believe this is going to do the wrong thing on overload sets.

```
namespace ns { int x(char); int x(double); }
using ns::x;
int y = ^x('a');
```

getDeclAtPosition(..., TemplatePattern|Alias) will yield UsingDecl, and then targetDecl(UsingDecl, Underlying) will yield both overloads of x.
However getDeclAtPosition(..., Underlying) would correctly return only the desired overload.
(Please add a test like this!)

This is awkward to work around, it's a failure of the targetDecl API. Maybe for now,  call getDeclAtPosition with TemplatePattern|Alias, and if there's exactly one result, replace D with it? And leave a fixme to address more complicated cases somehow.


================
Comment at: clang-tools-extra/clangd/unittests/XRefsTests.cpp:695
+      namespace ns { class [[Foo]] {}; }
+      using ns::[[F^oo]];
+    )cpp",
----------------
nridge wrote:
> Why is it useful to give the using-declaration itself as a result?
> 
> It seems like the more useful behaviour from the user's point of view is to jump directly to the definition of `class Foo`, without having to choose from a popup first.
+1, that would mean adding a continue after the addresultdecl


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D74054/new/

https://reviews.llvm.org/D74054





More information about the cfe-commits mailing list