summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2019-01-10 09:22:40 +0000
committerHaojian Wu <hokein@google.com>2019-01-10 09:22:40 +0000
commit797199bfeb6c2bc24521d6bdd489266b1e6d80e5 (patch)
treec238a70c0fba60a1b3e0da1297351b31c20d67dc
parent482e30b829175156e60b3f924aafd7552c8c49e2 (diff)
[clangd] Don't store completion info if the symbol is not used for code completion.
Summary: This would save us some memory and disk space: - Dex usage (261 MB vs 266 MB) - Disk (75 MB vs 76 MB) It would save more when we index the main file symbol D55185. Reviewers: ilya-biryukov Reviewed By: ilya-biryukov Subscribers: nridge, ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D56314 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@350803 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--clangd/index/Index.h7
-rw-r--r--clangd/index/SymbolCollector.cpp32
-rw-r--r--unittests/clangd/SymbolCollectorTests.cpp13
3 files changed, 38 insertions, 14 deletions
diff --git a/clangd/index/Index.h b/clangd/index/Index.h
index a5552d4f..1ab9ecd6 100644
--- a/clangd/index/Index.h
+++ b/clangd/index/Index.h
@@ -185,19 +185,23 @@ struct Symbol {
SymbolOrigin Origin = SymbolOrigin::Unknown;
/// A brief description of the symbol that can be appended in the completion
/// candidate list. For example, "(X x, Y y) const" is a function signature.
+ /// Only set when the symbol is indexed for completion.
llvm::StringRef Signature;
/// What to insert when completing this symbol, after the symbol name.
/// This is in LSP snippet syntax (e.g. "({$0})" for a no-args function).
/// (When snippets are disabled, the symbol name alone is used).
+ /// Only set when the symbol is indexed for completion.
llvm::StringRef CompletionSnippetSuffix;
/// Documentation including comment for the symbol declaration.
llvm::StringRef Documentation;
/// Type when this symbol is used in an expression. (Short display form).
/// e.g. return type of a function, or type of a variable.
+ /// Only set when the symbol is indexed for completion.
llvm::StringRef ReturnType;
/// Raw representation of the OpaqueType of the symbol, used for scoring
/// purposes.
+ /// Only set when the symbol is indexed for completion.
llvm::StringRef Type;
struct IncludeHeaderWithReferences {
@@ -223,12 +227,15 @@ struct Symbol {
/// - If we haven't seen a definition, this covers all declarations.
/// - If we have seen a definition, this covers declarations visible from
/// any definition.
+ /// Only set when the symbol is indexed for completion.
llvm::SmallVector<IncludeHeaderWithReferences, 1> IncludeHeaders;
enum SymbolFlag : uint8_t {
None = 0,
/// Whether or not this symbol is meant to be used for the code completion.
/// See also isIndexedForCodeCompletion().
+ /// Note that we don't store completion information (signature, snippet,
+ /// type, inclues) if the symbol is not indexed for code completion.
IndexedForCodeCompletion = 1 << 0,
/// Indicates if the symbol is deprecated.
Deprecated = 1 << 1,
diff --git a/clangd/index/SymbolCollector.cpp b/clangd/index/SymbolCollector.cpp
index cdc6aa5c..23b1776a 100644
--- a/clangd/index/SymbolCollector.cpp
+++ b/clangd/index/SymbolCollector.cpp
@@ -530,6 +530,10 @@ const Symbol *SymbolCollector::addDeclaration(const NamedDecl &ND,
getTokenLocation(Loc, SM, Opts, ASTCtx->getLangOpts(), FileURI))
S.CanonicalDeclaration = *DeclLoc;
+ S.Origin = Opts.Origin;
+ if (ND.getAvailability() == AR_Deprecated)
+ S.Flags |= Symbol::Deprecated;
+
// Add completion info.
// FIXME: we may want to choose a different redecl, or combine from several.
assert(ASTCtx && PP.get() && "ASTContext and Preprocessor must be set.");
@@ -539,13 +543,28 @@ const Symbol *SymbolCollector::addDeclaration(const NamedDecl &ND,
*ASTCtx, *PP, CodeCompletionContext::CCC_Symbol, *CompletionAllocator,
*CompletionTUInfo,
/*IncludeBriefComments*/ false);
- std::string Signature;
- std::string SnippetSuffix;
- getSignature(*CCS, &Signature, &SnippetSuffix);
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)) {
+ Symbols.insert(S);
+ return Symbols.find(S.ID);
+ }
+
+ std::string Signature;
+ std::string SnippetSuffix;
+ getSignature(*CCS, &Signature, &SnippetSuffix);
+ S.Signature = Signature;
+ S.CompletionSnippetSuffix = SnippetSuffix;
std::string ReturnType = getReturnType(*CCS);
+ S.ReturnType = ReturnType;
std::string Include;
if (Opts.CollectIncludePath && shouldCollectIncludePath(S.SymInfo.Kind)) {
@@ -555,10 +574,6 @@ const Symbol *SymbolCollector::addDeclaration(const NamedDecl &ND,
QName, SM, SM.getExpansionLoc(ND.getLocation()), Opts))
Include = std::move(*Header);
}
- S.Signature = Signature;
- S.CompletionSnippetSuffix = SnippetSuffix;
- S.Documentation = Documentation;
- S.ReturnType = ReturnType;
if (!Include.empty())
S.IncludeHeaders.emplace_back(Include, 1);
@@ -569,9 +584,6 @@ const Symbol *SymbolCollector::addDeclaration(const NamedDecl &ND,
S.Type = TypeStorage->raw();
}
- S.Origin = Opts.Origin;
- if (ND.getAvailability() == AR_Deprecated)
- S.Flags |= Symbol::Deprecated;
Symbols.insert(S);
return Symbols.find(S.ID);
}
diff --git a/unittests/clangd/SymbolCollectorTests.cpp b/unittests/clangd/SymbolCollectorTests.cpp
index a1996fc7..ea84461c 100644
--- a/unittests/clangd/SymbolCollectorTests.cpp
+++ b/unittests/clangd/SymbolCollectorTests.cpp
@@ -654,10 +654,15 @@ TEST_F(SymbolCollectorTest, ClassMembers) {
void Foo::ssf() {}
)";
runSymbolCollector(Header, Main);
- EXPECT_THAT(Symbols,
- UnorderedElementsAre(QName("Foo"), QName("Foo::f"),
- QName("Foo::g"), QName("Foo::sf"),
- QName("Foo::ssf"), QName("Foo::x")));
+ EXPECT_THAT(
+ Symbols,
+ UnorderedElementsAre(
+ QName("Foo"),
+ AllOf(QName("Foo::f"), ReturnType(""), ForCodeCompletion(false)),
+ AllOf(QName("Foo::g"), ReturnType(""), ForCodeCompletion(false)),
+ AllOf(QName("Foo::sf"), ReturnType(""), ForCodeCompletion(false)),
+ AllOf(QName("Foo::ssf"), ReturnType(""), ForCodeCompletion(false)),
+ AllOf(QName("Foo::x"), ReturnType(""), ForCodeCompletion(false))));
}
TEST_F(SymbolCollectorTest, Scopes) {