[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:
Kadir Cetinkaya 2020-11-05 23:55:04 +01:00
parent 067ffbfe60
commit cab3136807
No known key found for this signature in database
GPG Key ID: E39E36B8D2057ED6
4 changed files with 42 additions and 32 deletions

View File

@ -151,7 +151,6 @@ target_link_libraries(clangDaemon
clangTidy
${ALL_CLANG_TIDY_CHECKS}
clangdRemoteIndex
clangdSupport
)

View File

@ -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

View File

@ -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

View File

@ -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;