Skip to content

Commit 5cf4ebf

Browse files
fix: Emit defs/refs for using decls involving templates (#305)
1 parent 7ec2d5d commit 5cf4ebf

File tree

3 files changed

+113
-17
lines changed

3 files changed

+113
-17
lines changed

indexer/SymbolFormatter.cc

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -575,22 +575,34 @@ std::optional<std::string_view> SymbolFormatter::getUsingShadowSymbol(
575575
std::string_view disambiguator = "";
576576
// NOTE: First two branches can't be re-ordered as all
577577
// TemplateTypeParmDecls also TypeDecls
578-
if (llvm::dyn_cast<clang::TemplateTypeParmDecl>(canonicalDecl)) {
579-
suffix = scip::Descriptor::TypeParameter;
580-
} else if (llvm::dyn_cast<clang::TypeDecl>(canonicalDecl)) {
581-
suffix = scip::Descriptor::Type;
582-
} else if (llvm::dyn_cast<clang::NamespaceDecl>(canonicalDecl)) {
583-
suffix = scip::Descriptor::Namespace;
584-
} else if (llvm::dyn_cast<clang::EnumConstantDecl>(canonicalDecl)
585-
|| llvm::dyn_cast<clang::FieldDecl>(canonicalDecl)) {
586-
suffix = scip::Descriptor::Term;
587-
} else if (auto *functionDecl =
588-
llvm::dyn_cast<clang::FunctionDecl>(canonicalDecl)) {
589-
disambiguator = this->getFunctionDisambiguator(*functionDecl, buf);
590-
suffix = scip::Descriptor::Method;
591-
} else {
592-
return {};
593-
}
578+
// clang-format off
579+
do {
580+
if (llvm::dyn_cast<clang::TemplateTypeParmDecl>(canonicalDecl)) {
581+
suffix = scip::Descriptor::TypeParameter;
582+
} else if (llvm::isa<clang::TypeDecl>(canonicalDecl)
583+
|| llvm::isa<clang::ClassTemplateDecl>(canonicalDecl)) {
584+
suffix = scip::Descriptor::Type;
585+
} else if (llvm::dyn_cast<clang::NamespaceDecl>(canonicalDecl)) {
586+
suffix = scip::Descriptor::Namespace;
587+
} else if (llvm::isa<clang::EnumConstantDecl>(canonicalDecl)
588+
|| llvm::isa<clang::VarDecl>(canonicalDecl)
589+
|| llvm::isa<clang::VarTemplateDecl>(canonicalDecl)) {
590+
suffix = scip::Descriptor::Term;
591+
} else if (auto *functionDecl = llvm::dyn_cast<clang::FunctionDecl>(canonicalDecl)) {
592+
disambiguator = this->getFunctionDisambiguator(*functionDecl, buf);
593+
suffix = scip::Descriptor::Method;
594+
} else if (auto *funcTemplateDecl = llvm::dyn_cast<clang::FunctionTemplateDecl>(canonicalDecl)) {
595+
disambiguator = this->getFunctionDisambiguator(*funcTemplateDecl->getTemplatedDecl(), buf);
596+
suffix = scip::Descriptor::Method;
597+
} else if (auto *usingTemplateDecl = llvm::dyn_cast<clang::TypeAliasTemplateDecl>(canonicalDecl)) {
598+
canonicalDecl = usingTemplateDecl->getTemplatedDecl();
599+
continue;
600+
} else {
601+
return {};
602+
}
603+
break;
604+
} while (true);
605+
// clang-format on
594606
auto descriptor = DescriptorBuilder{
595607
.name = this->formatTemporary(usingShadowDecl),
596608
.disambiguator = disambiguator,

test/index/aliases/aliases.cc

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,33 @@ namespace z {
8080
namespace i {
8181
namespace j {
8282
void f() {}
83+
84+
template <typename T>
85+
void ft(T) {}
86+
87+
template <typename T>
88+
T zero = 0;
8389
}
8490
using j::f;
8591
void g() { f(); }
86-
}
92+
93+
using j::ft;
94+
void gt() { ft<int>(0); }
95+
96+
namespace k {
97+
template <typename T>
98+
struct S {};
99+
100+
template <typename T>
101+
using SAlias = S<T>;
102+
}
103+
104+
using k::S;
105+
using SS = S<int>;
106+
107+
using j::zero;
108+
static int zero_int = zero<int>;
109+
110+
using k::SAlias;
111+
using SAliasInt = SAlias<int>;
112+
}

test/index/aliases/aliases.snapshot.cc

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@
142142
// ^ reference local 4
143143
using U::identity;
144144
// ^ reference [..] z/U#
145+
// ^^^^^^^^ reference [..] z/U#identity(ada6a8422704cf8a).
146+
// ^^^^^^^^ definition [..] z/V#identity(ada6a8422704cf8a).
145147
};
146148

147149
template <typename T>
@@ -159,6 +161,7 @@
159161
// ^ definition local 6
160162
// ^ reference [..] z/W#v.
161163
// ^^^^^^^^ reference [..] z/V#identity(9b79fb6aee4c0440).
164+
// ^^^^^^^^ reference [..] z/V#identity(ada6a8422704cf8a).
162165
// ^ reference local 5
163166
// ^ reference local 6
164167
};
@@ -170,6 +173,19 @@
170173
// ^ definition [..] i/j/
171174
void f() {}
172175
// ^ definition [..] i/j/f(49f6e7a06ebc5aa8).
176+
177+
template <typename T>
178+
// ^ definition local 7
179+
void ft(T) {}
180+
// ^^ definition [..] i/j/ft(9b289cee16747614).
181+
// ^ reference local 7
182+
183+
template <typename T>
184+
// ^ definition local 8
185+
T zero = 0;
186+
// ^ reference local 8
187+
// ^^^^ definition [..] i/j/zero.
188+
// ^^^^ definition [..] i/j/zero.
173189
}
174190
using j::f;
175191
// ^ reference [..] i/j/
@@ -178,4 +194,46 @@
178194
void g() { f(); }
179195
// ^ definition [..] i/g(49f6e7a06ebc5aa8).
180196
// ^ reference [..] i/f(49f6e7a06ebc5aa8).
197+
198+
using j::ft;
199+
// ^ reference [..] i/j/
200+
// ^^ definition [..] i/ft(9b289cee16747614).
201+
// ^^ reference [..] i/j/ft(9b289cee16747614).
202+
void gt() { ft<int>(0); }
203+
// ^^ definition [..] i/gt(49f6e7a06ebc5aa8).
204+
// ^^ reference [..] i/ft(9b289cee16747614).
205+
206+
namespace k {
207+
// ^ definition [..] i/k/
208+
template <typename T>
209+
// ^ definition local 9
210+
struct S {};
211+
// ^ definition [..] i/k/S#
212+
213+
template <typename T>
214+
// ^ definition local 10
215+
using SAlias = S<T>;
216+
// ^^^^^^ definition [..] i/k/SAlias#
217+
// ^ reference [..] i/k/S#
218+
// ^ reference local 10
219+
}
220+
221+
using k::S;
222+
// ^ reference [..] i/k/
223+
// ^ definition [..] i/S#
224+
using SS = S<int>;
225+
// ^^ definition [..] i/SS#
226+
227+
using j::zero;
228+
// ^ reference [..] i/j/
229+
// ^^^^ definition [..] i/zero.
230+
static int zero_int = zero<int>;
231+
// ^^^^^^^^ definition [..] i/zero_int.
232+
// ^^^^ reference [..] i/j/zero.
233+
234+
using k::SAlias;
235+
// ^ reference [..] i/k/
236+
// ^^^^^^ definition [..] i/SAlias#
237+
using SAliasInt = SAlias<int>;
238+
// ^^^^^^^^^ definition [..] i/SAliasInt#
181239
}

0 commit comments

Comments
 (0)