diff --git a/clang-tools-extra/clangd/index/Merge.cpp b/clang-tools-extra/clangd/index/Merge.cpp --- a/clang-tools-extra/clangd/index/Merge.cpp +++ b/clang-tools-extra/clangd/index/Merge.cpp @@ -186,11 +186,17 @@ S.Signature = O.Signature; if (S.CompletionSnippetSuffix == "") S.CompletionSnippetSuffix = O.CompletionSnippetSuffix; - // Don't accept documentation from bare forward declarations, if there is a - // definition and it didn't provide one. S is often an undocumented class, - // and O is a non-canonical forward decl preceded by an irrelevant comment. - if (S.Documentation == "" && !S.Definition) - S.Documentation = O.Documentation; + if (S.Documentation == "") { + // Don't accept documentation from bare forward class declarations, if there + // is a definition and it didn't provide one. S is often an undocumented + // class, and O is a non-canonical forward decl preceded by an irrelevant + // comment. + bool IsClass = S.SymInfo.Kind == index::SymbolKind::Class || + S.SymInfo.Kind == index::SymbolKind::Struct || + S.SymInfo.Kind == index::SymbolKind::Union; + if (!IsClass || !S.Definition) + S.Documentation = O.Documentation; + } if (S.ReturnType == "") S.ReturnType = O.ReturnType; if (S.Type == "") diff --git a/clang-tools-extra/clangd/unittests/IndexTests.cpp b/clang-tools-extra/clangd/unittests/IndexTests.cpp --- a/clang-tools-extra/clangd/unittests/IndexTests.cpp +++ b/clang-tools-extra/clangd/unittests/IndexTests.cpp @@ -408,13 +408,20 @@ } TEST(MergeIndexTest, NonDocumentation) { + using index::SymbolKind; Symbol L, R; L.ID = R.ID = SymbolID("x"); L.Definition.FileURI = "file:/x.h"; R.Documentation = "Forward declarations because x.h is too big to include"; - - Symbol M = mergeSymbol(L, R); - EXPECT_EQ(M.Documentation, ""); + for (auto ClassLikeKind : + {SymbolKind::Class, SymbolKind::Struct, SymbolKind::Union}) { + L.SymInfo.Kind = ClassLikeKind; + EXPECT_EQ(mergeSymbol(L, R).Documentation, ""); + } + + L.SymInfo.Kind = SymbolKind::Function; + R.Documentation = "Documentation from non-class symbols should be included"; + EXPECT_EQ(mergeSymbol(L, R).Documentation, R.Documentation); } MATCHER_P2(IncludeHeaderWithRef, IncludeHeader, References, "") {