diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-12-06 19:39:29 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-12-06 19:39:29 +0000 |
commit | ac252a3b0f8101a7274309e4a5cf2d5f0fdba675 (patch) | |
tree | 444e81bdd5f34b56b79a2d137b66f72566525d78 /lib/Lex/ModuleMap.cpp | |
parent | b80a3869b419c94ad85d2a39041c59100691bb3e (diff) |
When inferring a module map for a framework, infer subframework
modules for each of its subframeworks.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145957 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Lex/ModuleMap.cpp')
-rw-r--r-- | lib/Lex/ModuleMap.cpp | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/lib/Lex/ModuleMap.cpp b/lib/Lex/ModuleMap.cpp index 581a5d5631..ac5ae1e311 100644 --- a/lib/Lex/ModuleMap.cpp +++ b/lib/Lex/ModuleMap.cpp @@ -20,6 +20,7 @@ #include "clang/Basic/TargetInfo.h" #include "clang/Basic/TargetOptions.h" #include "llvm/Support/Allocator.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/Host.h" #include "llvm/Support/PathV2.h" #include "llvm/Support/raw_ostream.h" @@ -219,17 +220,19 @@ ModuleMap::findOrCreateModule(StringRef Name, Module *Parent, bool IsFramework, Module * ModuleMap::inferFrameworkModule(StringRef ModuleName, - const DirectoryEntry *FrameworkDir) { + const DirectoryEntry *FrameworkDir, + Module *Parent) { // Check whether we've already found this module. - if (Module *Module = findModule(ModuleName)) - return Module; + if (Module *Mod = lookupModuleQualified(ModuleName, Parent)) + return Mod; + + FileManager &FileMgr = SourceMgr->getFileManager(); // 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); + const FileEntry *UmbrellaHeader = FileMgr.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 @@ -237,8 +240,14 @@ ModuleMap::inferFrameworkModule(StringRef ModuleName, if (!UmbrellaHeader) return 0; - Module *Result = new Module(ModuleName, SourceLocation(), - /*IsFramework=*/true); + Module *Result = new Module(ModuleName, SourceLocation(), Parent, + /*IsFramework=*/true, /*IsExplicit=*/false); + + if (Parent) + Parent->SubModules[ModuleName] = Result; + else + Modules[ModuleName] = Result; + // umbrella "umbrella-header-name" Result->UmbrellaHeader = UmbrellaHeader; Headers[UmbrellaHeader] = Result; @@ -251,9 +260,24 @@ ModuleMap::inferFrameworkModule(StringRef ModuleName, Result->InferSubmodules = true; Result->InferExportWildcard = true; - // FIXME: Look for subframeworks. + // Look for subframeworks. + llvm::error_code EC; + llvm::SmallString<128> SubframeworksDirName = StringRef(FrameworkDir->getName()); + llvm::sys::path::append(SubframeworksDirName, "Frameworks"); + for (llvm::sys::fs::directory_iterator Dir(SubframeworksDirName.str(), EC), + DirEnd; + Dir != DirEnd && !EC; Dir.increment(EC)) { + if (!StringRef(Dir->path()).endswith(".framework")) + continue; + + if (const DirectoryEntry *SubframeworkDir + = FileMgr.getDirectory(Dir->path())) { + // FIXME: Do we want to warn about subframeworks without umbrella headers? + inferFrameworkModule(llvm::sys::path::stem(Dir->path()), SubframeworkDir, + Result); + } + } - Modules[ModuleName] = Result; return Result; } |