]> granicus.if.org Git - clang/commitdiff
[clang][FileManager] fillRealPathName even if we aren't opening the file
authorJan Korous <jkorous@apple.com>
Thu, 14 Feb 2019 23:02:35 +0000 (23:02 +0000)
committerJan Korous <jkorous@apple.com>
Thu, 14 Feb 2019 23:02:35 +0000 (23:02 +0000)
The pathname wasn't previously filled when the getFile() method was called with openFile = false.
We are caching FileEntry-s in ParsedAST::Includes in clangd and this caused the problem.

This fixes an internal test failure in clangd - ClangdTests.GoToInclude.All

rdar://47536127

Differential Revision: https://reviews.llvm.org/D58213

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@354075 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Basic/FileManager.cpp
unittests/Basic/FileManagerTest.cpp

index 75caff95559e674f525f336e3ef0f384641f4194..41026763377aa15a731f7645744c262aab8e454e 100644 (file)
@@ -267,6 +267,9 @@ const FileEntry *FileManager::getFile(StringRef Filename, bool openFile,
   if (UFE.File) {
     if (auto PathName = UFE.File->getName())
       fillRealPathName(&UFE, *PathName);
+  } else if (!openFile) {
+    // We should still fill the path even if we aren't opening the file.
+    fillRealPathName(&UFE, InterndFileName);
   }
   return &UFE;
 }
index 9f051976ca0de134670308f4076fd35429da2699..14c7879a091ffce611e16b2f93e59ed744b1e674 100644 (file)
@@ -346,4 +346,18 @@ TEST_F(FileManagerTest, getVirtualFileFillsRealPathName) {
   EXPECT_EQ(file->tryGetRealPathName(), ExpectedResult);
 }
 
+TEST_F(FileManagerTest, getFileDontOpenRealPath) {
+  auto statCache = llvm::make_unique<FakeStatCache>();
+  statCache->InjectDirectory("/tmp/abc", 42);
+  SmallString<64> Path("/tmp/abc/foo.cpp");
+  statCache->InjectFile(Path.str().str().c_str(), 43);
+  manager.setStatCache(std::move(statCache));
+
+  const FileEntry *file = manager.getFile(Path, /*openFile=*/false);
+
+  ASSERT_TRUE(file != nullptr);
+
+  ASSERT_EQ(file->tryGetRealPathName(), Path);
+}
+
 } // anonymous namespace