Author: Haojian Wu Date: 2020-01-30T12:49:30+01:00 New Revision: 827f49e3faf59f99082d0085de06dcbc09be8ba3
URL: https://github.com/llvm/llvm-project/commit/827f49e3faf59f99082d0085de06dcbc09be8ba3 DIFF: https://github.com/llvm/llvm-project/commit/827f49e3faf59f99082d0085de06dcbc09be8ba3.diff LOG: [clangd] Make go-to-def jumps to overriden methods on `final` specifier. Reviewers: sammccall Reviewed By: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73690 Added: Modified: clang-tools-extra/clangd/XRefs.cpp clang-tools-extra/clangd/unittests/XRefsTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index b302a0d5396c..61dff3e99cae 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -22,6 +22,7 @@ #include "index/SymbolLocation.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/Attrs.inc" #include "clang/AST/Decl.h" #include "clang/AST/DeclCXX.h" #include "clang/AST/DeclTemplate.h" @@ -277,7 +278,9 @@ std::vector<LocatedSymbol> locateSymbolAt(ParsedAST &AST, Position Pos, for (const NamedDecl *D : getDeclAtPosition(AST, SourceLoc, Relations)) { // Special case: void foo() ^override: jump to the overridden method. if (const auto *CMD = llvm::dyn_cast<CXXMethodDecl>(D)) { - const auto *Attr = D->getAttr<OverrideAttr>(); + const InheritableAttr* Attr = D->getAttr<OverrideAttr>(); + if (!Attr) + Attr = D->getAttr<FinalAttr>(); const syntax::Token *Tok = spelledIdentifierTouching(SourceLoc, AST.getTokens()); if (Attr && Tok && diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 348613954a27..226213979b8b 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -452,6 +452,11 @@ TEST(LocateSymbol, All) { class X : Y { void a() ^override {} }; )cpp", + R"cpp(// Final specifier jumps to overridden method + class Y { virtual void $decl[[a]]() = 0; }; + class X : Y { void a() ^final {} }; + )cpp", + R"cpp(// Heuristic resolution of dependent method template <typename T> struct S { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits