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