summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/XRefs.cpp5
-rw-r--r--clang-tools-extra/unittests/clangd/SymbolInfoTests.cpp4
-rw-r--r--clang-tools-extra/unittests/clangd/XRefsTests.cpp10
3 files changed, 13 insertions, 6 deletions
diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp
index b296a056d0c..9d470779f0b 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -39,7 +39,8 @@ const Decl *getDefinition(const Decl *D) {
if (const auto *FD = dyn_cast<FunctionDecl>(D))
return FD->getDefinition();
// Only a single declaration is allowed.
- if (isa<ValueDecl>(D)) // except cases above
+ if (isa<ValueDecl>(D) || isa<TemplateTypeParmDecl>(D) ||
+ isa<TemplateTemplateParmDecl>(D)) // except cases above
return D;
// Multiple definitions are allowed.
return nullptr; // except cases above
@@ -243,6 +244,7 @@ IdentifiedSymbol getSymbolAtPosition(ParsedAST &AST, SourceLocation Pos) {
index::IndexingOptions::SystemSymbolFilterKind::All;
IndexOpts.IndexFunctionLocals = true;
IndexOpts.IndexParametersInDeclarations = true;
+ IndexOpts.IndexTemplateParameters = true;
indexTopLevelDecls(AST.getASTContext(), AST.getPreprocessor(),
AST.getLocalTopLevelDecls(), DeclMacrosFinder, IndexOpts);
@@ -441,6 +443,7 @@ findRefs(const std::vector<const Decl *> &Decls, ParsedAST &AST) {
index::IndexingOptions::SystemSymbolFilterKind::All;
IndexOpts.IndexFunctionLocals = true;
IndexOpts.IndexParametersInDeclarations = true;
+ IndexOpts.IndexTemplateParameters = true;
indexTopLevelDecls(AST.getASTContext(), AST.getPreprocessor(),
AST.getLocalTopLevelDecls(), RefFinder, IndexOpts);
return std::move(RefFinder).take();
diff --git a/clang-tools-extra/unittests/clangd/SymbolInfoTests.cpp b/clang-tools-extra/unittests/clangd/SymbolInfoTests.cpp
index ed34c036f79..7494d90cf40 100644
--- a/clang-tools-extra/unittests/clangd/SymbolInfoTests.cpp
+++ b/clang-tools-extra/unittests/clangd/SymbolInfoTests.cpp
@@ -213,14 +213,14 @@ TEST(SymbolInfoTests, All) {
T^T t;
};
)cpp",
- {/* not implemented */}},
+ {CreateExpectedSymbolDetails("TT", "bar::", "c:TestTU.cpp@65")}},
{
R"cpp( // Template parameter reference - type param
template<int NN> struct bar {
int a = N^N;
};
)cpp",
- {/* not implemented */}},
+ {CreateExpectedSymbolDetails("NN", "bar::", "c:TestTU.cpp@65")}},
{
R"cpp( // Class member reference - objec
struct foo {
diff --git a/clang-tools-extra/unittests/clangd/XRefsTests.cpp b/clang-tools-extra/unittests/clangd/XRefsTests.cpp
index 3b9610cb0d3..f721cf9449e 100644
--- a/clang-tools-extra/unittests/clangd/XRefsTests.cpp
+++ b/clang-tools-extra/unittests/clangd/XRefsTests.cpp
@@ -285,11 +285,15 @@ TEST(LocateSymbol, All) {
}
)cpp",
- /* FIXME: clangIndex doesn't handle template type parameters
R"cpp(// Template type parameter
- template <[[typename T]]>
+ template <typename [[T]]>
void foo() { ^T t; }
- )cpp", */
+ )cpp",
+
+ R"cpp(// Template template type parameter
+ template <template<typename> class [[T]]>
+ void foo() { ^T<int> t; }
+ )cpp",
R"cpp(// Namespace
namespace $decl[[ns]] {
OpenPOWER on IntegriCloud