Prefer canonical references for using-imported decalrations
varungandhi-src opened this issue · comments
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:
- Trying GTD from S{}
- 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](https://user-images.githubusercontent.com/93103176/238823637-75e4fae5-c633-4fe6-bf63-68e01263b10e.png)
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.
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 #321