diff options
Diffstat (limited to 'clang/lib/Basic')
| -rw-r--r-- | clang/lib/Basic/FileManager.cpp | 8 | ||||
| -rw-r--r-- | clang/lib/Basic/VirtualFileSystem.cpp | 72 | 
2 files changed, 19 insertions, 61 deletions
| diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index 0a79800ed72..7e2d01c4981 100644 --- a/clang/lib/Basic/FileManager.cpp +++ b/clang/lib/Basic/FileManager.cpp @@ -315,11 +315,9 @@ const FileEntry *FileManager::getFile(StringRef Filename, bool openFile,    UFE.InPCH = Data.InPCH;    UFE.File = std::move(F);    UFE.IsValid = true; - -  SmallString<128> RealPathName; -  if (!FS->getRealPath(InterndFileName, RealPathName)) -    UFE.RealPathName = RealPathName.str(); - +  if (UFE.File) +    if (auto RealPathName = UFE.File->getName()) +      UFE.RealPathName = *RealPathName;    return &UFE;  } diff --git a/clang/lib/Basic/VirtualFileSystem.cpp b/clang/lib/Basic/VirtualFileSystem.cpp index f8acde94ca9..bcfcbdbb901 100644 --- a/clang/lib/Basic/VirtualFileSystem.cpp +++ b/clang/lib/Basic/VirtualFileSystem.cpp @@ -471,33 +471,15 @@ enum InMemoryNodeKind { IME_File, IME_Directory };  /// The in memory file system is a tree of Nodes. Every node can either be a  /// file or a directory.  class InMemoryNode { -  InMemoryNodeKind Kind;    Status Stat; - -protected: -  /// Return Stat.  This should only be used for internal/debugging use.  When -  /// clients wants the Status of this node, they should use -  /// \p getStatus(StringRef). -  const Status& getStatus() const { -    return Stat; -  } +  InMemoryNodeKind Kind;  public:    InMemoryNode(Status Stat, InMemoryNodeKind Kind) -      : Kind(Kind), Stat(std::move(Stat)) {} +      : Stat(std::move(Stat)), Kind(Kind) {}    virtual ~InMemoryNode() = default; -  /// Return the \p Status for this node. \p RequestedName should be the name -  /// through which the caller referred to this node. It will override -  /// \p Status::Name in the return value, to mimic the behavior of \p RealFile. -  Status getStatus(StringRef RequestedName) const { -    return Status::copyWithNewName(Stat, RequestedName); -  } - -  /// Get the filename of this node (the name without the directory part). -  StringRef getFileName() const { -    return llvm::sys::path::filename(Stat.getName()); -  } +  const Status &getStatus() const { return Stat; }    InMemoryNodeKind getKind() const { return Kind; }    virtual std::string toString(unsigned Indent) const = 0;  }; @@ -522,22 +504,14 @@ public:    }  }; -/// Adapt a InMemoryFile for VFS' File interface.  The goal is to make -/// \p InMemoryFileAdaptor mimic as much as possible the behavior of -/// \p RealFile. +/// Adapt a InMemoryFile for VFS' File interface.  class InMemoryFileAdaptor : public File {    InMemoryFile &Node; -  /// The name to use when returning a Status for this file. -  std::string RequestedName; -  public: -  explicit InMemoryFileAdaptor(InMemoryFile &Node, std::string RequestedName) -      : Node(Node), RequestedName(std::move(RequestedName)) {} +  explicit InMemoryFileAdaptor(InMemoryFile &Node) : Node(Node) {} -  llvm::ErrorOr<Status> status() override { -    return Node.getStatus(RequestedName); -  } +  llvm::ErrorOr<Status> status() override { return Node.getStatus(); }    llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>>    getBuffer(const Twine &Name, int64_t FileSize, bool RequiresNullTerminator, @@ -737,7 +711,7 @@ lookupInMemoryNode(const InMemoryFileSystem &FS, detail::InMemoryDirectory *Dir,  llvm::ErrorOr<Status> InMemoryFileSystem::status(const Twine &Path) {    auto Node = lookupInMemoryNode(*this, Root.get(), Path);    if (Node) -    return (*Node)->getStatus(Path.str()); +    return (*Node)->getStatus();    return Node.getError();  } @@ -750,8 +724,7 @@ InMemoryFileSystem::openFileForRead(const Twine &Path) {    // When we have a file provide a heap-allocated wrapper for the memory buffer    // to match the ownership semantics for File.    if (auto *F = dyn_cast<detail::InMemoryFile>(*Node)) -    return std::unique_ptr<File>( -        new detail::InMemoryFileAdaptor(*F, Path.str())); +    return std::unique_ptr<File>(new detail::InMemoryFileAdaptor(*F));    // FIXME: errc::not_a_file?    return make_error_code(llvm::errc::invalid_argument); @@ -763,33 +736,21 @@ namespace {  class InMemoryDirIterator : public clang::vfs::detail::DirIterImpl {    detail::InMemoryDirectory::const_iterator I;    detail::InMemoryDirectory::const_iterator E; -  std::string RequestedDirName; - -  void setCurrentEntry() { -    if (I != E) { -      SmallString<256> Path(RequestedDirName); -      llvm::sys::path::append(Path, I->second->getFileName()); -      CurrentEntry = I->second->getStatus(Path.str()); -    } else { -      // When we're at the end, make CurrentEntry invalid and DirIterImpl will -      // do the rest. -      CurrentEntry = Status(); -    } -  }  public:    InMemoryDirIterator() = default; -  explicit InMemoryDirIterator(detail::InMemoryDirectory &Dir, -                               std::string RequestedDirName) -      : I(Dir.begin()), E(Dir.end()), -        RequestedDirName(std::move(RequestedDirName)) { -    setCurrentEntry(); +  explicit InMemoryDirIterator(detail::InMemoryDirectory &Dir) +      : I(Dir.begin()), E(Dir.end()) { +    if (I != E) +      CurrentEntry = I->second->getStatus();    }    std::error_code increment() override {      ++I; -    setCurrentEntry(); +    // When we're at the end, make CurrentEntry invalid and DirIterImpl will do +    // the rest. +    CurrentEntry = I != E ? I->second->getStatus() : Status();      return {};    }  }; @@ -805,8 +766,7 @@ directory_iterator InMemoryFileSystem::dir_begin(const Twine &Dir,    }    if (auto *DirNode = dyn_cast<detail::InMemoryDirectory>(*Node)) -    return directory_iterator( -        std::make_shared<InMemoryDirIterator>(*DirNode, Dir.str())); +    return directory_iterator(std::make_shared<InMemoryDirIterator>(*DirNode));    EC = make_error_code(llvm::errc::not_a_directory);    return directory_iterator(std::make_shared<InMemoryDirIterator>()); | 

