[clangd] Don't index template specializations.

Summary:
These have different USRs than the underlying entity, but are not typically
interesting in their own right and can be numerous (e.g. generated traits).

Reviewers: ioeric

Subscribers: klimek, ilya-biryukov, jkorous-apple, cfe-commits

Differential Revision: https://reviews.llvm.org/D44298

llvm-svn: 327127
This commit is contained in:
Sam McCall 2018-03-09 13:25:29 +00:00
parent 3e77b20dba
commit 824913bdb7
2 changed files with 20 additions and 1 deletions

View File

@ -115,10 +115,16 @@ bool shouldFilterDecl(const NamedDecl *ND, ASTContext *ASTCtx,
// * enum constants in unscoped enum decl (e.g. "red" in "enum {red};")
auto InTopLevelScope = hasDeclContext(
anyOf(namespaceDecl(), translationUnitDecl(), linkageSpecDecl()));
// Don't index template specializations.
auto IsSpecialization =
anyOf(functionDecl(isExplicitTemplateSpecialization()),
cxxRecordDecl(isExplicitTemplateSpecialization()),
varDecl(isExplicitTemplateSpecialization()));
if (match(decl(allOf(unless(isExpansionInMainFile()),
anyOf(InTopLevelScope,
hasDeclContext(enumDecl(InTopLevelScope,
unless(isScoped())))))),
unless(isScoped())))),
unless(IsSpecialization))),
*ND, *ASTCtx)
.empty())
return true;

View File

@ -198,6 +198,19 @@ TEST_F(SymbolCollectorTest, CollectSymbols) {
QName("foo::bar::v2"), QName("foo::baz")}));
}
TEST_F(SymbolCollectorTest, Template) {
Annotations Header(R"(
// Template is indexed, specialization and instantiation is not.
template <class T> struct [[Tmpl]] {T x = 0};
template <> struct Tmpl<int> {};
extern template struct Tmpl<float>;
template struct Tmpl<double>;
)");
runSymbolCollector(Header.code(), /*Main=*/"");
EXPECT_THAT(Symbols, UnorderedElementsAreArray({AllOf(
QName("Tmpl"), DeclRange(Header.offsetRange()))}));
}
TEST_F(SymbolCollectorTest, Locations) {
Annotations Header(R"cpp(
// Declared in header, defined in main.