diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-09-29 01:06:10 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-09-29 01:06:10 +0000 |
commit | f8afcffe6a0213760b64c211812b1750e1e1e967 (patch) | |
tree | 99f6628e78560ada79e11bbe7af546b3e5cac8b3 /lib | |
parent | e2ac16b09ea66ad955752381b82fb8719d003e5e (diff) |
For PPCallbacks::InclusionDirective() add a parameter for the module, whenever
an inclusion directive was automatically turned into a module import, and
PPCallbacks::moduleImport() for an explicit module import.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@164874 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Frontend/DependencyFile.cpp | 6 | ||||
-rw-r--r-- | lib/Frontend/DependencyGraph.cpp | 6 | ||||
-rw-r--r-- | lib/Lex/PPDirectives.cpp | 31 | ||||
-rw-r--r-- | lib/Lex/PreprocessingRecord.cpp | 3 | ||||
-rw-r--r-- | lib/Lex/Preprocessor.cpp | 12 | ||||
-rw-r--r-- | lib/Rewrite/Frontend/InclusionRewriter.cpp | 6 |
6 files changed, 48 insertions, 16 deletions
diff --git a/lib/Frontend/DependencyFile.cpp b/lib/Frontend/DependencyFile.cpp index adc96604e7..53ea8befbc 100644 --- a/lib/Frontend/DependencyFile.cpp +++ b/lib/Frontend/DependencyFile.cpp @@ -62,7 +62,8 @@ public: CharSourceRange FilenameRange, const FileEntry *File, StringRef SearchPath, - StringRef RelativePath); + StringRef RelativePath, + const Module *Imported); virtual void EndOfMainFile() { OutputDependencyFile(); @@ -135,7 +136,8 @@ void DependencyFileCallback::InclusionDirective(SourceLocation HashLoc, CharSourceRange FilenameRange, const FileEntry *File, StringRef SearchPath, - StringRef RelativePath) { + StringRef RelativePath, + const Module *Imported) { if (!File) { if (AddMissingHeaderDeps) AddFilename(FileName); diff --git a/lib/Frontend/DependencyGraph.cpp b/lib/Frontend/DependencyGraph.cpp index 7fb4ad7250..28d9c5d320 100644 --- a/lib/Frontend/DependencyGraph.cpp +++ b/lib/Frontend/DependencyGraph.cpp @@ -54,7 +54,8 @@ public: CharSourceRange FilenameRange, const FileEntry *File, StringRef SearchPath, - StringRef RelativePath); + StringRef RelativePath, + const Module *Imported); virtual void EndOfMainFile() { OutputGraphFile(); @@ -75,7 +76,8 @@ void DependencyGraphCallback::InclusionDirective(SourceLocation HashLoc, CharSourceRange FilenameRange, const FileEntry *File, StringRef SearchPath, - StringRef RelativePath) { + StringRef RelativePath, + const Module *Imported) { if (!File) return; diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp index 5cff2fc48f..23cbef63ed 100644 --- a/lib/Lex/PPDirectives.cpp +++ b/lib/Lex/PPDirectives.cpp @@ -1314,6 +1314,8 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, return; } + CharSourceRange FilenameRange + = CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd); StringRef OriginalFilename = Filename; bool isAngled = GetIncludeFilenameSpelling(FilenameTok.getLocation(), Filename); @@ -1384,10 +1386,13 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, } } - // Notify the callback object that we've seen an inclusion directive. - Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, - CharSourceRange::getCharRange(FilenameTok.getLocation(), CharEnd), - File, SearchPath, RelativePath); + if (!SuggestedModule) { + // Notify the callback object that we've seen an inclusion directive. + Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, + FilenameRange, File, + SearchPath, RelativePath, + /*ImportedModule=*/0); + } } if (File == 0) { @@ -1485,8 +1490,24 @@ void Preprocessor::HandleIncludeDirective(SourceLocation HashLoc, "the imported module is different than the suggested one"); // If this header isn't part of the module we're building, we're done. - if (!BuildingImportedModule && Imported) + if (!BuildingImportedModule && Imported) { + if (Callbacks) { + Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, + FilenameRange, File, + SearchPath, RelativePath, Imported); + } return; + } + } + + if (Callbacks && SuggestedModule) { + // We didn't notify the callback object that we've seen an inclusion + // directive before. Now that we are parsing the include normally and not + // turning it to a module import, notify the callback object. + Callbacks->InclusionDirective(HashLoc, IncludeTok, Filename, isAngled, + FilenameRange, File, + SearchPath, RelativePath, + /*ImportedModule=*/0); } // The #included file will be considered to be a system header if either it is diff --git a/lib/Lex/PreprocessingRecord.cpp b/lib/Lex/PreprocessingRecord.cpp index 40250f6786..4f4ff4b51e 100644 --- a/lib/Lex/PreprocessingRecord.cpp +++ b/lib/Lex/PreprocessingRecord.cpp @@ -392,7 +392,8 @@ void PreprocessingRecord::InclusionDirective( CharSourceRange FilenameRange, const FileEntry *File, StringRef SearchPath, - StringRef RelativePath) { + StringRef RelativePath, + const Module *Imported) { InclusionDirective::InclusionKind Kind = InclusionDirective::Include; switch (IncludeTok.getIdentifierInfo()->getPPKeywordID()) { diff --git a/lib/Lex/Preprocessor.cpp b/lib/Lex/Preprocessor.cpp index 9fa3aabe4c..872cda390a 100644 --- a/lib/Lex/Preprocessor.cpp +++ b/lib/Lex/Preprocessor.cpp @@ -641,10 +641,14 @@ void Preprocessor::LexAfterModuleImport(Token &Result) { } // If we have a non-empty module path, load the named module. - if (!ModuleImportPath.empty()) - (void)TheModuleLoader.loadModule(ModuleImportLoc, ModuleImportPath, - Module::MacrosVisible, - /*IsIncludeDirective=*/false); + if (!ModuleImportPath.empty()) { + Module *Imported = TheModuleLoader.loadModule(ModuleImportLoc, + ModuleImportPath, + Module::MacrosVisible, + /*IsIncludeDirective=*/false); + if (Callbacks) + Callbacks->moduleImport(ModuleImportLoc, ModuleImportPath, Imported); + } } void Preprocessor::addCommentHandler(CommentHandler *Handler) { diff --git a/lib/Rewrite/Frontend/InclusionRewriter.cpp b/lib/Rewrite/Frontend/InclusionRewriter.cpp index 9c3c43bb51..cecc8672c5 100644 --- a/lib/Rewrite/Frontend/InclusionRewriter.cpp +++ b/lib/Rewrite/Frontend/InclusionRewriter.cpp @@ -60,7 +60,8 @@ private: CharSourceRange FilenameRange, const FileEntry *File, StringRef SearchPath, - StringRef RelativePath); + StringRef RelativePath, + const Module *Imported); void WriteLineInfo(const char *Filename, int Line, SrcMgr::CharacteristicKind FileType, StringRef EOL, StringRef Extra = StringRef()); @@ -155,7 +156,8 @@ void InclusionRewriter::InclusionDirective(SourceLocation HashLoc, CharSourceRange /*FilenameRange*/, const FileEntry * /*File*/, StringRef /*SearchPath*/, - StringRef /*RelativePath*/) { + StringRef /*RelativePath*/, + const Module */*Imported*/) { assert(LastInsertedFileChange == FileChanges.end() && "Another inclusion " "directive was found before the previous one was processed"); std::pair<FileChangeMap::iterator, bool> p = FileChanges.insert( |