aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKadir Cetinkaya <kadircet@google.com>2019-02-11 10:31:13 +0000
committerKadir Cetinkaya <kadircet@google.com>2019-02-11 10:31:13 +0000
commite93e9e8801c112252072d9b934445f29eb9a9a53 (patch)
treee10d383ac54198d1a266268f7f5dbd1133a153f3
parent8214828fc69893248caf7291d73b70690e4f6987 (diff)
downloadclang-tools-extra-e93e9e8801c112252072d9b934445f29eb9a9a53.tar.gz
[clangd] Make system header mappings available for PreambleParsedCallback
Summary: SystemHeaderMappings were added only after takeIncludes call, which resulted in getting mapping on main file ast updates but not on preamble ast updates. Fixes https://github.com/clangd/clangd/issues/8 Reviewers: hokein Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D58029 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@353687 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--clangd/ClangdUnit.cpp9
-rw-r--r--unittests/clangd/FileIndexTests.cpp33
2 files changed, 37 insertions, 5 deletions
diff --git a/clangd/ClangdUnit.cpp b/clangd/ClangdUnit.cpp
index 09ab772d..1689a644 100644
--- a/clangd/ClangdUnit.cpp
+++ b/clangd/ClangdUnit.cpp
@@ -96,14 +96,13 @@ private:
class CppFilePreambleCallbacks : public PreambleCallbacks {
public:
CppFilePreambleCallbacks(PathRef File, PreambleParsedCallback ParsedCallback)
- : File(File), ParsedCallback(ParsedCallback) {}
+ : File(File), ParsedCallback(ParsedCallback) {
+ addSystemHeadersMapping(&CanonIncludes);
+ }
IncludeStructure takeIncludes() { return std::move(Includes); }
- CanonicalIncludes takeCanonicalIncludes() {
- addSystemHeadersMapping(&CanonIncludes);
- return std::move(CanonIncludes);
- }
+ CanonicalIncludes takeCanonicalIncludes() { return std::move(CanonIncludes); }
void AfterExecute(CompilerInstance &CI) override {
if (!ParsedCallback)
diff --git a/unittests/clangd/FileIndexTests.cpp b/unittests/clangd/FileIndexTests.cpp
index 0b037a50..fc374bba 100644
--- a/unittests/clangd/FileIndexTests.cpp
+++ b/unittests/clangd/FileIndexTests.cpp
@@ -212,6 +212,39 @@ TEST(FileIndexTest, IncludeCollected) {
"<the/good/header.h>");
}
+TEST(FileIndexTest, HasSystemHeaderMappingsInPreamble) {
+ FileIndex Index;
+ const std::string Header = R"cpp(
+ class Foo {};
+ )cpp";
+ auto MainFile = testPath("foo.cpp");
+ auto HeaderFile = testPath("bits/alloc_traits.h");
+ std::vector<const char *> Cmd = {"clang", "-xc++", MainFile.c_str(),
+ "-include", HeaderFile.c_str()};
+ // Preparse ParseInputs.
+ ParseInputs PI;
+ PI.CompileCommand.Directory = testRoot();
+ PI.CompileCommand.Filename = MainFile;
+ PI.CompileCommand.CommandLine = {Cmd.begin(), Cmd.end()};
+ PI.Contents = "";
+ PI.FS = buildTestFS({{MainFile, ""}, {HeaderFile, Header}});
+
+ // Prepare preamble.
+ auto CI = buildCompilerInvocation(PI);
+ auto PreambleData = buildPreamble(
+ MainFile, *buildCompilerInvocation(PI), /*OldPreamble=*/nullptr,
+ tooling::CompileCommand(), PI, std::make_shared<PCHContainerOperations>(),
+ /*StoreInMemory=*/true,
+ [&](ASTContext &Ctx, std::shared_ptr<Preprocessor> PP,
+ const CanonicalIncludes &Includes) {
+ Index.updatePreamble(MainFile, Ctx, PP, Includes);
+ });
+ auto Symbols = runFuzzyFind(Index, "");
+ EXPECT_THAT(Symbols, ElementsAre(_));
+ EXPECT_THAT(Symbols.begin()->IncludeHeaders.front().IncludeHeader,
+ "<memory>");
+}
+
TEST(FileIndexTest, TemplateParamsInLabel) {
auto Source = R"cpp(
template <class Ty>