diff options
author | Haojian Wu <hokein@google.com> | 2019-01-10 09:22:40 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2019-01-10 09:22:40 +0000 |
commit | 8f85b9f86718c269d49be4eb2bb73466a95f5347 (patch) | |
tree | e907e859e0a0a45d35a517e4ddcc72a8e196f2f7 /clang-tools-extra | |
parent | Add a verbose mode to "image dump line-table" and use it to write a .debug_li... (diff) | |
download | llvm-project-8f85b9f86718c269d49be4eb2bb73466a95f5347.tar.gz llvm-project-8f85b9f86718c269d49be4eb2bb73466a95f5347.tar.bz2 llvm-project-8f85b9f86718c269d49be4eb2bb73466a95f5347.zip |
[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
llvm-svn: 350803
Diffstat (limited to 'clang-tools-extra')
-rw-r--r-- | clang-tools-extra/clangd/index/Index.h | 7 | ||||
-rw-r--r-- | clang-tools-extra/clangd/index/SymbolCollector.cpp | 32 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp | 13 |
3 files changed, 38 insertions, 14 deletions
diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h index a5552d4f39f2..1ab9ecd631c8 100644 --- a/clang-tools-extra/clangd/index/Index.h +++ b/clang-tools-extra/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/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp index cdc6aa5c01f4..23b1776ae203 100644 --- a/clang-tools-extra/clangd/index/SymbolCollector.cpp +++ b/clang-tools-extra/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/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp b/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp index a1996fc75c74..ea84461c1bbe 100644 --- a/clang-tools-extra/unittests/clangd/SymbolCollectorTests.cpp +++ b/clang-tools-extra/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) { |