Skip to content

Commit 82cebf9

Browse files
fix: Emit refs for various kinds of templates in using decls (#306)
1 parent 5cf4ebf commit 82cebf9

File tree

4 files changed

+46
-2
lines changed

4 files changed

+46
-2
lines changed

indexer/ClangAstMacros.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#define FOR_EACH_DECL_TO_BE_INDEXED(F) \
55
F(Binding) \
6+
F(ClassTemplate) \
67
F(EnumConstant) \
78
F(Enum) \
89
F(Field) \
@@ -13,10 +14,12 @@
1314
F(Record) \
1415
F(TemplateTemplateParm) \
1516
F(TemplateTypeParm) \
17+
F(TypeAliasTemplate) \
1618
F(TypedefName) \
1719
F(UsingShadow) \
1820
F(Using) \
19-
F(Var)
21+
F(Var) \
22+
F(VarTemplate)
2023

2124
#define FOR_EACH_TEMPLATE_PARM_TO_BE_INDEXED(F) \
2225
F(NonTypeTemplateParm) \

indexer/Indexer.cc

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,10 @@ void TuIndexer::saveBindingDecl(const clang::BindingDecl &bindingDecl) {
368368
std::nullopt);
369369
}
370370

371+
void TuIndexer::saveClassTemplateDecl(const clang::ClassTemplateDecl &) {
372+
// We'll emit a def for the inner RecordDecl, so don't do anything here
373+
}
374+
371375
void TuIndexer::saveEnumConstantDecl(
372376
const clang::EnumConstantDecl &enumConstantDecl) {
373377
auto optSymbol =
@@ -695,17 +699,30 @@ void TuIndexer::saveTemplateSpecializationTypeLoc(
695699
}
696700
break;
697701
}
702+
case Kind::UsingTemplate: {
703+
auto *usingShadowDecl = templateName.getAsUsingShadowDecl();
704+
if (auto optSymbol =
705+
this->symbolFormatter.getUsingShadowSymbol(*usingShadowDecl)) {
706+
this->saveReference(*optSymbol,
707+
templateSpecializationTypeLoc.getTemplateNameLoc());
708+
}
709+
break;
710+
}
698711
case Kind::OverloadedTemplate:
699712
case Kind::AssumedTemplate:
700713
case Kind::QualifiedTemplate:
701714
case Kind::DependentTemplate:
702715
case Kind::SubstTemplateTemplateParm:
703716
case Kind::SubstTemplateTemplateParmPack:
704-
case Kind::UsingTemplate:
705717
break;
706718
}
707719
}
708720

721+
void TuIndexer::saveTypeAliasTemplateDecl(
722+
const clang::TypeAliasTemplateDecl &) {
723+
// We'll emit a def for the inner TypeAliasDecl, so don't do anything here
724+
}
725+
709726
void TuIndexer::saveTypedefNameDecl(
710727
const clang::TypedefNameDecl &typedefNameDecl) {
711728
auto optSymbol = this->symbolFormatter.getNamedDeclSymbol(typedefNameDecl);
@@ -774,6 +791,10 @@ void TuIndexer::saveVarDecl(const clang::VarDecl &varDecl) {
774791
}
775792
}
776793

794+
void TuIndexer::saveVarTemplateDecl(const clang::VarTemplateDecl &) {
795+
// Skip emitting a definition here, as we'll emit one for the inner VarDecl.
796+
}
797+
777798
void TuIndexer::saveCXXConstructExpr(
778799
const clang::CXXConstructExpr &cxxConstructExpr) {
779800
if (auto *cxxConstructorDecl = cxxConstructExpr.getConstructor()) {

indexer/SymbolFormatter.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,16 @@ SymbolFormatter::getBindingSymbol(const clang::BindingDecl &bindingDecl) {
359359
return this->getNextLocalSymbol(bindingDecl);
360360
}
361361

362+
std::optional<std::string_view> SymbolFormatter::getClassTemplateSymbol(
363+
const clang::ClassTemplateDecl &classTemplateDecl) {
364+
return this->getRecordSymbol(*classTemplateDecl.getTemplatedDecl());
365+
}
366+
367+
std::optional<std::string_view> SymbolFormatter::getTypeAliasTemplateSymbol(
368+
const clang::TypeAliasTemplateDecl &typeAliasTemplateDecl) {
369+
return this->getTypedefNameSymbol(*typeAliasTemplateDecl.getTemplatedDecl());
370+
}
371+
362372
std::optional<std::string_view>
363373
SymbolFormatter::getNextLocalSymbol(const clang::NamedDecl &decl) {
364374
if (decl.getDeclName().isEmpty()) {
@@ -663,6 +673,11 @@ SymbolFormatter::getVarSymbol(const clang::VarDecl &varDecl) {
663673
});
664674
}
665675

676+
std::optional<std::string_view> SymbolFormatter::getVarTemplateSymbol(
677+
const clang::VarTemplateDecl &varTemplateDecl) {
678+
return this->getVarSymbol(*varTemplateDecl.getTemplatedDecl());
679+
}
680+
666681
std::string_view
667682
SymbolFormatter::formatTemporary(const clang::NamedDecl &namedDecl) {
668683
this->scratchBuffer.clear();

test/index/aliases/aliases.snapshot.cc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,19 +221,24 @@
221221
using k::S;
222222
// ^ reference [..] i/k/
223223
// ^ definition [..] i/S#
224+
// ^ reference [..] i/k/S#
224225
using SS = S<int>;
225226
// ^^ definition [..] i/SS#
227+
// ^ reference [..] i/S#
226228

227229
using j::zero;
228230
// ^ reference [..] i/j/
229231
// ^^^^ definition [..] i/zero.
232+
// ^^^^ reference [..] i/j/zero.
230233
static int zero_int = zero<int>;
231234
// ^^^^^^^^ definition [..] i/zero_int.
232235
// ^^^^ reference [..] i/j/zero.
233236

234237
using k::SAlias;
235238
// ^ reference [..] i/k/
236239
// ^^^^^^ definition [..] i/SAlias#
240+
// ^^^^^^ reference [..] i/k/SAlias#
237241
using SAliasInt = SAlias<int>;
238242
// ^^^^^^^^^ definition [..] i/SAliasInt#
243+
// ^^^^^^ reference [..] i/SAlias#
239244
}

0 commit comments

Comments
 (0)