diff options
Diffstat (limited to 'clang/lib/ARCMigrate/FileRemapper.cpp')
| -rw-r--r-- | clang/lib/ARCMigrate/FileRemapper.cpp | 107 |
1 files changed, 53 insertions, 54 deletions
diff --git a/clang/lib/ARCMigrate/FileRemapper.cpp b/clang/lib/ARCMigrate/FileRemapper.cpp index 7e56e0683c12..7abc862ceecc 100644 --- a/clang/lib/ARCMigrate/FileRemapper.cpp +++ b/clang/lib/ARCMigrate/FileRemapper.cpp @@ -60,7 +60,7 @@ bool FileRemapper::initFromFile(StringRef filePath, DiagnosticsEngine &Diag, if (!llvm::sys::fs::exists(infoFile)) return false; - std::vector<std::pair<const FileEntry *, const FileEntry *> > pairs; + std::vector<std::pair<FileEntryRef, FileEntryRef>> pairs; llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> fileBuf = llvm::MemoryBuffer::getFile(infoFile, /*IsText=*/true); @@ -78,20 +78,20 @@ bool FileRemapper::initFromFile(StringRef filePath, DiagnosticsEngine &Diag, Diag); StringRef toFilename = lines[idx+2]; - llvm::ErrorOr<const FileEntry *> origFE = FileMgr->getFile(fromFilename); + auto origFE = FileMgr->getOptionalFileRef(fromFilename); if (!origFE) { if (ignoreIfFilesChanged) continue; return report("File does not exist: " + fromFilename, Diag); } - llvm::ErrorOr<const FileEntry *> newFE = FileMgr->getFile(toFilename); + auto newFE = FileMgr->getOptionalFileRef(toFilename); if (!newFE) { if (ignoreIfFilesChanged) continue; return report("File does not exist: " + toFilename, Diag); } - if ((uint64_t)(*origFE)->getModificationTime() != timeModified) { + if ((uint64_t)origFE->getModificationTime() != timeModified) { if (ignoreIfFilesChanged) continue; return report("File was modified: " + fromFilename, Diag); @@ -128,13 +128,13 @@ bool FileRemapper::flushToFile(StringRef outputPath, DiagnosticsEngine &Diag) { for (MappingsTy::iterator I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) { - const FileEntry *origFE = I->first; - SmallString<200> origPath = StringRef(origFE->getName()); + FileEntryRef origFE = I->first; + SmallString<200> origPath = StringRef(origFE.getName()); fs::make_absolute(origPath); infoOut << origPath << '\n'; - infoOut << (uint64_t)origFE->getModificationTime() << '\n'; + infoOut << (uint64_t)origFE.getModificationTime() << '\n'; - if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) { + if (const auto *FE = std::get_if<FileEntryRef>(&I->second)) { SmallString<200> newPath = StringRef(FE->getName()); fs::make_absolute(newPath); infoOut << newPath << '\n'; @@ -143,20 +143,20 @@ bool FileRemapper::flushToFile(StringRef outputPath, DiagnosticsEngine &Diag) { SmallString<64> tempPath; int fd; if (fs::createTemporaryFile( - path::filename(origFE->getName()), - path::extension(origFE->getName()).drop_front(), fd, tempPath, + path::filename(origFE.getName()), + path::extension(origFE.getName()).drop_front(), fd, tempPath, llvm::sys::fs::OF_Text)) return report("Could not create file: " + tempPath.str(), Diag); llvm::raw_fd_ostream newOut(fd, /*shouldClose=*/true); - llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>(); + llvm::MemoryBuffer *mem = std::get<llvm::MemoryBuffer *>(I->second); newOut.write(mem->getBufferStart(), mem->getBufferSize()); newOut.close(); - auto newE = FileMgr->getFile(tempPath); + auto newE = FileMgr->getOptionalFileRef(tempPath); if (newE) { remap(origFE, *newE); - infoOut << (*newE)->getName() << '\n'; + infoOut << newE->getName() << '\n'; } } } @@ -171,18 +171,18 @@ bool FileRemapper::overwriteOriginal(DiagnosticsEngine &Diag, for (MappingsTy::iterator I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) { - const FileEntry *origFE = I->first; - assert(I->second.is<llvm::MemoryBuffer *>()); - if (!fs::exists(origFE->getName())) - return report(StringRef("File does not exist: ") + origFE->getName(), + FileEntryRef origFE = I->first; + assert(std::holds_alternative<llvm::MemoryBuffer *>(I->second)); + if (!fs::exists(origFE.getName())) + return report(StringRef("File does not exist: ") + origFE.getName(), Diag); std::error_code EC; - llvm::raw_fd_ostream Out(origFE->getName(), EC, llvm::sys::fs::OF_None); + llvm::raw_fd_ostream Out(origFE.getName(), EC, llvm::sys::fs::OF_None); if (EC) return report(EC.message(), Diag); - llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>(); + llvm::MemoryBuffer *mem = std::get<llvm::MemoryBuffer *>(I->second); Out.write(mem->getBufferStart(), mem->getBufferSize()); Out.close(); } @@ -196,24 +196,24 @@ void FileRemapper::forEachMapping( llvm::function_ref<void(StringRef, const llvm::MemoryBufferRef &)> CaptureBuffer) const { for (auto &Mapping : FromToMappings) { - if (const FileEntry *FE = Mapping.second.dyn_cast<const FileEntry *>()) { - CaptureFile(Mapping.first->getName(), FE->getName()); + if (const auto *FE = std::get_if<FileEntryRef>(&Mapping.second)) { + CaptureFile(Mapping.first.getName(), FE->getName()); continue; } CaptureBuffer( - Mapping.first->getName(), - Mapping.second.get<llvm::MemoryBuffer *>()->getMemBufferRef()); + Mapping.first.getName(), + std::get<llvm::MemoryBuffer *>(Mapping.second)->getMemBufferRef()); } } void FileRemapper::applyMappings(PreprocessorOptions &PPOpts) const { for (MappingsTy::const_iterator I = FromToMappings.begin(), E = FromToMappings.end(); I != E; ++I) { - if (const FileEntry *FE = I->second.dyn_cast<const FileEntry *>()) { - PPOpts.addRemappedFile(I->first->getName(), FE->getName()); + if (const auto *FE = std::get_if<FileEntryRef>(&I->second)) { + PPOpts.addRemappedFile(I->first.getName(), FE->getName()); } else { - llvm::MemoryBuffer *mem = I->second.get<llvm::MemoryBuffer *>(); - PPOpts.addRemappedFile(I->first->getName(), mem); + llvm::MemoryBuffer *mem = std::get<llvm::MemoryBuffer *>(I->second); + PPOpts.addRemappedFile(I->first.getName(), mem); } } @@ -222,48 +222,47 @@ void FileRemapper::applyMappings(PreprocessorOptions &PPOpts) const { void FileRemapper::remap(StringRef filePath, std::unique_ptr<llvm::MemoryBuffer> memBuf) { - remap(getOriginalFile(filePath), std::move(memBuf)); + OptionalFileEntryRef File = getOriginalFile(filePath); + assert(File); + remap(*File, std::move(memBuf)); } -void FileRemapper::remap(const FileEntry *file, - std::unique_ptr<llvm::MemoryBuffer> memBuf) { - assert(file); - Target &targ = FromToMappings[file]; - resetTarget(targ); - targ = memBuf.release(); +void FileRemapper::remap(FileEntryRef File, + std::unique_ptr<llvm::MemoryBuffer> MemBuf) { + auto [It, New] = FromToMappings.insert({File, nullptr}); + if (!New) + resetTarget(It->second); + It->second = MemBuf.release(); } -void FileRemapper::remap(const FileEntry *file, const FileEntry *newfile) { - assert(file && newfile); - Target &targ = FromToMappings[file]; - resetTarget(targ); - targ = newfile; - ToFromMappings[newfile] = file; +void FileRemapper::remap(FileEntryRef File, FileEntryRef NewFile) { + auto [It, New] = FromToMappings.insert({File, nullptr}); + if (!New) + resetTarget(It->second); + It->second = NewFile; + ToFromMappings.insert({NewFile, File}); } -const FileEntry *FileRemapper::getOriginalFile(StringRef filePath) { - const FileEntry *file = nullptr; - if (auto fileOrErr = FileMgr->getFile(filePath)) - file = *fileOrErr; +OptionalFileEntryRef FileRemapper::getOriginalFile(StringRef filePath) { + OptionalFileEntryRef File = FileMgr->getOptionalFileRef(filePath); + if (!File) + return std::nullopt; // If we are updating a file that overridden an original file, // actually update the original file. - llvm::DenseMap<const FileEntry *, const FileEntry *>::iterator - I = ToFromMappings.find(file); + auto I = ToFromMappings.find(*File); if (I != ToFromMappings.end()) { - file = I->second; - assert(FromToMappings.contains(file) && "Original file not in mappings!"); + *File = I->second; + assert(FromToMappings.contains(*File) && "Original file not in mappings!"); } - return file; + return File; } void FileRemapper::resetTarget(Target &targ) { - if (!targ) - return; - - if (llvm::MemoryBuffer *oldmem = targ.dyn_cast<llvm::MemoryBuffer *>()) { + if (std::holds_alternative<llvm::MemoryBuffer *>(targ)) { + llvm::MemoryBuffer *oldmem = std::get<llvm::MemoryBuffer *>(targ); delete oldmem; } else { - const FileEntry *toFE = targ.get<const FileEntry *>(); + FileEntryRef toFE = std::get<FileEntryRef>(targ); ToFromMappings.erase(toFE); } } |
