From a21392bfc7e45073d4b6967f4daaf29011a2c64f Mon Sep 17 00:00:00 2001 From: Ilya Biryukov Date: Mon, 26 Nov 2018 15:29:14 +0000 Subject: [PATCH] [clangd] Collect and store expected types in the index Summary: And add a hidden option to control whether the types are collected. For experiments, will be removed when expected types implementation is stabilized. The index size is almost unchanged, e.g. the YAML index for all clangd sources increased from 53MB to 54MB. Reviewers: ioeric, sammccall Reviewed By: sammccall Subscribers: MaskRay, jkorous, arphaman, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D52274 llvm-svn: 347560 --- clang-tools-extra/clangd/index/Index.h | 6 ++++++ clang-tools-extra/clangd/index/Serialization.cpp | 4 +++- clang-tools-extra/clangd/index/SymbolCollector.cpp | 5 +++++ clang-tools-extra/clangd/index/YAMLSerialization.cpp | 1 + 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h index 4441951..0c1d586 100644 --- a/clang-tools-extra/clangd/index/Index.h +++ b/clang-tools-extra/clangd/index/Index.h @@ -10,6 +10,7 @@ #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_INDEX_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_INDEX_INDEX_H +#include "ExpectedTypes.h" #include "clang/Index/IndexSymbol.h" #include "clang/Lex/Lexer.h" #include "llvm/ADT/DenseMap.h" @@ -242,6 +243,10 @@ struct Symbol { /// e.g. return type of a function, or type of a variable. llvm::StringRef ReturnType; + /// Raw representation of the OpaqueType of the symbol, used for scoring + /// purposes. + llvm::StringRef Type; + struct IncludeHeaderWithReferences { IncludeHeaderWithReferences() = default; @@ -300,6 +305,7 @@ template void visitStrings(Symbol &S, const Callback &CB) { CB(S.CompletionSnippetSuffix); CB(S.Documentation); CB(S.ReturnType); + CB(S.Type); auto RawCharPointerCB = [&CB](const char *&P) { llvm::StringRef S(P); CB(S); diff --git a/clang-tools-extra/clangd/index/Serialization.cpp b/clang-tools-extra/clangd/index/Serialization.cpp index 7195824..9eb4d21 100644 --- a/clang-tools-extra/clangd/index/Serialization.cpp +++ b/clang-tools-extra/clangd/index/Serialization.cpp @@ -264,6 +264,7 @@ void writeSymbol(const Symbol &Sym, const StringTableOut &Strings, writeVar(Strings.index(Sym.CompletionSnippetSuffix), OS); writeVar(Strings.index(Sym.Documentation), OS); writeVar(Strings.index(Sym.ReturnType), OS); + writeVar(Strings.index(Sym.Type), OS); auto WriteInclude = [&](const Symbol::IncludeHeaderWithReferences &Include) { writeVar(Strings.index(Include.IncludeHeader), OS); @@ -290,6 +291,7 @@ Symbol readSymbol(Reader &Data, ArrayRef Strings) { Sym.CompletionSnippetSuffix = Data.consumeString(Strings); Sym.Documentation = Data.consumeString(Strings); Sym.ReturnType = Data.consumeString(Strings); + Sym.Type = Data.consumeString(Strings); Sym.IncludeHeaders.resize(Data.consumeVar()); for (auto &I : Sym.IncludeHeaders) { I.IncludeHeader = Data.consumeString(Strings); @@ -339,7 +341,7 @@ std::pair> readRefs(Reader &Data, // The current versioning scheme is simple - non-current versions are rejected. // If you make a breaking change, bump this version number to invalidate stored // data. Later we may want to support some backward compatibility. -constexpr static uint32_t Version = 7; +constexpr static uint32_t Version = 8; Expected readRIFF(StringRef Data) { auto RIFF = riff::readFile(Data); diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp index 78a1b8d..84aff8b 100644 --- a/clang-tools-extra/clangd/index/SymbolCollector.cpp +++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp @@ -587,6 +587,11 @@ const Symbol *SymbolCollector::addDeclaration(const NamedDecl &ND, if (!Include.empty()) S.IncludeHeaders.emplace_back(Include, 1); + if (S.Flags & Symbol::IndexedForCodeCompletion) { + if (auto T = OpaqueType::fromCompletionResult(*ASTCtx, SymbolCompletion)) + S.Type = T->raw(); + } + S.Origin = Opts.Origin; if (ND.getAvailability() == AR_Deprecated) S.Flags |= Symbol::Deprecated; diff --git a/clang-tools-extra/clangd/index/YAMLSerialization.cpp b/clang-tools-extra/clangd/index/YAMLSerialization.cpp index 4517dcf..d3ffddd 100644 --- a/clang-tools-extra/clangd/index/YAMLSerialization.cpp +++ b/clang-tools-extra/clangd/index/YAMLSerialization.cpp @@ -197,6 +197,7 @@ template <> struct MappingTraits { IO.mapOptional("CompletionSnippetSuffix", Sym.CompletionSnippetSuffix); IO.mapOptional("Documentation", Sym.Documentation); IO.mapOptional("ReturnType", Sym.ReturnType); + IO.mapOptional("Type", Sym.Type); IO.mapOptional("IncludeHeaders", Sym.IncludeHeaders); } }; -- 2.7.4