https://github.com/HighCommander4 updated 
https://github.com/llvm/llvm-project/pull/133681

>From bd514d4ab9a593f33ef36f9bc3fa888a17b633d7 Mon Sep 17 00:00:00 2001
From: Nathan Ridge <zeratul...@hotmail.com>
Date: Mon, 31 Mar 2025 02:25:45 -0400
Subject: [PATCH] [clangd] Store documentation when indexing standard library

Fixes https://github.com/clangd/clangd/issues/2344
---
 clang-tools-extra/clangd/index/Background.cpp |  2 +-
 .../clangd/index/IndexAction.cpp              | 15 ++++----
 clang-tools-extra/clangd/index/IndexAction.h  | 15 +++++---
 clang-tools-extra/clangd/index/StdLib.cpp     |  4 +-
 .../clangd/indexer/IndexerMain.cpp            |  2 +-
 .../clangd/unittests/IndexActionTests.cpp     |  2 +-
 .../clangd/unittests/StdLibTests.cpp          | 37 +++++++++++++++++++
 .../clangd/unittests/SyncAPI.cpp              |  7 ++++
 clang-tools-extra/clangd/unittests/SyncAPI.h  |  3 ++
 9 files changed, 69 insertions(+), 18 deletions(-)

diff --git a/clang-tools-extra/clangd/index/Background.cpp 
b/clang-tools-extra/clangd/index/Background.cpp
index 496d1455def4b..ee5d8cfee6091 100644
--- a/clang-tools-extra/clangd/index/Background.cpp
+++ b/clang-tools-extra/clangd/index/Background.cpp
@@ -308,7 +308,7 @@ llvm::Error BackgroundIndex::index(tooling::CompileCommand 
Cmd) {
   IndexOpts.CollectMainFileRefs = true;
 
   IndexFileIn Index;
-  auto Action = createStaticIndexingAction(
+  auto Action = createIndexingAction(
       IndexOpts, [&](SymbolSlab S) { Index.Symbols = std::move(S); },
       [&](RefSlab R) { Index.Refs = std::move(R); },
       [&](RelationSlab R) { Index.Relations = std::move(R); },
diff --git a/clang-tools-extra/clangd/index/IndexAction.cpp 
b/clang-tools-extra/clangd/index/IndexAction.cpp
index ed56c2a9d2e81..1bd539ebcb8e7 100644
--- a/clang-tools-extra/clangd/index/IndexAction.cpp
+++ b/clang-tools-extra/clangd/index/IndexAction.cpp
@@ -209,12 +209,13 @@ class IndexAction : public ASTFrontendAction {
 
 } // namespace
 
-std::unique_ptr<FrontendAction> createStaticIndexingAction(
-    SymbolCollector::Options Opts,
-    std::function<void(SymbolSlab)> SymbolsCallback,
-    std::function<void(RefSlab)> RefsCallback,
-    std::function<void(RelationSlab)> RelationsCallback,
-    std::function<void(IncludeGraph)> IncludeGraphCallback) {
+std::unique_ptr<FrontendAction>
+createIndexingAction(SymbolCollector::Options Opts,
+                     std::function<void(SymbolSlab)> SymbolsCallback,
+                     std::function<void(RefSlab)> RefsCallback,
+                     std::function<void(RelationSlab)> RelationsCallback,
+                     std::function<void(IncludeGraph)> IncludeGraphCallback,
+                     IndexActionKind Kind) {
   index::IndexingOptions IndexOpts;
   IndexOpts.SystemSymbolFilter =
       index::IndexingOptions::SystemSymbolFilterKind::All;
@@ -223,7 +224,7 @@ std::unique_ptr<FrontendAction> createStaticIndexingAction(
   Opts.CollectIncludePath = true;
   if (Opts.Origin == SymbolOrigin::Unknown)
     Opts.Origin = SymbolOrigin::Static;
-  Opts.StoreAllDocumentation = false;
+  Opts.StoreAllDocumentation = (Kind == IndexActionKind::Stdlib);
   if (RefsCallback != nullptr) {
     Opts.RefFilter = RefKind::All;
     Opts.RefsInHeaders = true;
diff --git a/clang-tools-extra/clangd/index/IndexAction.h 
b/clang-tools-extra/clangd/index/IndexAction.h
index ecd1f63fb00f2..c1073a640057d 100644
--- a/clang-tools-extra/clangd/index/IndexAction.h
+++ b/clang-tools-extra/clangd/index/IndexAction.h
@@ -15,6 +15,8 @@
 namespace clang {
 namespace clangd {
 
+enum class IndexActionKind { Static, Stdlib };
+
 // Creates an action that indexes translation units and delivers the results
 // for SymbolsCallback (each slab corresponds to one TU).
 //
@@ -23,12 +25,13 @@ namespace clangd {
 //   - references are always counted
 //   - all references are collected (if RefsCallback is non-null)
 //   - the symbol origin is set to Static if not specified by caller
-std::unique_ptr<FrontendAction> createStaticIndexingAction(
-    SymbolCollector::Options Opts,
-    std::function<void(SymbolSlab)> SymbolsCallback,
-    std::function<void(RefSlab)> RefsCallback,
-    std::function<void(RelationSlab)> RelationsCallback,
-    std::function<void(IncludeGraph)> IncludeGraphCallback);
+std::unique_ptr<FrontendAction>
+createIndexingAction(SymbolCollector::Options Opts,
+                     std::function<void(SymbolSlab)> SymbolsCallback,
+                     std::function<void(RefSlab)> RefsCallback,
+                     std::function<void(RelationSlab)> RelationsCallback,
+                     std::function<void(IncludeGraph)> IncludeGraphCallback,
+                     IndexActionKind Kind = IndexActionKind::Static);
 
 } // namespace clangd
 } // namespace clang
diff --git a/clang-tools-extra/clangd/index/StdLib.cpp 
b/clang-tools-extra/clangd/index/StdLib.cpp
index d34838a45048d..1ee51cd369e5b 100644
--- a/clang-tools-extra/clangd/index/StdLib.cpp
+++ b/clang-tools-extra/clangd/index/StdLib.cpp
@@ -235,9 +235,9 @@ SymbolSlab indexStandardLibrary(llvm::StringRef 
HeaderSources,
   // everything first.
 
   // Refs, relations, include graph in the stdlib mostly aren't useful.
-  auto Action = createStaticIndexingAction(
+  auto Action = createIndexingAction(
       IndexOpts, [&](SymbolSlab S) { Symbols = std::move(S); }, nullptr,
-      nullptr, nullptr);
+      nullptr, nullptr, IndexActionKind::Stdlib);
 
   if (!Action->BeginSourceFile(*Clang, Input)) {
     elog("Standard Library Index: BeginSourceFile() failed");
diff --git a/clang-tools-extra/clangd/indexer/IndexerMain.cpp 
b/clang-tools-extra/clangd/indexer/IndexerMain.cpp
index bc5d1a7408991..4575209f4ece4 100644
--- a/clang-tools-extra/clangd/indexer/IndexerMain.cpp
+++ b/clang-tools-extra/clangd/indexer/IndexerMain.cpp
@@ -65,7 +65,7 @@ class IndexActionFactory : public 
tooling::FrontendActionFactory {
       std::lock_guard<std::mutex> Lock(FilesMu);
       return Files.insert(*AbsPath).second; // Skip already processed files.
     };
-    return createStaticIndexingAction(
+    return createIndexingAction(
         Opts,
         [&](SymbolSlab S) {
           // Merge as we go.
diff --git a/clang-tools-extra/clangd/unittests/IndexActionTests.cpp 
b/clang-tools-extra/clangd/unittests/IndexActionTests.cpp
index 2a9b8c9a1d338..858b224ffb13b 100644
--- a/clang-tools-extra/clangd/unittests/IndexActionTests.cpp
+++ b/clang-tools-extra/clangd/unittests/IndexActionTests.cpp
@@ -85,7 +85,7 @@ class IndexActionTest : public ::testing::Test {
     llvm::IntrusiveRefCntPtr<FileManager> Files(
         new FileManager(FileSystemOptions(), InMemoryFileSystem));
 
-    auto Action = createStaticIndexingAction(
+    auto Action = createIndexingAction(
         Opts, [&](SymbolSlab S) { IndexFile.Symbols = std::move(S); },
         [&](RefSlab R) { IndexFile.Refs = std::move(R); },
         [&](RelationSlab R) { IndexFile.Relations = std::move(R); },
diff --git a/clang-tools-extra/clangd/unittests/StdLibTests.cpp 
b/clang-tools-extra/clangd/unittests/StdLibTests.cpp
index a7a33f78303d3..00c6d629e1c25 100644
--- a/clang-tools-extra/clangd/unittests/StdLibTests.cpp
+++ b/clang-tools-extra/clangd/unittests/StdLibTests.cpp
@@ -158,6 +158,43 @@ TEST(StdLibTests, EndToEnd) {
       UnorderedElementsAre(StdlibSymbol("list"), StdlibSymbol("vector")));
 }
 
+TEST(StdLibTests, StdLibDocComments) {
+  Config Cfg;
+  Cfg.Index.StandardLibrary = true;
+  WithContextValue Enabled(Config::Key, std::move(Cfg));
+
+  MockFS FS;
+  FS.Files["stdlib/vector"] = R"cpp(
+    namespace std {
+      template <typename T>
+      class vector {
+      public:
+        /**doc comment*/
+        unsigned int size() const;
+      };
+    }
+  )cpp";
+  MockCompilationDatabase CDB;
+  CDB.ExtraClangFlags.push_back("-isystem" + testPath("stdlib"));
+  ClangdServer::Options Opts = ClangdServer::optsForTest();
+  Opts.BuildDynamicSymbolIndex = true; // also used for stdlib index
+  ClangdServer Server(CDB, FS, Opts);
+
+  Annotations A(R"cpp(
+    #include <vector>
+    void foo() {
+      std::vector<int> v;
+      v.si^ze();
+    }
+  )cpp");
+
+  Server.addDocument(testPath("foo.cc"), A.code());
+  ASSERT_TRUE(Server.blockUntilIdleForTest());
+  auto HI = cantFail(runHover(Server, testPath("foo.cc"), A.point()));
+  EXPECT_TRUE(HI.has_value());
+  EXPECT_EQ(HI->Documentation, "doc comment");
+}
+
 } // namespace
 } // namespace clangd
 } // namespace clang
diff --git a/clang-tools-extra/clangd/unittests/SyncAPI.cpp 
b/clang-tools-extra/clangd/unittests/SyncAPI.cpp
index d48622eba5378..00bec7afd1a98 100644
--- a/clang-tools-extra/clangd/unittests/SyncAPI.cpp
+++ b/clang-tools-extra/clangd/unittests/SyncAPI.cpp
@@ -68,6 +68,13 @@ template <typename T> CaptureProxy<T> 
capture(std::optional<T> &Target) {
 }
 } // namespace
 
+llvm::Expected<std::optional<HoverInfo>> runHover(ClangdServer &Server,
+                                                  PathRef File, Position Pos) {
+  std::optional<llvm::Expected<std::optional<HoverInfo>>> HI;
+  Server.findHover(File, Pos, capture(HI));
+  return std::move(*HI);
+}
+
 llvm::Expected<CodeCompleteResult>
 runCodeComplete(ClangdServer &Server, PathRef File, Position Pos,
                 clangd::CodeCompleteOptions Opts) {
diff --git a/clang-tools-extra/clangd/unittests/SyncAPI.h 
b/clang-tools-extra/clangd/unittests/SyncAPI.h
index cf3de4f742e84..e0c7c4d72e73e 100644
--- a/clang-tools-extra/clangd/unittests/SyncAPI.h
+++ b/clang-tools-extra/clangd/unittests/SyncAPI.h
@@ -29,6 +29,9 @@ void runAddDocument(ClangdServer &Server, PathRef File, 
StringRef Contents,
                     WantDiagnostics WantDiags = WantDiagnostics::Auto,
                     bool ForceRebuild = false);
 
+llvm::Expected<std::optional<HoverInfo>> runHover(ClangdServer &Server,
+                                                  PathRef File, Position Pos);
+
 llvm::Expected<CodeCompleteResult>
 runCodeComplete(ClangdServer &Server, PathRef File, Position Pos,
                 clangd::CodeCompleteOptions Opts);

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to