]> granicus.if.org Git - clang/commitdiff
When making a suggestion regarding which module to load rather than
authorDouglas Gregor <dgregor@apple.com>
Thu, 17 Nov 2011 22:44:56 +0000 (22:44 +0000)
committerDouglas Gregor <dgregor@apple.com>
Thu, 17 Nov 2011 22:44:56 +0000 (22:44 +0000)
preprocess/parse a header, report back with an actual module (which
may be a submodule) rather than just the name of the module.

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

include/clang/Lex/DirectoryLookup.h
include/clang/Lex/HeaderSearch.h
include/clang/Lex/Preprocessor.h
lib/Lex/HeaderSearch.cpp
lib/Lex/PPDirectives.cpp

index f7da61b0ed71087da3e0f1459c83600c69d74ec6..d2764e7eddace1b03a05447721b7111a5ec5e314 100644 (file)
@@ -14,6 +14,7 @@
 #ifndef LLVM_CLANG_LEX_DIRECTORYLOOKUP_H
 #define LLVM_CLANG_LEX_DIRECTORYLOOKUP_H
 
+#include "clang/Lex/ModuleMap.h"
 #include "clang/Basic/LLVM.h"
 #include "clang/Basic/SourceManager.h"
 
@@ -144,13 +145,13 @@ public:
   /// \param BuildingModule The name of the module we're currently building.
   ///
   /// \param SuggestedModule If non-null, and the file found is semantically
-  /// part of a known module, this will be set to the name of the module that
-  /// could be imported instead of preprocessing/parsing the file found.
+  /// part of a known module, this will be set to the module that should
+  /// be imported instead of preprocessing/parsing the file found.
   const FileEntry *LookupFile(StringRef Filename, HeaderSearch &HS,
                               SmallVectorImpl<char> *SearchPath,
                               SmallVectorImpl<char> *RelativePath,
                               StringRef BuildingModule,
-                              StringRef *SuggestedModule) const;
+                              ModuleMap::Module **SuggestedModule) const;
 
 private:
   const FileEntry *DoFrameworkLookup(
@@ -158,7 +159,7 @@ private:
       SmallVectorImpl<char> *SearchPath,
       SmallVectorImpl<char> *RelativePath,
       StringRef BuildingModule,
-      StringRef *SuggestedModule) const;
+      ModuleMap::Module **SuggestedModule) const;
 
 };
 
index 21654c16cc2c968b0700325e7b9eccac4927a7ad..b56fba538a5e2e91d2eec8420220f30f10e655be 100644 (file)
@@ -258,15 +258,15 @@ public:
   /// Filename for framework includes.
   ///
   /// \param SuggestedModule If non-null, and the file found is semantically
-  /// part of a known module, this will be set to the name of the module that
-  /// could be imported instead of preprocessing/parsing the file found.
+  /// part of a known module, this will be set to the module that should
+  /// be imported instead of preprocessing/parsing the file found.
   const FileEntry *LookupFile(StringRef Filename, bool isAngled,
                               const DirectoryLookup *FromDir,
                               const DirectoryLookup *&CurDir,
                               const FileEntry *CurFileEnt,
                               SmallVectorImpl<char> *SearchPath,
                               SmallVectorImpl<char> *RelativePath,
-                              StringRef *SuggestedModule);
+                              ModuleMap::Module **SuggestedModule);
 
   /// LookupSubframeworkHeader - Look up a subframework for the specified
   /// #include file.  For example, if #include'ing <HIToolbox/HIToolbox.h> from
@@ -366,9 +366,7 @@ public:
   bool hasModuleMap(StringRef Filename, const DirectoryEntry *Root);
   
   /// \brief Retrieve the module that corresponds to the given file, if any.
-  ///
-  /// FIXME: This will need to be generalized for submodules.
-  StringRef findModuleForHeader(const FileEntry *File);
+  ModuleMap::Module *findModuleForHeader(const FileEntry *File);
   
   
   /// \brief Read the contents of the given module map file.
index bcd3c4b274be5aba3b218bffe1ed511cda77761e..90f64c45542836abe951335081a4638662d6c32c 100644 (file)
@@ -1008,7 +1008,7 @@ public:
                               const DirectoryLookup *&CurDir,
                               SmallVectorImpl<char> *SearchPath,
                               SmallVectorImpl<char> *RelativePath,
-                              StringRef *SuggestedModule);
+                              ModuleMap::Module **SuggestedModule);
 
   /// GetCurLookup - The DirectoryLookup structure used to find the current
   /// FileEntry, if CurLexer is non-null and if applicable.  This allows us to
index cc9c8c16f747dc58b7f196b801e036ce1209cde5..4deba60b9d34584cba601b646c4d975301cedeae 100644 (file)
@@ -219,7 +219,7 @@ const FileEntry *DirectoryLookup::LookupFile(
     SmallVectorImpl<char> *SearchPath,
     SmallVectorImpl<char> *RelativePath,
     StringRef BuildingModule,
-    StringRef *SuggestedModule) const {
+    ModuleMap::Module **SuggestedModule) const {
   llvm::SmallString<1024> TmpDir;
   if (isNormalDir()) {
     // Concatenate the requested file onto the directory.
@@ -245,8 +245,8 @@ const FileEntry *DirectoryLookup::LookupFile(
       
       // If there is a module that corresponds to this header, 
       // suggest it.
-      StringRef Module = HS.findModuleForHeader(File);
-      if (!Module.empty() && Module != BuildingModule)
+      ModuleMap::Module *Module = HS.findModuleForHeader(File);
+      if (Module && Module->getTopLevelModuleName() != BuildingModule)
         *SuggestedModule = Module;
       
       return File;
@@ -285,7 +285,7 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(
     SmallVectorImpl<char> *SearchPath,
     SmallVectorImpl<char> *RelativePath,
     StringRef BuildingModule,
-    StringRef *SuggestedModule) const 
+    ModuleMap::Module **SuggestedModule) const 
 {
   FileManager &FileMgr = HS.getFileMgr();
 
@@ -370,7 +370,7 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(
   if (const FileEntry *FE = FileMgr.getFile(FrameworkName.str(),
                                             /*openFile=*/!AutomaticImport)) {
     if (AutomaticImport)
-      *SuggestedModule = Module->Name;
+      *SuggestedModule = Module;
     return FE;
   }
 
@@ -385,7 +385,7 @@ const FileEntry *DirectoryLookup::DoFrameworkLookup(
   const FileEntry *FE = FileMgr.getFile(FrameworkName.str(), 
                                         /*openFile=*/!AutomaticImport);
   if (FE && AutomaticImport)
-    *SuggestedModule = Module->Name;
+    *SuggestedModule = Module;
   return FE;
 }
 
@@ -408,10 +408,10 @@ const FileEntry *HeaderSearch::LookupFile(
     const FileEntry *CurFileEnt,
     SmallVectorImpl<char> *SearchPath,
     SmallVectorImpl<char> *RelativePath,
-    StringRef *SuggestedModule) 
+    ModuleMap::Module **SuggestedModule) 
 {
   if (SuggestedModule)
-    *SuggestedModule = StringRef();
+    *SuggestedModule = 0;
     
   // If 'Filename' is absolute, check to see if it exists and no searching.
   if (llvm::sys::path::is_absolute(Filename)) {
@@ -806,11 +806,11 @@ bool HeaderSearch::hasModuleMap(StringRef FileName,
   return false;
 }
 
-StringRef HeaderSearch::findModuleForHeader(const FileEntry *File) {
+ModuleMap::Module *HeaderSearch::findModuleForHeader(const FileEntry *File) {
   if (ModuleMap::Module *Module = ModMap.findModuleForHeader(File))
-    return Module->getTopLevelModuleName();
+    return Module;
   
-  return StringRef();
+  return 0;
 }
 
 bool HeaderSearch::loadModuleMapFile(const FileEntry *File) {
index 9446d51f9d2b71e650a43439574c653faefd6704..2444364f358f0d787c6e2970eb3057e5b6128d39 100644 (file)
@@ -486,7 +486,7 @@ const FileEntry *Preprocessor::LookupFile(
     const DirectoryLookup *&CurDir,
     SmallVectorImpl<char> *SearchPath,
     SmallVectorImpl<char> *RelativePath,
-    StringRef *SuggestedModule) {
+    ModuleMap::Module **SuggestedModule) {
   // If the header lookup mechanism may be relative to the current file, pass in
   // info about where the current file is.
   const FileEntry *CurFileEnt = 0;
@@ -1269,7 +1269,7 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
   llvm::SmallString<1024> RelativePath;
   // We get the raw path only if we have 'Callbacks' to which we later pass
   // the path.
-  StringRef SuggestedModule;
+  ModuleMap::Module *SuggestedModule = 0;
   const FileEntry *File = LookupFile(
       Filename, isAngled, LookupFrom, CurDir,
       Callbacks ? &SearchPath : NULL, Callbacks ? &RelativePath : NULL,
@@ -1277,9 +1277,13 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc,
 
   // If we are supposed to import a module rather than including the header,
   // do so now.
-  if (!SuggestedModule.empty()) {
+  if (SuggestedModule) {
+    // FIXME: Actually load the submodule that we were given.
+    while (SuggestedModule->Parent)
+      SuggestedModule = SuggestedModule->Parent;
+    
     TheModuleLoader.loadModule(IncludeTok.getLocation(),
-                               Identifiers.get(SuggestedModule),
+                               Identifiers.get(SuggestedModule->Name),
                                FilenameTok.getLocation());
     return;
   }