From f85db7f7ba683b2450892fde247311d7a48adbd0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Duncan=20P=2E=20N=2E=20Exon=C2=A0Smith?= Date: Thu, 29 Oct 2020 15:29:42 -0400 Subject: [PATCH] Lex: Update Module::findHeader to return FileEntryRef, NFC Update `Module::findHeader` to return `Optional` and fix its one caller. Differential Revision: https://reviews.llvm.org/D90485 --- clang/include/clang/Lex/ModuleMap.h | 7 +++---- clang/lib/Lex/ModuleMap.cpp | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/clang/include/clang/Lex/ModuleMap.h b/clang/include/clang/Lex/ModuleMap.h index 5b16403..f6423e5 100644 --- a/clang/include/clang/Lex/ModuleMap.h +++ b/clang/include/clang/Lex/ModuleMap.h @@ -328,10 +328,9 @@ private: /// \param NeedsFramework If M is not a framework but a missing header would /// be found in case M was, set it to true. False otherwise. /// \return The resolved file, if any. - const FileEntry *findHeader(Module *M, - const Module::UnresolvedHeaderDirective &Header, - SmallVectorImpl &RelativePathName, - bool &NeedsFramework); + Optional + findHeader(Module *M, const Module::UnresolvedHeaderDirective &Header, + SmallVectorImpl &RelativePathName, bool &NeedsFramework); /// Resolve the given header directive. /// diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index cb49173..28dd7ed 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -171,23 +171,23 @@ static void appendSubframeworkPaths(Module *Mod, llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework"); } -const FileEntry *ModuleMap::findHeader( +Optional ModuleMap::findHeader( Module *M, const Module::UnresolvedHeaderDirective &Header, SmallVectorImpl &RelativePathName, bool &NeedsFramework) { // Search for the header file within the module's home directory. auto *Directory = M->Directory; SmallString<128> FullPathName(Directory->getName()); - auto GetFile = [&](StringRef Filename) -> const FileEntry * { - auto File = SourceMgr.getFileManager().getFile(Filename); - if (!File || - (Header.Size && (*File)->getSize() != *Header.Size) || - (Header.ModTime && (*File)->getModificationTime() != *Header.ModTime)) - return nullptr; + auto GetFile = [&](StringRef Filename) -> Optional { + auto File = + expectedToOptional(SourceMgr.getFileManager().getFileRef(Filename)); + if (!File || (Header.Size && File->getSize() != *Header.Size) || + (Header.ModTime && File->getModificationTime() != *Header.ModTime)) + return None; return *File; }; - auto GetFrameworkFile = [&]() -> const FileEntry * { + auto GetFrameworkFile = [&]() -> Optional { unsigned FullPathLength = FullPathName.size(); appendSubframeworkPaths(M, RelativePathName); unsigned RelativePathLength = RelativePathName.size(); @@ -195,7 +195,7 @@ const FileEntry *ModuleMap::findHeader( // Check whether this file is in the public headers. llvm::sys::path::append(RelativePathName, "Headers", Header.FileName); llvm::sys::path::append(FullPathName, RelativePathName); - if (auto *File = GetFile(FullPathName)) + if (auto File = GetFile(FullPathName)) return File; // Check whether this file is in the private headers. @@ -227,7 +227,7 @@ const FileEntry *ModuleMap::findHeader( // Lookup for normal headers. llvm::sys::path::append(RelativePathName, Header.FileName); llvm::sys::path::append(FullPathName, RelativePathName); - auto *NormalHdrFile = GetFile(FullPathName); + auto NormalHdrFile = GetFile(FullPathName); if (!NormalHdrFile && Directory->getName().endswith(".framework")) { // The lack of 'framework' keyword in a module declaration it's a simple @@ -241,7 +241,7 @@ const FileEntry *ModuleMap::findHeader( << Header.FileName << M->getFullModuleName(); NeedsFramework = true; } - return nullptr; + return None; } return NormalHdrFile; @@ -251,18 +251,18 @@ void ModuleMap::resolveHeader(Module *Mod, const Module::UnresolvedHeaderDirective &Header, bool &NeedsFramework) { SmallString<128> RelativePathName; - if (const FileEntry *File = + if (Optional File = findHeader(Mod, Header, RelativePathName, NeedsFramework)) { if (Header.IsUmbrella) { - const DirectoryEntry *UmbrellaDir = File->getDir(); + const DirectoryEntry *UmbrellaDir = &File->getDir().getDirEntry(); if (Module *UmbrellaMod = UmbrellaDirs[UmbrellaDir]) Diags.Report(Header.FileNameLoc, diag::err_mmap_umbrella_clash) << UmbrellaMod->getFullModuleName(); else // Record this umbrella header. - setUmbrellaHeader(Mod, File, RelativePathName.str()); + setUmbrellaHeader(Mod, *File, RelativePathName.str()); } else { - Module::Header H = {std::string(RelativePathName.str()), File}; + Module::Header H = {std::string(RelativePathName.str()), *File}; if (Header.Kind == Module::HK_Excluded) excludeHeader(Mod, H); else -- 2.7.4