forked from OSchip/llvm-project
[clangd] Move buildStaticIndex() to SymbolYAML
`buildStaticIndex()` is used by two other tools that I'm building, now it's useful outside of `tool/ClangdMain.cpp`. Also, slightly refactor the code while moving it to the different source file. Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D51626 llvm-svn: 341369
This commit is contained in:
parent
b0138317d6
commit
d5bc65444c
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
#include "SymbolYAML.h"
|
#include "SymbolYAML.h"
|
||||||
#include "Index.h"
|
#include "Index.h"
|
||||||
|
#include "dex/DexIndex.h"
|
||||||
#include "llvm/ADT/Optional.h"
|
#include "llvm/ADT/Optional.h"
|
||||||
#include "llvm/ADT/SmallVector.h"
|
#include "llvm/ADT/SmallVector.h"
|
||||||
#include "llvm/Support/Errc.h"
|
#include "llvm/Support/Errc.h"
|
||||||
|
@ -25,18 +26,18 @@ using clang::clangd::Symbol;
|
||||||
using clang::clangd::SymbolID;
|
using clang::clangd::SymbolID;
|
||||||
using clang::clangd::SymbolLocation;
|
using clang::clangd::SymbolLocation;
|
||||||
using clang::index::SymbolInfo;
|
using clang::index::SymbolInfo;
|
||||||
using clang::index::SymbolLanguage;
|
|
||||||
using clang::index::SymbolKind;
|
using clang::index::SymbolKind;
|
||||||
|
using clang::index::SymbolLanguage;
|
||||||
|
|
||||||
// Helper to (de)serialize the SymbolID. We serialize it as a hex string.
|
// Helper to (de)serialize the SymbolID. We serialize it as a hex string.
|
||||||
struct NormalizedSymbolID {
|
struct NormalizedSymbolID {
|
||||||
NormalizedSymbolID(IO &) {}
|
NormalizedSymbolID(IO &) {}
|
||||||
NormalizedSymbolID(IO &, const SymbolID& ID) {
|
NormalizedSymbolID(IO &, const SymbolID &ID) {
|
||||||
llvm::raw_string_ostream OS(HexString);
|
llvm::raw_string_ostream OS(HexString);
|
||||||
OS << ID;
|
OS << ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
SymbolID denormalize(IO&) {
|
SymbolID denormalize(IO &) {
|
||||||
SymbolID ID;
|
SymbolID ID;
|
||||||
HexString >> ID;
|
HexString >> ID;
|
||||||
return ID;
|
return ID;
|
||||||
|
@ -167,7 +168,7 @@ Symbol SymbolFromYAML(llvm::yaml::Input &Input) {
|
||||||
return S;
|
return S;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SymbolsToYAML(const SymbolSlab& Symbols, llvm::raw_ostream &OS) {
|
void SymbolsToYAML(const SymbolSlab &Symbols, llvm::raw_ostream &OS) {
|
||||||
llvm::yaml::Output Yout(OS);
|
llvm::yaml::Output Yout(OS);
|
||||||
for (Symbol S : Symbols) // copy: Yout<< requires mutability.
|
for (Symbol S : Symbols) // copy: Yout<< requires mutability.
|
||||||
Yout << S;
|
Yout << S;
|
||||||
|
@ -181,5 +182,18 @@ std::string SymbolToYAML(Symbol Sym) {
|
||||||
return OS.str();
|
return OS.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFile,
|
||||||
|
bool UseDex) {
|
||||||
|
auto Buffer = llvm::MemoryBuffer::getFile(SymbolFile);
|
||||||
|
if (!Buffer) {
|
||||||
|
llvm::errs() << "Can't open " << SymbolFile << "\n";
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
auto Slab = symbolsFromYAML(Buffer.get()->getBuffer());
|
||||||
|
|
||||||
|
return UseDex ? dex::DexIndex::build(std::move(Slab))
|
||||||
|
: MemIndex::build(std::move(Slab), RefSlab());
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace clangd
|
} // namespace clangd
|
||||||
} // namespace clang
|
} // namespace clang
|
||||||
|
|
|
@ -41,6 +41,12 @@ std::string SymbolToYAML(Symbol Sym);
|
||||||
// The YAML result is safe to concatenate if you have multiple symbol slabs.
|
// The YAML result is safe to concatenate if you have multiple symbol slabs.
|
||||||
void SymbolsToYAML(const SymbolSlab &Symbols, llvm::raw_ostream &OS);
|
void SymbolsToYAML(const SymbolSlab &Symbols, llvm::raw_ostream &OS);
|
||||||
|
|
||||||
|
// Build an in-memory static index for global symbols from a symbol file.
|
||||||
|
// The size of global symbols should be relatively small, so that all symbols
|
||||||
|
// can be managed in memory.
|
||||||
|
std::unique_ptr<SymbolIndex> loadIndex(llvm::StringRef SymbolFile,
|
||||||
|
bool UseDex = true);
|
||||||
|
|
||||||
} // namespace clangd
|
} // namespace clangd
|
||||||
} // namespace clang
|
} // namespace clang
|
||||||
|
|
||||||
|
|
|
@ -39,24 +39,6 @@ namespace {
|
||||||
|
|
||||||
enum class PCHStorageFlag { Disk, Memory };
|
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<SymbolIndex> 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 ? dex::DexIndex::build(std::move(SymsBuilder).build())
|
|
||||||
: MemIndex::build(std::move(SymsBuilder).build(), RefSlab());
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
static llvm::cl::opt<Path> CompileCommandsDir(
|
static llvm::cl::opt<Path> CompileCommandsDir(
|
||||||
|
@ -298,7 +280,7 @@ int main(int argc, char *argv[]) {
|
||||||
Opts.BuildDynamicSymbolIndex = EnableIndex;
|
Opts.BuildDynamicSymbolIndex = EnableIndex;
|
||||||
std::unique_ptr<SymbolIndex> StaticIdx;
|
std::unique_ptr<SymbolIndex> StaticIdx;
|
||||||
if (EnableIndex && !YamlSymbolFile.empty()) {
|
if (EnableIndex && !YamlSymbolFile.empty()) {
|
||||||
StaticIdx = buildStaticIndex(YamlSymbolFile);
|
StaticIdx = loadIndex(YamlSymbolFile, UseDex);
|
||||||
Opts.StaticIndex = StaticIdx.get();
|
Opts.StaticIndex = StaticIdx.get();
|
||||||
}
|
}
|
||||||
Opts.AsyncThreadsCount = WorkerThreadsCount;
|
Opts.AsyncThreadsCount = WorkerThreadsCount;
|
||||||
|
|
Loading…
Reference in New Issue