[clang-tools-extra] 6324912 - [clangd] Simplify "preferred" vs "definition" logic a bit in XRefs AST code.
Sam McCall via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 26 01:53:26 PDT 2020
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(
More information about the cfe-commits
mailing list