[clang-tools-extra] Implemented recursive search for findImplementations (PR #177564)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 23 02:29:47 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangd
Author: None (timon-ul)
<details>
<summary>Changes</summary>
As described in [this comment](https://github.com/llvm/llvm-project/pull/177273#issuecomment-3787825323) this is a split of the PR since these changes can stand on their own.
---
Full diff: https://github.com/llvm/llvm-project/pull/177564.diff
2 Files Affected:
- (modified) clang-tools-extra/clangd/XRefs.cpp (+23-18)
- (modified) clang-tools-extra/clangd/unittests/XRefsTests.cpp (+2-2)
``````````diff
diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp
index 8a24d19a7d129..dbc75c2868c47 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -306,25 +306,30 @@ std::vector<LocatedSymbol> findImplementors(llvm::DenseSet<SymbolID> IDs,
RelationsRequest Req;
Req.Predicate = Predicate;
- Req.Subjects = std::move(IDs);
+ llvm::DenseSet<SymbolID> RecursiveSearch = std::move(IDs);
std::vector<LocatedSymbol> Results;
- Index->relations(Req, [&](const SymbolID &Subject, const Symbol &Object) {
- auto DeclLoc =
- indexToLSPLocation(Object.CanonicalDeclaration, MainFilePath);
- if (!DeclLoc) {
- elog("Find overrides: {0}", DeclLoc.takeError());
- return;
- }
- Results.emplace_back();
- Results.back().Name = Object.Name.str();
- Results.back().PreferredDeclaration = *DeclLoc;
- auto DefLoc = indexToLSPLocation(Object.Definition, MainFilePath);
- if (!DefLoc) {
- elog("Failed to convert location: {0}", DefLoc.takeError());
- return;
- }
- Results.back().Definition = *DefLoc;
- });
+ while (!RecursiveSearch.empty()) {
+ Req.Subjects = std::move(RecursiveSearch);
+ RecursiveSearch = {};
+ Index->relations(Req, [&](const SymbolID &Subject, const Symbol &Object) {
+ RecursiveSearch.insert(Object.ID);
+ auto DeclLoc =
+ indexToLSPLocation(Object.CanonicalDeclaration, MainFilePath);
+ if (!DeclLoc) {
+ elog("Find overrides: {0}", DeclLoc.takeError());
+ return;
+ }
+ Results.emplace_back();
+ Results.back().Name = Object.Name.str();
+ Results.back().PreferredDeclaration = *DeclLoc;
+ auto DefLoc = indexToLSPLocation(Object.Definition, MainFilePath);
+ if (!DefLoc) {
+ elog("Failed to convert location: {0}", DefLoc.takeError());
+ return;
+ }
+ Results.back().Definition = *DefLoc;
+ });
+ }
return Results;
}
diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
index 4106c6cf7b2d0..0fd0f33500006 100644
--- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -1878,8 +1878,8 @@ TEST(FindImplementations, Inheritance) {
virtual void B$2^ar();
void Concrete(); // No implementations for concrete methods.
};
- struct Child2 : Child1 {
- void $3[[Foo]]() override;
+ struct $0[[Child2]] : Child1 {
+ void $1[[$3[[Foo]]]]() override;
void $2[[Bar]]() override;
};
void FromReference() {
``````````
</details>
https://github.com/llvm/llvm-project/pull/177564
More information about the cfe-commits
mailing list