https://github.com/timon-ul created https://github.com/llvm/llvm-project/pull/177564
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. >From 3c3921d92e7f71230abacb56382ea1b47c51cbf5 Mon Sep 17 00:00:00 2001 From: Timon Ulrich <[email protected]> Date: Fri, 23 Jan 2026 11:27:30 +0100 Subject: [PATCH] Implemented recursive search for findImplementations --- clang-tools-extra/clangd/XRefs.cpp | 41 +++++++++++-------- .../clangd/unittests/XRefsTests.cpp | 4 +- 2 files changed, 25 insertions(+), 20 deletions(-) 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() { _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
