[clang-tools-extra] 33e978f - [clangd] Make inline friend functions appear in document symbols (#150629)

via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 30 01:43:35 PDT 2025


Author: Christian Kandeler
Date: 2025-07-30T10:43:32+02:00
New Revision: 33e978fbfa25fa98bd521222298e903c3f324a60

URL: https://github.com/llvm/llvm-project/commit/33e978fbfa25fa98bd521222298e903c3f324a60
DIFF: https://github.com/llvm/llvm-project/commit/33e978fbfa25fa98bd521222298e903c3f324a60.diff

LOG: [clangd] Make inline friend functions appear in document symbols (#150629)

Otherwise, that definition would not show up in the document outline.

Added: 
    

Modified: 
    clang-tools-extra/clangd/FindSymbols.cpp
    clang-tools-extra/clangd/unittests/FindSymbolsTests.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp
index 84bcbc1f2ddd3..7655a39d5ba1f 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,17 @@ class DocumentOutline {
         D = TD;
     }
 
+    // FriendDecls don't act as DeclContexts, but they might wrap a function
+    // definition that won't be visible through other means in the AST. Hence
+    // unwrap it here instead.
+    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),


        


More information about the cfe-commits mailing list