Author: Sam McCall Date: 2020-03-26T09:52:48+01:00 New Revision: 6324912592a1ff8d672e55e02ca63f769decb154
URL: https://github.com/llvm/llvm-project/commit/6324912592a1ff8d672e55e02ca63f769decb154 DIFF: https://github.com/llvm/llvm-project/commit/6324912592a1ff8d672e55e02ca63f769decb154.diff LOG: [clangd] Simplify "preferred" vs "definition" logic a bit in XRefs AST code. Summary: Now Preferred is always the canonical (first) decl, Definition is always the def if available. In practice the index was already forcing this behaviour anyway, so there's no change. (Unless you weren't using this index, in which case this patch makes textDocument/declaration and toggling work as expected). Reviewers: kadircet Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D73369 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 7d55a372905c..7e27be38bcc3 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -226,23 +226,21 @@ locateASTReferent(SourceLocation CurLoc, const syntax::Token *TouchedIdentifier, llvm::DenseMap<SymbolID, size_t> ResultIndex; auto AddResultDecl = [&](const NamedDecl *D) { - const NamedDecl *Def = getDefinition(D); - const NamedDecl *Preferred = Def ? Def : D; - - auto Loc = makeLocation(AST.getASTContext(), nameLocation(*Preferred, SM), - MainFilePath); + D = llvm::cast<NamedDecl>(D->getCanonicalDecl()); + auto Loc = + makeLocation(AST.getASTContext(), nameLocation(*D, SM), MainFilePath); if (!Loc) return; Result.emplace_back(); - Result.back().Name = printName(AST.getASTContext(), *Preferred); + Result.back().Name = printName(AST.getASTContext(), *D); Result.back().PreferredDeclaration = *Loc; - // Preferred is always a definition if possible, so this check works. - if (Def == Preferred) - Result.back().Definition = *Loc; + if (const NamedDecl *Def = getDefinition(D)) + Result.back().Definition = makeLocation( + AST.getASTContext(), nameLocation(*Def, SM), MainFilePath); // Record SymbolID for index lookup later. - if (auto ID = getSymbolID(Preferred)) + if (auto ID = getSymbolID(D)) ResultIndex[*ID] = Result.size() - 1; }; diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index fc36dfa42d7f..6b568456ba02 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -358,15 +358,15 @@ TEST(LocateSymbol, All) { )cpp", R"cpp(// Forward class declaration - class Foo; - class [[Foo]] {}; + class $decl[[Foo]]; + class $def[[Foo]] {}; F^oo* foo(); )cpp", R"cpp(// Function declaration - void foo(); + void $decl[[foo]](); void g() { f^oo(); } - void [[foo]]() {} + void $def[[foo]]() {} )cpp", R"cpp( _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits