[clangd] Minimal implementation of automatic static index (not enabled).
Summary:
See tinyurl.com/clangd-automatic-index for design and goals.
Lots of limitations to keep this patch smallish, TODOs everywhere:
- no serialization to disk
- no changes to dynamic index, which now has a much simpler job
- no partitioning of symbols by file to avoid duplication of header symbols
- no reindexing of edited files
- only a single worker thread
- compilation database is slurped synchronously (doesn't scale)
- uses memindex, rebuilds after every file (should be dex, periodically)
It's not hooked up to ClangdServer/ClangdLSPServer yet: the layering
isn't clear (it should really be in ClangdServer, but ClangdLSPServer
has all the CDB interactions).
Reviewers: ioeric
Subscribers: mgorny, ilya-biryukov, MaskRay, jkorous, arphaman, kadircet, jfb, cfe-commits
Differential Revision: https://reviews.llvm.org/D53032
llvm-svn: 344513
diff --git a/clang-tools-extra/unittests/clangd/BackgroundIndexTests.cpp b/clang-tools-extra/unittests/clangd/BackgroundIndexTests.cpp
new file mode 100644
index 0000000..93bf62b
--- /dev/null
+++ b/clang-tools-extra/unittests/clangd/BackgroundIndexTests.cpp
@@ -0,0 +1,37 @@
+#include "SyncAPI.h"
+#include "TestFS.h"
+#include "index/Background.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+using testing::UnorderedElementsAre;
+
+namespace clang {
+namespace clangd {
+
+MATCHER_P(Named, N, "") { return arg.Name == N; }
+
+TEST(BackgroundIndexTest, IndexTwoFiles) {
+ MockFSProvider FS;
+ // a.h yields different symbols when included by A.cc vs B.cc.
+ // Currently we store symbols for each TU, so we get both.
+ FS.Files[testPath("root/A.h")] = "void a_h(); void NAME(){}";
+ FS.Files[testPath("root/A.cc")] = "#include \"A.h\"";
+ FS.Files[testPath("root/B.cc")] = "#define NAME bar\n#include \"A.h\"";
+ BackgroundIndex Idx(Context::empty(), "", FS);
+
+ tooling::CompileCommand Cmd;
+ Cmd.Filename = testPath("root/A.cc");
+ Cmd.Directory = testPath("root");
+ Cmd.CommandLine = {"clang++", "-DNAME=foo", testPath("root/A.cc")};
+ Idx.enqueue(testPath("root"), Cmd);
+ Cmd.CommandLine.back() = Cmd.Filename = testPath("root/B.cc");
+ Idx.enqueue(testPath("root"), Cmd);
+
+ Idx.blockUntilIdleForTest();
+ EXPECT_THAT(runFuzzyFind(Idx, ""),
+ UnorderedElementsAre(Named("a_h"), Named("foo"), Named("bar")));
+}
+
+} // namespace clangd
+} // namespace clang