From 9570f1e5a612348e92c2f149f5073ef06f9e5da5 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Tue, 21 Jan 2020 15:15:06 +0100 Subject: [PATCH] [clangd] Do not duplicate TemplatedDecls in findExplicitReferences Reviewers: hokein Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73101 --- clang-tools-extra/clangd/FindTarget.cpp | 7 +++ .../clangd/unittests/FindTargetTests.cpp | 58 ++++++++++++++++++---- 2 files changed, 54 insertions(+), 11 deletions(-) diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp index bed32c39408..31cdcee0cfe 100644 --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -586,6 +586,13 @@ llvm::SmallVector refInDecl(const Decl *D) { } void VisitNamedDecl(const NamedDecl *ND) { + // We choose to ignore {Class, Function, Var, TypeAlias}TemplateDecls. As + // as their underlying decls, covering the same range, will be visited. + if (llvm::isa(ND) || + llvm::isa(ND) || + llvm::isa(ND) || + llvm::isa(ND)) + return; // FIXME: decide on how to surface destructors when we need them. if (llvm::isa(ND)) return; diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp index c6ad75144f9..ed3da28aa0d 100644 --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -741,21 +741,17 @@ TEST_F(FindExplicitReferencesTest, All) { {R"cpp( namespace foo { template - class $1^$2^Bar { - ~$3^Bar(); - void $4^f($5^Bar); + class $1^Bar { + ~$2^Bar(); + void $3^f($4^Bar); }; } )cpp", "0: targets = {foo::Bar::T}, decl\n" - // FIXME: avoid the 2 duplicated foo::Bar references below, the first - // one comes from ClassTemplateDecl; the second comes from the - // underlying CXXRecordDecl. "1: targets = {foo::Bar}, decl\n" - "2: targets = {foo::Bar}, decl\n" - "3: targets = {foo::Bar}\n" - "4: targets = {foo::Bar::f}, decl\n" - "5: targets = {foo::Bar}\n"}, + "2: targets = {foo::Bar}\n" + "3: targets = {foo::Bar::f}, decl\n" + "4: targets = {foo::Bar}\n"}, // MemberExpr should know their using declaration. {R"cpp( struct X { void func(int); }; @@ -1055,7 +1051,47 @@ TEST_F(FindExplicitReferencesTest, All) { } )cpp", "0: targets = {Test}\n" - "1: targets = {a}, decl\n"}}; + "1: targets = {a}, decl\n"}, + // Templates + {R"cpp( + namespace foo { + template + class $1^Bar {}; + } + )cpp", + "0: targets = {foo::Bar::T}, decl\n" + "1: targets = {foo::Bar}, decl\n"}, + // Templates + {R"cpp( + namespace foo { + template + void $1^func(); + } + )cpp", + "0: targets = {T}, decl\n" + "1: targets = {foo::func}, decl\n"}, + // Templates + {R"cpp( + namespace foo { + template + $1^T $2^x; + } + )cpp", + "0: targets = {foo::T}, decl\n" + "1: targets = {foo::T}\n" + "2: targets = {foo::x}, decl\n"}, + // Templates + {R"cpp( + template class vector {}; + namespace foo { + template + using $1^V = $2^vector<$3^T>; + } + )cpp", + "0: targets = {foo::T}, decl\n" + "1: targets = {foo::V}, decl\n" + "2: targets = {vector}\n" + "3: targets = {foo::T}\n"}}; for (const auto &C : Cases) { llvm::StringRef ExpectedCode = C.first; -- 2.11.0