]> granicus.if.org Git - clang/commitdiff
Minor tweak to prepare for submodules with umbrella headers. No actual
authorDouglas Gregor <dgregor@apple.com>
Tue, 6 Dec 2011 16:17:15 +0000 (16:17 +0000)
committerDouglas Gregor <dgregor@apple.com>
Tue, 6 Dec 2011 16:17:15 +0000 (16:17 +0000)
functionality change yet.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@145938 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Lex/ModuleMap.cpp

index 498061fc05a496496e8cc843a4e0f28c470c2419..198544dd5176e2616b76cfdf4ed75f9acb1c3037 100644 (file)
@@ -103,8 +103,14 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) {
       = UmbrellaDirs.find(Dir);
     if (KnownDir != UmbrellaDirs.end()) {
       Module *Result = KnownDir->second;
-      Module *TopModule = Result->getTopLevelModule();
-      if (TopModule->InferSubmodules) {
+      
+      // Search up the module stack until we find a module with an umbrella
+      // header.
+      Module *UmbrellaModule = Result;
+      while (!UmbrellaModule->UmbrellaHeader && UmbrellaModule->Parent)
+        UmbrellaModule = UmbrellaModule->Parent;
+      
+      if (UmbrellaModule->InferSubmodules) {
         // Infer submodules for each of the directories we found between
         // the directory of the umbrella header and the directory where 
         // the actual header is located.
@@ -114,32 +120,32 @@ Module *ModuleMap::findModuleForHeader(const FileEntry *File) {
         // FIXME: Should we tack on an "explicit" for PrivateHeaders? That
         // might be what we want, but it feels like a hack.
         unsigned LastSkippedDir = SkippedDirs.size();
-        if (LastSkippedDir && TopModule->IsFramework)
+        if (LastSkippedDir && UmbrellaModule->IsFramework)
           --LastSkippedDir;
         
         for (unsigned I = LastSkippedDir; I != 0; --I) {
           // Find or create the module that corresponds to this directory name.
           StringRef Name = llvm::sys::path::stem(SkippedDirs[I-1]->getName());
           Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
-                                      TopModule->InferExplicitSubmodules).first;
+                                      UmbrellaModule->InferExplicitSubmodules).first;
           
           // Associate the module and the directory.
           UmbrellaDirs[SkippedDirs[I-1]] = Result;
 
           // If inferred submodules export everything they import, add a 
           // wildcard to the set of exports.
-          if (TopModule->InferExportWildcard && Result->Exports.empty())
+          if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
             Result->Exports.push_back(Module::ExportDecl(0, true));
         }
         
         // Infer a submodule with the same name as this header file.
         StringRef Name = llvm::sys::path::stem(File->getName());
         Result = findOrCreateModule(Name, Result, /*IsFramework=*/false,
-                                    TopModule->InferExplicitSubmodules).first;
+                                    UmbrellaModule->InferExplicitSubmodules).first;
         
         // If inferred submodules export everything they import, add a 
         // wildcard to the set of exports.
-        if (TopModule->InferExportWildcard && Result->Exports.empty())
+        if (UmbrellaModule->InferExportWildcard && Result->Exports.empty())
           Result->Exports.push_back(Module::ExportDecl(0, true));
       } else {
         // Record each of the directories we stepped through as being part of