https://github.com/ckandeler created https://github.com/llvm/llvm-project/pull/150629
Otherwise, that definition would not show up in the document outline. >From 211948b650d2c314df0b1227caf818f33a3975a4 Mon Sep 17 00:00:00 2001 From: Christian Kandeler <christian.kande...@qt.io> Date: Fri, 25 Jul 2025 15:55:32 +0200 Subject: [PATCH] [clangd] Make inline friend functions appear in document symbols Otherwise, that definition would not show up in the document outline. --- clang-tools-extra/clangd/FindSymbols.cpp | 11 +++++++++++ .../clangd/unittests/FindSymbolsTests.cpp | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp index 84bcbc1f2ddd3..26a15d7a54d88 100644 --- a/clang-tools-extra/clangd/FindSymbols.cpp +++ b/clang-tools-extra/clangd/FindSymbols.cpp @@ -14,6 +14,7 @@ #include "SourceCode.h" #include "index/Index.h" #include "support/Logger.h" +#include "clang/AST/DeclFriend.h" #include "clang/AST/DeclTemplate.h" #include "clang/Index/IndexSymbol.h" #include "llvm/ADT/ArrayRef.h" @@ -391,6 +392,16 @@ class DocumentOutline { D = TD; } + // Friend declarations should be traversed if and only if + // they are also defined here. + if (auto *Friend = llvm::dyn_cast<FriendDecl>(D)) { + if (auto *Func = + llvm::dyn_cast_or_null<FunctionDecl>(Friend->getFriendDecl())) { + if (Func->isThisDeclarationADefinition()) + D = Func; + } + } + VisitKind Visit = shouldVisit(D); if (Visit == VisitKind::No) return; diff --git a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp index 282859c51a66f..5b1630eb00cb1 100644 --- a/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp @@ -335,6 +335,7 @@ TEST(DocumentSymbols, BasicSymbols) { Foo(int a) {} void $decl[[f]](); friend void f1(); + friend void f2() {} friend class Friend; Foo& operator=(const Foo&); ~Foo(); @@ -346,7 +347,7 @@ TEST(DocumentSymbols, BasicSymbols) { }; void f1(); - inline void f2() {} + void f2(); static const int KInt = 2; const char* kStr = "123"; @@ -386,6 +387,8 @@ TEST(DocumentSymbols, BasicSymbols) { withDetail("(int)"), children()), AllOf(withName("f"), withKind(SymbolKind::Method), withDetail("void ()"), children()), + AllOf(withName("f2"), withKind(SymbolKind::Function), + withDetail("void ()"), children()), AllOf(withName("operator="), withKind(SymbolKind::Method), withDetail("Foo &(const Foo &)"), children()), AllOf(withName("~Foo"), withKind(SymbolKind::Constructor), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits