Author: Nathan Ridge Date: 2020-03-17T18:13:07-04:00 New Revision: 31b7f0ed6a93c0f2601ef856cf68e9cc2f83d8a8
URL: https://github.com/llvm/llvm-project/commit/31b7f0ed6a93c0f2601ef856cf68e9cc2f83d8a8 DIFF: https://github.com/llvm/llvm-project/commit/31b7f0ed6a93c0f2601ef856cf68e9cc2f83d8a8.diff LOG: [clangd] Extend findTarget()'s dependent name heuristic to handle enumerators Fixes https://github.com/clangd/clangd/issues/296 Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D76103 Added: Modified: clang-tools-extra/clangd/FindTarget.cpp clang-tools-extra/clangd/unittests/XRefsTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp index 4528e2a77164..3757f4da97f9 100644 --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -37,6 +37,7 @@ #include "llvm/Support/Casting.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/raw_ostream.h" +#include <iterator> #include <utility> #include <vector> @@ -76,6 +77,11 @@ std::vector<const NamedDecl *> getMembersReferencedViaDependentName( bool IsNonstaticMember) { if (!T) return {}; + if (auto *ET = T->getAs<EnumType>()) { + auto Result = + ET->getDecl()->lookup(NameFactory(ET->getDecl()->getASTContext())); + return {Result.begin(), Result.end()}; + } if (auto *ICNT = T->getAs<InjectedClassNameType>()) { T = ICNT->getInjectedSpecializationType().getTypePtrOrNull(); } diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 1e687fd109e3..32a89df424e4 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -529,6 +529,14 @@ TEST(LocateSymbol, All) { void test(unique_ptr<S<T>>& V) { V->fo^o(); } + )cpp", + + R"cpp(// Heuristic resolution of dependent enumerator + template <typename T> + struct Foo { + enum class E { [[A]], B }; + E e = E::A^; + }; )cpp"}; for (const char *Test : Tests) { Annotations T(Test); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits