sourcegraph / scip-clang

Apache License 2.0
44 stars 7 forks source link

Prefer canonical references for using-imported decalrations #320

Open varungandhi-src opened 1 year ago

varungandhi-src commented 1 year ago

Say I have code like the following:

namespace x {
  struct S {};
}
namespace y {
  using x::S; // equivalent to `using S = x::S`
  void f() {
    S{}; y::S{};
  }
}

The question is what should Go to Definition behave like when:

  1. Trying GTD from S{}
  2. Trying GTD from y::S{}

In both cases, GTD in VS Code/clangd shows both the struct and using lines. In CLion, both go directly to the struct line.

As it stands, scip-clang will emit a reference to y::S and take one to the using line directly. While this is technically correct, attempting Go to Definition to the using line doesn't do anything (even though there is a reference to x::S). Example in LLVM:

image

For now, I think we should just emit a reference to the canonical declaration directly. If we add support for some kind of alias role, then we can also emit a definition for the alias declaration.

varungandhi-src commented 1 year ago

We should also do this for declarations inside templates, which currently don't have any occurrence (definition or reference), see the test case added in https://github.com/sourcegraph/scip-clang/pull/321