Skip to content

Commit

Permalink
Lex: Update Module::findHeader to return FileEntryRef, NFC
Browse files Browse the repository at this point in the history
Update `Module::findHeader` to return `Optional<FileEntryRef>` and
fix its one caller.

Differential Revision: https://reviews.llvm.org/D90485
  • Loading branch information
dexonsmith committed Dec 1, 2020
1 parent 774f1d3 commit f85db7f
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 19 deletions.
7 changes: 3 additions & 4 deletions clang/include/clang/Lex/ModuleMap.h
Expand Up @@ -328,10 +328,9 @@ class ModuleMap {
/// \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<char> &RelativePathName,
bool &NeedsFramework);
Optional<FileEntryRef>
findHeader(Module *M, const Module::UnresolvedHeaderDirective &Header,
SmallVectorImpl<char> &RelativePathName, bool &NeedsFramework);

/// Resolve the given header directive.
///
Expand Down
30 changes: 15 additions & 15 deletions clang/lib/Lex/ModuleMap.cpp
Expand Up @@ -171,31 +171,31 @@ static void appendSubframeworkPaths(Module *Mod,
llvm::sys::path::append(Path, "Frameworks", Paths[I-1] + ".framework");
}

const FileEntry *ModuleMap::findHeader(
Optional<FileEntryRef> ModuleMap::findHeader(
Module *M, const Module::UnresolvedHeaderDirective &Header,
SmallVectorImpl<char> &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<FileEntryRef> {
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<FileEntryRef> {
unsigned FullPathLength = FullPathName.size();
appendSubframeworkPaths(M, RelativePathName);
unsigned RelativePathLength = RelativePathName.size();

// 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.
Expand Down Expand Up @@ -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
Expand All @@ -241,7 +241,7 @@ const FileEntry *ModuleMap::findHeader(
<< Header.FileName << M->getFullModuleName();
NeedsFramework = true;
}
return nullptr;
return None;
}

return NormalHdrFile;
Expand All @@ -251,18 +251,18 @@ void ModuleMap::resolveHeader(Module *Mod,
const Module::UnresolvedHeaderDirective &Header,
bool &NeedsFramework) {
SmallString<128> RelativePathName;
if (const FileEntry *File =
if (Optional<FileEntryRef> 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
Expand Down

0 comments on commit f85db7f

Please sign in to comment.