r174683 - Teach subframework header lookup to suggest modules <rdar://problem/13176200>.

Douglas Gregor dgregor at apple.com
Thu Feb 7 16:10:48 PST 2013


Author: dgregor
Date: Thu Feb  7 18:10:48 2013
New Revision: 174683

URL: http://llvm.org/viewvc/llvm-project?rev=174683&view=rev
Log:
Teach subframework header lookup to suggest modules <rdar://problem/13176200>.

Added:
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Sub.h
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Types.h
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Headers/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Headers/HasSubModules.h
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/PrivateHeaders/
    cfe/trunk/test/Modules/Inputs/HasSubModules.framework/PrivateHeaders/HasSubModulesPriv.h
Modified:
    cfe/trunk/include/clang/Lex/HeaderSearch.h
    cfe/trunk/lib/Lex/HeaderSearch.cpp
    cfe/trunk/lib/Lex/PPDirectives.cpp
    cfe/trunk/test/Index/index-module.m
    cfe/trunk/test/Modules/subframeworks.m

Modified: cfe/trunk/include/clang/Lex/HeaderSearch.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/HeaderSearch.h?rev=174683&r1=174682&r2=174683&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/HeaderSearch.h (original)
+++ cfe/trunk/include/clang/Lex/HeaderSearch.h Thu Feb  7 18:10:48 2013
@@ -363,7 +363,8 @@ public:
       StringRef Filename,
       const FileEntry *RelativeFileEnt,
       SmallVectorImpl<char> *SearchPath,
-      SmallVectorImpl<char> *RelativePath);
+      SmallVectorImpl<char> *RelativePath,
+      Module **SuggestedModule);
 
   /// \brief Look up the specified framework name in our framework cache.
   /// \returns The DirectoryEntry it is in if we know, null otherwise.

Modified: cfe/trunk/lib/Lex/HeaderSearch.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/HeaderSearch.cpp?rev=174683&r1=174682&r2=174683&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/HeaderSearch.cpp (original)
+++ cfe/trunk/lib/Lex/HeaderSearch.cpp Thu Feb  7 18:10:48 2013
@@ -665,7 +665,8 @@ const FileEntry *HeaderSearch::
 LookupSubframeworkHeader(StringRef Filename,
                          const FileEntry *ContextFileEnt,
                          SmallVectorImpl<char> *SearchPath,
-                         SmallVectorImpl<char> *RelativePath) {
+                         SmallVectorImpl<char> *RelativePath,
+                         Module **SuggestedModule) {
   assert(ContextFileEnt && "No context file?");
 
   // Framework names must have a '/' in the filename.  Find it.
@@ -754,6 +755,26 @@ LookupSubframeworkHeader(StringRef Filen
   // of evaluation.
   unsigned DirInfo = getFileInfo(ContextFileEnt).DirInfo;
   getFileInfo(FE).DirInfo = DirInfo;
+
+  // If we're supposed to suggest a module, look for one now.
+  if (SuggestedModule) {
+    // Find the top-level framework based on this framework.
+    FrameworkName.pop_back(); // remove the trailing '/'
+    SmallVector<std::string, 4> SubmodulePath;
+    const DirectoryEntry *TopFrameworkDir
+      = ::getTopFrameworkDir(FileMgr, FrameworkName, SubmodulePath);
+    
+    // Determine the name of the top-level framework.
+    StringRef ModuleName = llvm::sys::path::stem(TopFrameworkDir->getName());
+
+    // Load this framework module. If that succeeds, find the suggested module
+    // for this header, if any.
+    bool IsSystem = false;
+    if (loadFrameworkModule(ModuleName, TopFrameworkDir, IsSystem)) {
+      *SuggestedModule = findModuleForHeader(FE);
+    }
+  }
+
   return FE;
 }
 

Modified: cfe/trunk/lib/Lex/PPDirectives.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPDirectives.cpp?rev=174683&r1=174682&r2=174683&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/PPDirectives.cpp (original)
+++ cfe/trunk/lib/Lex/PPDirectives.cpp Thu Feb  7 18:10:48 2013
@@ -537,11 +537,11 @@ const FileEntry *Preprocessor::LookupFil
   // Otherwise, see if this is a subframework header.  If so, this is relative
   // to one of the headers on the #include stack.  Walk the list of the current
   // headers on the #include stack and pass them to HeaderInfo.
-  // FIXME: SuggestedModule!
   if (IsFileLexer()) {
     if ((CurFileEnt = SourceMgr.getFileEntryForID(CurPPLexer->getFileID())))
       if ((FE = HeaderInfo.LookupSubframeworkHeader(Filename, CurFileEnt,
-                                                    SearchPath, RelativePath)))
+                                                    SearchPath, RelativePath,
+                                                    SuggestedModule)))
         return FE;
   }
 
@@ -551,7 +551,8 @@ const FileEntry *Preprocessor::LookupFil
       if ((CurFileEnt =
            SourceMgr.getFileEntryForID(ISEntry.ThePPLexer->getFileID())))
         if ((FE = HeaderInfo.LookupSubframeworkHeader(
-                Filename, CurFileEnt, SearchPath, RelativePath)))
+                Filename, CurFileEnt, SearchPath, RelativePath,
+                SuggestedModule)))
           return FE;
     }
   }

Modified: cfe/trunk/test/Index/index-module.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/index-module.m?rev=174683&r1=174682&r2=174683&view=diff
==============================================================================
--- cfe/trunk/test/Index/index-module.m (original)
+++ cfe/trunk/test/Index/index-module.m Thu Feb  7 18:10:48 2013
@@ -26,6 +26,7 @@ int glob;
 // CHECK-DMOD-NEXT: [ppIncludedFile]: [[DMOD_PRIVATE_H:.*/Modules/Inputs/DependsOnModule.framework[/\\]PrivateHeaders[/\\]DependsOnModulePrivate.h]] | {{.*}} | hash loc: <invalid>
 // CHECK-DMOD-NEXT: [importedASTFile]: {{.*}}.cache{{[/\\]}}Module.pcm | loc: [[DMOD_MODULE_H]]:1:2 | name: "Module" | isImplicit: 1
 // CHECK-DMOD-NEXT: [indexDeclaration]: kind: variable | name: depends_on_module_other | {{.*}} | loc: [[DMOD_OTHER_H]]:1:5
+// CHECK-DMOD-NEXT: [importedASTFile]: {{.*}}.cache/DependsOnModule.pcm | loc: {{.*}}SubFramework.h:1:2 | name: "DependsOnModule.SubFramework.Other" | isImplicit: 1
 // CHECK-DMOD-NEXT: [indexDeclaration]: kind: variable | name: sub_framework | {{.*}} | loc: [[DMOD_SUB_H]]:2:8
 // CHECK-DMOD-NEXT: [indexDeclaration]: kind: variable | name: sub_framework_other | {{.*}} | loc: [[DMOD_SUB_OTHER_H]]:1:9
 // CHECK-DMOD-NEXT: [indexDeclaration]: kind: variable | name: depends_on_module_private | {{.*}} | loc: [[DMOD_PRIVATE_H]]:1:5

Added: cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Sub.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Sub.h?rev=174683&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Sub.h (added)
+++ cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Sub.h Thu Feb  7 18:10:48 2013
@@ -0,0 +1 @@
+#include <Sub/Types.h>

Added: cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Types.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Types.h?rev=174683&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Types.h (added)
+++ cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/Headers/Types.h Thu Feb  7 18:10:48 2013
@@ -0,0 +1,4 @@
+struct FrameworkSubStruct {
+  const char * name;
+  unsigned version;
+};

Added: cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h?rev=174683&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h (added)
+++ cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Frameworks/Sub.framework/PrivateHeaders/SubPriv.h Thu Feb  7 18:10:48 2013
@@ -0,0 +1 @@
+#include <Sub/Types.h>

Added: cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Headers/HasSubModules.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Headers/HasSubModules.h?rev=174683&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Headers/HasSubModules.h (added)
+++ cfe/trunk/test/Modules/Inputs/HasSubModules.framework/Headers/HasSubModules.h Thu Feb  7 18:10:48 2013
@@ -0,0 +1 @@
+#import <Sub/Sub.h>

Added: cfe/trunk/test/Modules/Inputs/HasSubModules.framework/PrivateHeaders/HasSubModulesPriv.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/HasSubModules.framework/PrivateHeaders/HasSubModulesPriv.h?rev=174683&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/HasSubModules.framework/PrivateHeaders/HasSubModulesPriv.h (added)
+++ cfe/trunk/test/Modules/Inputs/HasSubModules.framework/PrivateHeaders/HasSubModulesPriv.h Thu Feb  7 18:10:48 2013
@@ -0,0 +1,2 @@
+#import <Sub/SubPriv.h>
+

Modified: cfe/trunk/test/Modules/subframeworks.m
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/subframeworks.m?rev=174683&r1=174682&r2=174683&view=diff
==============================================================================
--- cfe/trunk/test/Modules/subframeworks.m (original)
+++ cfe/trunk/test/Modules/subframeworks.m Thu Feb  7 18:10:48 2013
@@ -20,3 +20,10 @@ void testSubFrameworkAgain() {
 
 CXXOnly cxxonly;
 #endif
+
+ at import HasSubModules;
+
+// expected-warning at 1{{treating #include as an import of module 'HasSubModules.Sub.Types'}}
+#import <HasSubModules/HasSubModulesPriv.h>
+
+struct FrameworkSubStruct ss;





More information about the cfe-commits mailing list