[VFS] Don't try to be heroic with '.' in paths.

Actually the only special path we have to handle is ./foo, the rest is
tricky to get right so do the same thing as the existing YAML vfs here.

llvm-svn: 250036
This commit is contained in:
Benjamin Kramer
2015-10-12 13:30:38 +00:00
parent 939724cd02
commit 4ad1c43edd
2 changed files with 14 additions and 13 deletions

View File

@@ -10,7 +10,6 @@
//===----------------------------------------------------------------------===//
#include "clang/Basic/VirtualFileSystem.h"
#include "clang/Basic/FileManager.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringExtras.h"
@@ -497,12 +496,14 @@ void InMemoryFileSystem::addFile(const Twine &P, time_t ModificationTime,
assert(!EC);
(void)EC;
FileManager::removeDotPaths(Path, /*RemoveDotDot=*/false);
if (Path.empty())
return;
detail::InMemoryDirectory *Dir = Root.get();
auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path);
if (*I == ".")
++I;
if (I == E)
return;
while (true) {
StringRef Name = *I;
detail::InMemoryNode *Node = Dir->getChild(Name);
@@ -556,11 +557,13 @@ lookupInMemoryNode(const InMemoryFileSystem &FS, detail::InMemoryDirectory *Dir,
assert(!EC);
(void)EC;
FileManager::removeDotPaths(Path, /*RemoveDotDot=*/false);
if (Path.empty())
auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path);
if (*I == ".")
++I;
if (I == E)
return Dir;
auto I = llvm::sys::path::begin(Path), E = llvm::sys::path::end(Path);
while (true) {
detail::InMemoryNode *Node = Dir->getChild(*I);
++I;