summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang-tools-extra/clangd/index/FileIndex.cpp4
-rw-r--r--clang-tools-extra/clangd/index/IndexAction.cpp1
-rw-r--r--clang-tools-extra/clangd/index/SymbolCollector.cpp11
-rw-r--r--clang-tools-extra/clangd/index/SymbolCollector.h4
-rw-r--r--clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp31
5 files changed, 43 insertions, 8 deletions
diff --git a/clang-tools-extra/clangd/index/FileIndex.cpp b/clang-tools-extra/clangd/index/FileIndex.cpp
index bc102d29de9..37fd031e09f 100644
--- a/clang-tools-extra/clangd/index/FileIndex.cpp
+++ b/clang-tools-extra/clangd/index/FileIndex.cpp
@@ -45,9 +45,13 @@ indexSymbols(ASTContext &AST, std::shared_ptr<Preprocessor> PP,
if (IsIndexMainAST) {
// We only collect refs when indexing main AST.
CollectorOpts.RefFilter = RefKind::All;
+ // Comments for main file can always be obtained from sema, do not store
+ // them in the index.
+ CollectorOpts.StoreAllDocumentation = false;
} else {
IndexOpts.IndexMacrosInPreprocessor = true;
CollectorOpts.CollectMacro = true;
+ CollectorOpts.StoreAllDocumentation = true;
}
SymbolCollector Collector(std::move(CollectorOpts));
diff --git a/clang-tools-extra/clangd/index/IndexAction.cpp b/clang-tools-extra/clangd/index/IndexAction.cpp
index a6df64b7be3..b9b7ef2da46 100644
--- a/clang-tools-extra/clangd/index/IndexAction.cpp
+++ b/clang-tools-extra/clangd/index/IndexAction.cpp
@@ -175,6 +175,7 @@ std::unique_ptr<FrontendAction> createStaticIndexingAction(
Opts.CollectIncludePath = true;
Opts.CountReferences = true;
Opts.Origin = SymbolOrigin::Static;
+ Opts.StoreAllDocumentation = false;
if (RefsCallback != nullptr) {
Opts.RefFilter = RefKind::All;
Opts.RefsInHeaders = true;
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index cbbbd505762..23fcc5c57ac 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -566,18 +566,13 @@ const Symbol *SymbolCollector::addDeclaration(const NamedDecl &ND,
std::string Documentation =
formatDocumentation(*CCS, getDocComment(Ctx, SymbolCompletion,
/*CommentsFromHeaders=*/true));
- // For symbols not indexed for completion (class members), we also store their
- // docs in the index, because Sema doesn't load the docs from the preamble, we
- // rely on the index to get the docs.
- // FIXME: this can be optimized by only storing the docs in dynamic index --
- // dynamic index should index these symbols when Sema completes a member
- // completion.
- S.Documentation = Documentation;
if (!(S.Flags & Symbol::IndexedForCodeCompletion)) {
+ if (Opts.StoreAllDocumentation)
+ S.Documentation = Documentation;
Symbols.insert(S);
return Symbols.find(S.ID);
}
-
+ S.Documentation = Documentation;
std::string Signature;
std::string SnippetSuffix;
getSignature(*CCS, &Signature, &SnippetSuffix);
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.h b/clang-tools-extra/clangd/index/SymbolCollector.h
index 1b10df4c90d..0261bf7cb22 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.h
+++ b/clang-tools-extra/clangd/index/SymbolCollector.h
@@ -75,6 +75,10 @@ public:
/// Collect symbols local to main-files, such as static functions
/// and symbols inside an anonymous namespace.
bool CollectMainFileSymbols = true;
+ /// If set to true, SymbolCollector will collect doc for all symbols.
+ /// Note that documents of symbols being indexed for completion will always
+ /// be collected regardless of this option.
+ bool StoreAllDocumentation = false;
/// If this is set, only collect symbols/references from a file if
/// `FileFilter(SM, FID)` is true. If not set, all files are indexed.
std::function<bool(const SourceManager &, FileID)> FileFilter = nullptr;
diff --git a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp
index 258cfa9dc67..a9e1f2e697a 100644
--- a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp
+++ b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp
@@ -212,6 +212,12 @@ public:
return WrapperFrontendAction::CreateASTConsumer(CI, InFile);
}
+ bool BeginInvocation(CompilerInstance &CI) override {
+ // Make the compiler parse all comments.
+ CI.getLangOpts().CommentOpts.ParseAllComments = true;
+ return WrapperFrontendAction::BeginInvocation(CI);
+ }
+
private:
index::IndexingOptions IndexOpts;
CommentHandler *PragmaHandler;
@@ -710,6 +716,31 @@ TEST_F(SymbolCollectorTest, SymbolsInMainFile) {
QName("main_f")));
}
+TEST_F(SymbolCollectorTest, Documentation) {
+ const std::string Header = R"(
+ // Doc Foo
+ class Foo {
+ // Doc f
+ int f();
+ };
+ )";
+ CollectorOpts.StoreAllDocumentation = false;
+ runSymbolCollector(Header, /* Main */ "");
+ EXPECT_THAT(Symbols,
+ UnorderedElementsAre(
+ AllOf(QName("Foo"), Doc("Doc Foo"), ForCodeCompletion(true)),
+ AllOf(QName("Foo::f"), Doc(""), ReturnType(""),
+ ForCodeCompletion(false))));
+
+ CollectorOpts.StoreAllDocumentation = true;
+ runSymbolCollector(Header, /* Main */ "");
+ EXPECT_THAT(Symbols,
+ UnorderedElementsAre(
+ AllOf(QName("Foo"), Doc("Doc Foo"), ForCodeCompletion(true)),
+ AllOf(QName("Foo::f"), Doc("Doc f"), ReturnType(""),
+ ForCodeCompletion(false))));
+}
+
TEST_F(SymbolCollectorTest, ClassMembers) {
const std::string Header = R"(
class Foo {
OpenPOWER on IntegriCloud