[clangd] Find definition of ClassTemplate without going through index.

I noticed that, while go-to-def works on cases like:

namespace ns {
  template<typename T> struct Foo {};
}
using ::ns::Fo^o;

it only works because of the FileIndex. We can get definition location
directly from AST too.

Differential Revision: https://reviews.llvm.org/D113029
This commit is contained in:
Adam Czachorowski 2021-11-02 17:40:30 +01:00
parent 2aec2549e8
commit 97fbc975fa
2 changed files with 18 additions and 2 deletions

View File

@ -80,6 +80,9 @@ const NamedDecl *getDefinition(const NamedDecl *D) {
return VD->getDefinition();
if (const auto *FD = dyn_cast<FunctionDecl>(D))
return FD->getDefinition();
if (const auto *CTD = dyn_cast<ClassTemplateDecl>(D))
if (const auto *RD = CTD->getTemplatedDecl())
return RD->getDefinition();
// Objective-C classes can have three types of declarations:
//
// - forward declaration: @class MyClass;

View File

@ -675,7 +675,7 @@ TEST(LocateSymbol, All) {
R"cpp(// Declaration of explicit template specialization
template <typename T>
struct $decl[[Foo]] {};
struct $decl[[$def[[Foo]]]] {};
template <>
struct Fo^o<int> {};
@ -683,12 +683,25 @@ TEST(LocateSymbol, All) {
R"cpp(// Declaration of partial template specialization
template <typename T>
struct $decl[[Foo]] {};
struct $decl[[$def[[Foo]]]] {};
template <typename T>
struct Fo^o<T*> {};
)cpp",
R"cpp(// Definition on ClassTemplateDecl
namespace ns {
// Forward declaration.
template<typename T>
struct $decl[[Foo]];
template <typename T>
struct $def[[Foo]] {};
}
using ::ns::Fo^o;
)cpp",
R"cpp(// auto builtin type (not supported)
^auto x = 42;
)cpp",