summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2019-02-25 16:00:00 +0000
committerHaojian Wu <hokein@google.com>2019-02-25 16:00:00 +0000
commitda79dcc317a60b382c7d694525122d0bb0795e73 (patch)
treeec2ff81a2e31cb4b67f41faef0595fc4a87f7849
parentb504f104b2d9d8eaedd2e687b0f028f63c2c139c (diff)
downloadbcm5719-llvm-da79dcc317a60b382c7d694525122d0bb0795e73.tar.gz
bcm5719-llvm-da79dcc317a60b382c7d694525122d0bb0795e73.zip
[clangd] Drop documentation in static index if symbols are not indexed for completion.
Summary: This is a further optimization of r350803, we drop docs in static index for symbols not being indexed for completion, while keeping the docs in dynamic index (we rely on dynamic index to get docs for class members). Reviewers: ilya-biryukov Reviewed By: ilya-biryukov Subscribers: ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D56539 llvm-svn: 354792
-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