diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2020-10-30 16:10:10 -0400 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2020-12-02 14:07:23 -0800 |
commit | 32c501dd88b62787d3a5ffda7aabcf4650dbe3cd (patch) | |
tree | 57b12b968aafed64121a218108c25abc09d408a1 /clang/lib/Lex/ModuleMap.cpp | |
parent | 327af6aa60bf689713ff7dde42a9caa3a2dd03f8 (diff) | |
download | llvm-32c501dd88b62787d3a5ffda7aabcf4650dbe3cd.zip llvm-32c501dd88b62787d3a5ffda7aabcf4650dbe3cd.tar.gz llvm-32c501dd88b62787d3a5ffda7aabcf4650dbe3cd.tar.bz2 |
Module: Use FileEntryRef and DirectoryEntryRef in Umbrella, Header, and DirectoryName, NFC
Push `FileEntryRef` and `DirectoryEntryRef` further, using it them
`Module::Umbrella`, `Module::Header::Entry`, and
`Module::DirectoryName::Entry`.
- Add `DirectoryEntryRef::operator const DirectoryEntry *` and
`OptionalDirectoryEntryRefDegradesToDirectoryEntryPtr`, to get the
same "degrades to `DirectoryEntry*` behaviour `FileEntryRef` enjoys
(this avoids a bunch of churn in various clang tools).
- Fix the `DirectoryEntryRef` constructor from `MapEntry` to take it by
`const&`.
Note that we cannot get rid of the `...AsWritten` names leveraging the
new classes, since these need to be as written in the `ModuleMap` file
and the module directory path is preprended for the lookup in the
`FileManager`.
Differential Revision: https://reviews.llvm.org/D90497
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index 28dd7ed..bbda1f1 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -300,7 +300,7 @@ bool ModuleMap::resolveAsBuiltinHeader( // supplied by Clang. Find that builtin header. SmallString<128> Path; llvm::sys::path::append(Path, BuiltinIncludeDir->getName(), Header.FileName); - auto File = SourceMgr.getFileManager().getFile(Path); + auto File = SourceMgr.getFileManager().getOptionalFileRef(Path); if (!File) return false; @@ -1012,7 +1012,7 @@ Module *ModuleMap::inferFrameworkModule(const DirectoryEntry *FrameworkDir, // Look for an umbrella header. SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); llvm::sys::path::append(UmbrellaName, "Headers", ModuleName + ".h"); - auto UmbrellaHeader = FileMgr.getFile(UmbrellaName); + auto UmbrellaHeader = FileMgr.getOptionalFileRef(UmbrellaName); // FIXME: If there's no umbrella header, we could probably scan the // framework to load *everything*. But, it's not clear that this is a good @@ -1121,21 +1121,21 @@ Module *ModuleMap::createShadowedModule(StringRef Name, bool IsFramework, return Result; } -void ModuleMap::setUmbrellaHeader(Module *Mod, const FileEntry *UmbrellaHeader, +void ModuleMap::setUmbrellaHeader(Module *Mod, FileEntryRef UmbrellaHeader, Twine NameAsWritten) { Headers[UmbrellaHeader].push_back(KnownHeader(Mod, NormalHeader)); - Mod->Umbrella = UmbrellaHeader; + Mod->Umbrella = &UmbrellaHeader.getMapEntry(); Mod->UmbrellaAsWritten = NameAsWritten.str(); - UmbrellaDirs[UmbrellaHeader->getDir()] = Mod; + UmbrellaDirs[UmbrellaHeader.getDir()] = Mod; // Notify callbacks that we just added a new header. for (const auto &Cb : Callbacks) Cb->moduleMapAddUmbrellaHeader(&SourceMgr.getFileManager(), UmbrellaHeader); } -void ModuleMap::setUmbrellaDir(Module *Mod, const DirectoryEntry *UmbrellaDir, +void ModuleMap::setUmbrellaDir(Module *Mod, DirectoryEntryRef UmbrellaDir, Twine NameAsWritten) { - Mod->Umbrella = UmbrellaDir; + Mod->Umbrella = &UmbrellaDir.getMapEntry(); Mod->UmbrellaAsWritten = NameAsWritten.str(); UmbrellaDirs[UmbrellaDir] = Mod; } @@ -2416,15 +2416,15 @@ void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { } // Look for this file. - const DirectoryEntry *Dir = nullptr; + Optional<DirectoryEntryRef> Dir; if (llvm::sys::path::is_absolute(DirName)) { - if (auto D = SourceMgr.getFileManager().getDirectory(DirName)) + if (auto D = SourceMgr.getFileManager().getOptionalDirectoryRef(DirName)) Dir = *D; } else { SmallString<128> PathName; PathName = Directory->getName(); llvm::sys::path::append(PathName, DirName); - if (auto D = SourceMgr.getFileManager().getDirectory(PathName)) + if (auto D = SourceMgr.getFileManager().getOptionalDirectoryRef(PathName)) Dir = *D; } @@ -2445,7 +2445,7 @@ void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { SourceMgr.getFileManager().getVirtualFileSystem(); for (llvm::vfs::recursive_directory_iterator I(FS, Dir->getName(), EC), E; I != E && !EC; I.increment(EC)) { - if (auto FE = SourceMgr.getFileManager().getFile(I->path())) { + if (auto FE = SourceMgr.getFileManager().getOptionalFileRef(I->path())) { Module::Header Header = {std::string(I->path()), *FE}; Headers.push_back(std::move(Header)); } @@ -2459,7 +2459,7 @@ void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { return; } - if (Module *OwningModule = Map.UmbrellaDirs[Dir]) { + if (Module *OwningModule = Map.UmbrellaDirs[*Dir]) { Diags.Report(UmbrellaLoc, diag::err_mmap_umbrella_clash) << OwningModule->getFullModuleName(); HadError = true; @@ -2467,7 +2467,7 @@ void ModuleMapParser::parseUmbrellaDirDecl(SourceLocation UmbrellaLoc) { } // Record this umbrella directory. - Map.setUmbrellaDir(ActiveModule, Dir, DirName); + Map.setUmbrellaDir(ActiveModule, *Dir, DirName); } /// Parse a module export declaration. |