diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-11-17 01:41:17 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-11-17 01:41:17 +0000 |
commit | 56c64013064b646c50f703615d5597ec5c8d4f72 (patch) | |
tree | d178c6948ccb9e073158acbf45f286e924f451da /clang/lib/Lex/ModuleMap.cpp | |
parent | 489c0ff4a434ca4e96cf485dc564c6310947240b (diff) | |
download | bcm5719-llvm-56c64013064b646c50f703615d5597ec5c8d4f72.tar.gz bcm5719-llvm-56c64013064b646c50f703615d5597ec5c8d4f72.zip |
When we're loading a framework header, first try to turn the framework
into a module. This module can either be loaded from a module map in
the framework directory (which isn't quite working yet) or inferred
from an umbrella header (which does work, and replaces the existing
hack).
llvm-svn: 144877
Diffstat (limited to 'clang/lib/Lex/ModuleMap.cpp')
-rw-r--r-- | clang/lib/Lex/ModuleMap.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/lib/Lex/ModuleMap.cpp b/clang/lib/Lex/ModuleMap.cpp index f6751b78f1e..0c51659cab8 100644 --- a/clang/lib/Lex/ModuleMap.cpp +++ b/clang/lib/Lex/ModuleMap.cpp @@ -127,6 +127,34 @@ ModuleMap::Module *ModuleMap::findModule(StringRef Name) { return 0; } +ModuleMap::Module * +ModuleMap::inferFrameworkModule(StringRef ModuleName, + const DirectoryEntry *FrameworkDir) { + // Check whether we've already found this module. + if (Module *Module = findModule(ModuleName)) + return Module; + + // Look for an umbrella header. + llvm::SmallString<128> UmbrellaName = StringRef(FrameworkDir->getName()); + llvm::sys::path::append(UmbrellaName, "Headers"); + llvm::sys::path::append(UmbrellaName, ModuleName + ".h"); + const FileEntry *UmbrellaHeader + = SourceMgr->getFileManager().getFile(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 + // idea. + if (!UmbrellaHeader) + return 0; + + Module *Result = new Module(ModuleName, SourceLocation()); + Result->UmbrellaHeader = UmbrellaHeader; + Headers[UmbrellaHeader] = Result; + UmbrellaDirs[FrameworkDir] = Result; + Modules[ModuleName] = Result; + return Result; +} + static void indent(llvm::raw_ostream &OS, unsigned Spaces) { OS << std::string(' ', Spaces); } |