Index: clang-tools-extra/clangd/index/Index.h =================================================================== --- clang-tools-extra/clangd/index/Index.h +++ clang-tools-extra/clangd/index/Index.h @@ -355,6 +355,23 @@ /// matching symbols among a set of symbols based on names or unique IDs. class SymbolIndex { public: + /// \brief Build index from a symbol slab. + template + static std::unique_ptr build(SymbolSlab Slab) { + struct Snapshot { + SymbolSlab Slab; + std::vector Pointers; + }; + auto Snap = std::make_shared(); + Snap->Slab = std::move(Slab); + for (auto &Sym : Snap->Slab) Snap->Pointers.push_back(&Sym); + auto S = std::shared_ptr>(std::move(Snap), + &Snap->Pointers); + auto Idx = llvm::make_unique(); + Idx->build(std::move(S)); + return std::move(Idx); + } + virtual ~SymbolIndex() = default; /// \brief Matches symbols in the index fuzzily and applies \p Callback on Index: clang-tools-extra/clangd/index/MemIndex.h =================================================================== --- clang-tools-extra/clangd/index/MemIndex.h +++ clang-tools-extra/clangd/index/MemIndex.h @@ -24,9 +24,6 @@ /// accessible as long as `Symbols` is kept alive. void build(std::shared_ptr> Symbols); - /// \brief Build index from a symbol slab. - static std::unique_ptr build(SymbolSlab Slab); - bool fuzzyFind(const FuzzyFindRequest &Req, llvm::function_ref Callback) const override; Index: clang-tools-extra/clangd/index/MemIndex.cpp =================================================================== --- clang-tools-extra/clangd/index/MemIndex.cpp +++ clang-tools-extra/clangd/index/MemIndex.cpp @@ -71,22 +71,6 @@ } } -std::unique_ptr MemIndex::build(SymbolSlab Slab) { - struct Snapshot { - SymbolSlab Slab; - std::vector Pointers; - }; - auto Snap = std::make_shared(); - Snap->Slab = std::move(Slab); - for (auto &Sym : Snap->Slab) - Snap->Pointers.push_back(&Sym); - auto S = std::shared_ptr>(std::move(Snap), - &Snap->Pointers); - auto MemIdx = llvm::make_unique(); - MemIdx->build(std::move(S)); - return std::move(MemIdx); -} - void MemIndex::findOccurrences( const OccurrencesRequest &Req, llvm::function_ref Callback) const { Index: clang-tools-extra/clangd/tool/ClangdMain.cpp =================================================================== --- clang-tools-extra/clangd/tool/ClangdMain.cpp +++ clang-tools-extra/clangd/tool/ClangdMain.cpp @@ -7,48 +7,28 @@ // //===----------------------------------------------------------------------===// +#include +#include +#include +#include +#include #include "ClangdLSPServer.h" #include "JSONRPCDispatcher.h" #include "Path.h" #include "Trace.h" -#include "index/SymbolYAML.h" #include "clang/Basic/Version.h" +#include "index/SymbolYAML.h" +#include "index/dex/DexIndex.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/Program.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" -#include -#include -#include -#include -#include using namespace clang; using namespace clang::clangd; -namespace { -enum class PCHStorageFlag { Disk, Memory }; - -// Build an in-memory static index for global symbols from a YAML-format file. -// The size of global symbols should be relatively small, so that all symbols -// can be managed in memory. -std::unique_ptr buildStaticIndex(llvm::StringRef YamlSymbolFile) { - auto Buffer = llvm::MemoryBuffer::getFile(YamlSymbolFile); - if (!Buffer) { - llvm::errs() << "Can't open " << YamlSymbolFile << "\n"; - return nullptr; - } - auto Slab = symbolsFromYAML(Buffer.get()->getBuffer()); - SymbolSlab::Builder SymsBuilder; - for (auto Sym : Slab) - SymsBuilder.insert(Sym); - - return MemIndex::build(std::move(SymsBuilder).build()); -} -} // namespace - static llvm::cl::opt CompileCommandsDir( "compile-commands-dir", llvm::cl::desc("Specify a path to look for compile_commands.json. If path " @@ -113,6 +93,31 @@ "Intended to simplify lit tests."), llvm::cl::init(false), llvm::cl::Hidden); + +namespace { + +enum class PCHStorageFlag { Disk, Memory }; + +// Build an in-memory static index for global symbols from a YAML-format file. +// The size of global symbols should be relatively small, so that all symbols +// can be managed in memory. +std::unique_ptr buildStaticIndex(llvm::StringRef YamlSymbolFile) { + auto Buffer = llvm::MemoryBuffer::getFile(YamlSymbolFile); + if (!Buffer) { + llvm::errs() << "Can't open " << YamlSymbolFile << "\n"; + return nullptr; + } + auto Slab = symbolsFromYAML(Buffer.get()->getBuffer()); + SymbolSlab::Builder SymsBuilder; + for (auto Sym : Slab) SymsBuilder.insert(Sym); + + return UseDex + ? SymbolIndex::build(std::move(SymsBuilder).build()) + : SymbolIndex::build(std::move(SymsBuilder).build()); +} + +} // namespace + static llvm::cl::opt PCHStorage( "pch-storage", llvm::cl::desc("Storing PCHs in memory increases memory usages, but may " @@ -185,6 +190,10 @@ "'compile_commands.json' files")), llvm::cl::init(FilesystemCompileArgs), llvm::cl::Hidden); +static llvm::cl::opt UseDex( + "use-dex-index", llvm::cl::desc("Use experimental Dex static index."), + llvm::cl::init(false), llvm::cl::Hidden); + int main(int argc, char *argv[]) { llvm::sys::PrintStackTraceOnErrorSignal(argv[0]); llvm::cl::SetVersionPrinter([](llvm::raw_ostream &OS) { Index: clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp =================================================================== --- clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp +++ clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp @@ -76,7 +76,7 @@ SymbolSlab::Builder Slab; for (const auto &Sym : Symbols) Slab.insert(Sym); - return MemIndex::build(std::move(Slab).build()); + return SymbolIndex::build(std::move(Slab).build()); } CodeCompleteResult completions(ClangdServer &Server, StringRef TestCode, Index: clang-tools-extra/unittests/clangd/TestTU.cpp =================================================================== --- clang-tools-extra/unittests/clangd/TestTU.cpp +++ clang-tools-extra/unittests/clangd/TestTU.cpp @@ -49,7 +49,7 @@ } std::unique_ptr TestTU::index() const { - return MemIndex::build(headerSymbols()); + return SymbolIndex::build(headerSymbols()); } const Symbol &findSymbol(const SymbolSlab &Slab, llvm::StringRef QName) {