cpp11-migrate: Add headers to file override information
authorEdwin Vane <edwin.vane@intel.com>
Thu, 13 Jun 2013 17:17:32 +0000 (17:17 +0000)
committerEdwin Vane <edwin.vane@intel.com>
Thu, 13 Jun 2013 17:17:32 +0000 (17:17 +0000)
File override structures now contain per-source overrides for headers.

For now, modified headers are written to disk when the Migrator is done.
This is only temporary behaviour since we can expect headers to be
changed by migrating multiple source files. The changes need to be
merged after all migrations are complete.

llvm-svn: 183917

clang-tools-extra/cpp11-migrate/Core/FileOverrides.cpp
clang-tools-extra/cpp11-migrate/Core/FileOverrides.h
clang-tools-extra/cpp11-migrate/tool/Cpp11Migrate.cpp

index 0f7e5214ff1dc97b51fa1f076df1800a67ab60cb..1c3320780bbac119d61b4f88cb5c7096bf9b9440 100644 (file)
@@ -7,4 +7,10 @@ void SourceOverrides::applyOverrides(clang::SourceManager &SM,
          "Main source file override should exist!");
   SM.overrideFileContents(FM.getFile(MainFileName),
                           llvm::MemoryBuffer::getMemBuffer(MainFileOverride));
+
+  for (HeaderOverrides::const_iterator I = Headers.begin(),
+       E = Headers.end(); I != E; ++I)
+    SM.overrideFileContents(
+        FM.getFile(I->second.FileName),
+        llvm::MemoryBuffer::getMemBuffer(I->second.FileOverride));
 }
index d33cddf4c50e5065c79e34319219c0a3b4a73f73..03d70ebb13a67ab8cc294b96dfadf8d2b1e51a84 100644 (file)
@@ -24,6 +24,14 @@ class SourceManager;
 class FileManager;
 } // namespace clang
 
+/// \brief Container for storing override information for a single headers.
+struct HeaderOverride {
+  std::string FileName;
+  std::string FileOverride;
+};
+
+/// \brief Container mapping header file names to override information.
+typedef std::map<std::string, HeaderOverride> HeaderOverrides;
 
 /// \brief Container storing the file content overrides for a source file.
 struct SourceOverrides {
@@ -36,6 +44,7 @@ struct SourceOverrides {
 
   std::string MainFileName;
   std::string MainFileOverride;
+  HeaderOverrides Headers;
 };
 
 /// \brief Maps source file names to content override information.
index 26c2ac4bfa2183f08994dac72487c8e3fd47060a..15f5aa12f5c8cdbe9c7f0ac7a45d4bc107b4b6d7 100644 (file)
@@ -179,6 +179,19 @@ int main(int argc, const char **argv) {
     llvm::raw_fd_ostream FileStream(I->first.c_str(), ErrorInfo,
                                     llvm::raw_fd_ostream::F_Binary);
     FileStream << I->second.MainFileOverride;
+
+    // FIXME: The Migrator shouldn't be responsible for writing headers
+    // to disk. Instead, it should write replacement info and another tool
+    // should take all replacement info for a header from possibly many other
+    // migration processes and merge it into a final form. For now, the 
+    // updated header is written to disk for testing purposes.
+    for (HeaderOverrides::const_iterator HeaderI = I->second.Headers.begin(),
+                                         HeaderE = I->second.Headers.end();
+         HeaderI != HeaderE; ++HeaderI) {
+      llvm::raw_fd_ostream HeaderStream(I->first.c_str(), ErrorInfo,
+                                        llvm::raw_fd_ostream::F_Binary);
+      HeaderStream << HeaderI->second.FileOverride;
+    }
   }
 
   // Report execution times.