forked from OSchip/llvm-project
[clangd] Use ProjectAwareIndex in ClangdMain
Put project-aware-index between command-line specified static index and ClangdServer indexes. This also moves remote-index dependency from clangDaemon to ClangdMain in an attempt to prevent cyclic dependency between clangDaemon and remote-index-marshalling. Differential Revision: https://reviews.llvm.org/D91860
This commit is contained in:
parent
067ffbfe60
commit
cab3136807
|
@ -151,7 +151,6 @@ target_link_libraries(clangDaemon
|
|||
clangTidy
|
||||
${ALL_CLANG_TIDY_CHECKS}
|
||||
|
||||
clangdRemoteIndex
|
||||
clangdSupport
|
||||
)
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
#include "index/Serialization.h"
|
||||
#include "index/Symbol.h"
|
||||
#include "index/SymbolID.h"
|
||||
#include "index/remote/Client.h"
|
||||
#include "support/Logger.h"
|
||||
#include "support/Threading.h"
|
||||
#include "support/Trace.h"
|
||||
|
@ -124,33 +123,11 @@ SymbolIndex *ProjectAwareIndex::getIndex() const {
|
|||
Entry.first->getSecond() = Gen(External, Tasks);
|
||||
return Entry.first->second.get();
|
||||
}
|
||||
|
||||
std::unique_ptr<SymbolIndex>
|
||||
defaultFactory(const Config::ExternalIndexSpec &External,
|
||||
AsyncTaskRunner &Tasks) {
|
||||
switch (External.Kind) {
|
||||
case Config::ExternalIndexSpec::Server:
|
||||
log("Associating {0} with remote index at {1}.", External.MountPoint,
|
||||
External.Location);
|
||||
return remote::getClient(External.Location, External.MountPoint);
|
||||
case Config::ExternalIndexSpec::File:
|
||||
log("Associating {0} with monolithic index at {1}.", External.MountPoint,
|
||||
External.Location);
|
||||
auto NewIndex = std::make_unique<SwapIndex>(std::make_unique<MemIndex>());
|
||||
Tasks.runAsync("Load-index:" + External.Location,
|
||||
[File = External.Location, PlaceHolder = NewIndex.get()] {
|
||||
if (auto Idx = loadIndex(File, /*UseDex=*/true))
|
||||
PlaceHolder->reset(std::move(Idx));
|
||||
});
|
||||
return std::move(NewIndex);
|
||||
}
|
||||
llvm_unreachable("Invalid ExternalIndexKind.");
|
||||
}
|
||||
} // namespace
|
||||
|
||||
std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory Gen) {
|
||||
return std::make_unique<ProjectAwareIndex>(Gen ? std::move(Gen)
|
||||
: defaultFactory);
|
||||
assert(Gen);
|
||||
return std::make_unique<ProjectAwareIndex>(std::move(Gen));
|
||||
}
|
||||
} // namespace clangd
|
||||
} // namespace clang
|
||||
|
|
|
@ -23,11 +23,11 @@ namespace clangd {
|
|||
using IndexFactory = std::function<std::unique_ptr<SymbolIndex>(
|
||||
const Config::ExternalIndexSpec &, AsyncTaskRunner &)>;
|
||||
|
||||
/// Returns an index that answers queries using external indices. IndexGenerator
|
||||
/// can be used to customize how to generate an index from an external source.
|
||||
/// The default implementation loads the index asynchronously on the
|
||||
/// AsyncTaskRunner. The index will appear empty until loaded.
|
||||
std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory = nullptr);
|
||||
/// Returns an index that answers queries using external indices. IndexFactory
|
||||
/// specifies how to generate an index from an external source.
|
||||
/// IndexFactory must be injected because this code cannot depend on the remote
|
||||
/// index client.
|
||||
std::unique_ptr<SymbolIndex> createProjectAwareIndex(IndexFactory);
|
||||
} // namespace clangd
|
||||
} // namespace clang
|
||||
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
#include "Protocol.h"
|
||||
#include "Transport.h"
|
||||
#include "index/Background.h"
|
||||
#include "index/Index.h"
|
||||
#include "index/Merge.h"
|
||||
#include "index/ProjectAware.h"
|
||||
#include "index/Serialization.h"
|
||||
#include "index/remote/Client.h"
|
||||
#include "refactor/Rename.h"
|
||||
|
@ -40,6 +43,7 @@
|
|||
#include <mutex>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include <vector>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include <unistd.h>
|
||||
|
@ -551,6 +555,27 @@ const char TestScheme::TestDir[] = "C:\\clangd-test";
|
|||
const char TestScheme::TestDir[] = "/clangd-test";
|
||||
#endif
|
||||
|
||||
std::unique_ptr<SymbolIndex>
|
||||
loadExternalIndex(const Config::ExternalIndexSpec &External,
|
||||
AsyncTaskRunner &Tasks) {
|
||||
switch (External.Kind) {
|
||||
case Config::ExternalIndexSpec::Server:
|
||||
log("Associating {0} with remote index at {1}.", External.MountPoint,
|
||||
External.Location);
|
||||
return remote::getClient(External.Location, External.MountPoint);
|
||||
case Config::ExternalIndexSpec::File:
|
||||
log("Associating {0} with monolithic index at {1}.", External.MountPoint,
|
||||
External.Location);
|
||||
auto NewIndex = std::make_unique<SwapIndex>(std::make_unique<MemIndex>());
|
||||
Tasks.runAsync("Load-index:" + External.Location,
|
||||
[File = External.Location, PlaceHolder = NewIndex.get()] {
|
||||
if (auto Idx = loadIndex(File, /*UseDex=*/true))
|
||||
PlaceHolder->reset(std::move(Idx));
|
||||
});
|
||||
return std::move(NewIndex);
|
||||
}
|
||||
llvm_unreachable("Invalid ExternalIndexKind.");
|
||||
}
|
||||
} // namespace
|
||||
} // namespace clangd
|
||||
} // namespace clang
|
||||
|
@ -726,6 +751,7 @@ clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment var
|
|||
Opts.ResourceDir = ResourceDir;
|
||||
Opts.BuildDynamicSymbolIndex = EnableIndex;
|
||||
Opts.CollectMainFileRefs = CollectMainFileRefs;
|
||||
std::vector<std::unique_ptr<SymbolIndex>> IdxStack;
|
||||
std::unique_ptr<SymbolIndex> StaticIdx;
|
||||
std::future<void> AsyncIndexLoad; // Block exit while loading the index.
|
||||
if (EnableIndex && !IndexFile.empty()) {
|
||||
|
@ -757,7 +783,15 @@ clangd accepts flags on the commandline, and in the CLANGD_FLAGS environment var
|
|||
}
|
||||
#endif
|
||||
Opts.BackgroundIndex = EnableBackgroundIndex;
|
||||
Opts.StaticIndex = StaticIdx.get();
|
||||
auto PAI = createProjectAwareIndex(loadExternalIndex);
|
||||
if (StaticIdx) {
|
||||
IdxStack.emplace_back(std::move(StaticIdx));
|
||||
IdxStack.emplace_back(
|
||||
std::make_unique<MergedIndex>(PAI.get(), IdxStack.back().get()));
|
||||
Opts.StaticIndex = IdxStack.back().get();
|
||||
} else {
|
||||
Opts.StaticIndex = PAI.get();
|
||||
}
|
||||
Opts.AsyncThreadsCount = WorkerThreadsCount;
|
||||
Opts.BuildRecoveryAST = RecoveryAST;
|
||||
Opts.PreserveRecoveryASTType = RecoveryASTType;
|
||||
|
|
Loading…
Reference in New Issue