[llvm-branch-commits] [clang-tools-extra] cab3136 - [clangd] Use ProjectAwareIndex in ClangdMain
Kadir Cetinkaya via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Nov 22 12:17:52 PST 2020
Author: Kadir Cetinkaya
Date: 2020-11-22T20:59:38+01:00
New Revision: cab313680703097f5f4642b348c43018f55a5a4f
URL: https://github.com/llvm/llvm-project/commit/cab313680703097f5f4642b348c43018f55a5a4f
DIFF: https://github.com/llvm/llvm-project/commit/cab313680703097f5f4642b348c43018f55a5a4f.diff
LOG: [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
Added:
Modified:
clang-tools-extra/clangd/CMakeLists.txt
clang-tools-extra/clangd/index/ProjectAware.cpp
clang-tools-extra/clangd/index/ProjectAware.h
clang-tools-extra/clangd/tool/ClangdMain.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/CMakeLists.txt b/clang-tools-extra/clangd/CMakeLists.txt
index d02a5cf3f2ec..72b232b92c08 100644
--- a/clang-tools-extra/clangd/CMakeLists.txt
+++ b/clang-tools-extra/clangd/CMakeLists.txt
@@ -151,7 +151,6 @@ target_link_libraries(clangDaemon
clangTidy
${ALL_CLANG_TIDY_CHECKS}
- clangdRemoteIndex
clangdSupport
)
diff --git a/clang-tools-extra/clangd/index/ProjectAware.cpp b/clang-tools-extra/clangd/index/ProjectAware.cpp
index 58685fd14bf5..63f8f823f3a7 100644
--- a/clang-tools-extra/clangd/index/ProjectAware.cpp
+++ b/clang-tools-extra/clangd/index/ProjectAware.cpp
@@ -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
diff --git a/clang-tools-extra/clangd/index/ProjectAware.h b/clang-tools-extra/clangd/index/ProjectAware.h
index 2d7c6ba3ad88..af98ba612751 100644
--- a/clang-tools-extra/clangd/index/ProjectAware.h
+++ b/clang-tools-extra/clangd/index/ProjectAware.h
@@ -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
diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index 08d498f30873..1a70058cd8ab 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -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;
More information about the llvm-branch-commits
mailing list