[PATCH] cpp11-migrate: Adding -yaml-only option

Edwin Vane edwin.vane at intel.com
Tue Aug 13 12:29:54 PDT 2013


Hi tareqsiraj, arielbernal, Sarcasm,

For use with -headers, -yaml-only will cause cpp11-migrate to not write
header changes to disk and instead write them as header change
description files. This option facilitiates upcoming functionality to
properly support changing headers as part of migration.

http://llvm-reviews.chandlerc.com/D1385

Files:
  cpp11-migrate/tool/Cpp11Migrate.cpp
  test/cpp11-migrate/HeaderReplacements/main.cpp

Index: cpp11-migrate/tool/Cpp11Migrate.cpp
===================================================================
--- cpp11-migrate/tool/Cpp11Migrate.cpp
+++ cpp11-migrate/tool/Cpp11Migrate.cpp
@@ -118,6 +118,13 @@
     cl::location(GlobalOptions.EnableHeaderModifications),
     cl::init(false));
 
+static cl::opt<bool> YAMLOnly("yaml-only",
+                              cl::Hidden, // Associated with -headers
+                              cl::desc("Don't change headers on disk. Write "
+                                       "changes to change description files "
+                                       "only."),
+                              cl::init(false));
+
 cl::opt<std::string> SupportedCompilers(
     "for-compilers", cl::value_desc("string"),
     cl::desc("Select transforms targeting the intersection of\n"
@@ -257,6 +264,13 @@
     return 1;
   }
 
+  if (std::distance(TransformManager.begin(), TransformManager.end()) > 1) {
+    llvm::errs() << "Header change description files requested for multiple "
+                    "transforms.\nChanges from only one transform can be "
+                    "recorded in a change description file.\n";
+    return 1;
+  }
+
   // if reformatting is enabled we wants to track file changes so that it's
   // possible to reformat them.
   bool TrackReplacements = static_cast<bool>(ChangesReformatter);
@@ -317,48 +331,48 @@
       FileStream << Overrides.getMainFileContent();
     }
 
-    // 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 = Overrides.headers_begin(),
                                          HeaderE = Overrides.headers_end();
          HeaderI != HeaderE; ++HeaderI) {
-      assert(!HeaderI->second.getContentOverride().empty() &&
-             "A header override should not be empty");
       std::string ErrorInfo;
-      std::string HeaderFileName = HeaderI->getKey();
-      llvm::raw_fd_ostream HeaderStream(HeaderFileName.c_str(), ErrorInfo,
-                                        llvm::sys::fs::F_Binary);
-      if (!ErrorInfo.empty()) {
-        llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
-        continue;
-      }
-      HeaderStream << HeaderI->second.getContentOverride();
-
-      // Replacements for header files need to be written in a YAML file for
-      // every transform and will be merged together with an external tool.
-      llvm::SmallString<128> ReplacementsHeaderName;
-      llvm::SmallString<64> Error;
-      bool Result = generateReplacementsFileName(I->getKey(), HeaderFileName,
-                                                 ReplacementsHeaderName, Error);
-      if (!Result) {
-        llvm::errs() << "Failed to generate replacements filename:" << Error
-                     << "\n";
-        continue;
-      }
-
-      llvm::raw_fd_ostream ReplacementsFile(ReplacementsHeaderName.c_str(),
-                                            ErrorInfo,
-                                            llvm::sys::fs::F_Binary);
-      if (!ErrorInfo.empty()) {
-        llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
-        continue;
+      if (YAMLOnly) {
+        // Replacements for header files need to be written in a YAML file for
+        // every transform and will be merged together with an external tool.
+        llvm::SmallString<128> ReplacementsHeaderName;
+        llvm::SmallString<64> Error;
+        bool Result =
+            generateReplacementsFileName(I->getKey(), HeaderI->getKey().data(),
+                                         ReplacementsHeaderName, Error);
+        if (!Result) {
+          llvm::errs() << "Failed to generate replacements filename:" << Error
+                       << "\n";
+          continue;
+        }
+
+        llvm::raw_fd_ostream ReplacementsFile(
+            ReplacementsHeaderName.c_str(), ErrorInfo, llvm::sys::fs::F_Binary);
+        if (!ErrorInfo.empty()) {
+          llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
+          continue;
+        }
+        llvm::yaml::Output YAML(ReplacementsFile);
+        YAML << const_cast<HeaderChangeDocument &>(
+                    HeaderI->getValue().getHeaderChangeDoc());
+      } else {
+        // If -yaml-only was not specified, then change headers on disk.
+        // FIXME: This is transitional behaviour. Remove this functionality
+        // when header change description tool is ready.
+        assert(!HeaderI->second.getContentOverride().empty() &&
+               "A header override should not be empty");
+        std::string HeaderFileName = HeaderI->getKey();
+        llvm::raw_fd_ostream HeaderStream(HeaderFileName.c_str(), ErrorInfo,
+                                          llvm::sys::fs::F_Binary);
+        if (!ErrorInfo.empty()) {
+          llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
+          continue;
+        }
+        HeaderStream << HeaderI->second.getContentOverride();
       }
-      llvm::yaml::Output YAML(ReplacementsFile);
-      YAML << const_cast<HeaderChangeDocument &>(
-                  HeaderI->getValue().getHeaderChangeDoc());
     }
   }
 
Index: test/cpp11-migrate/HeaderReplacements/main.cpp
===================================================================
--- test/cpp11-migrate/HeaderReplacements/main.cpp
+++ test/cpp11-migrate/HeaderReplacements/main.cpp
@@ -4,7 +4,7 @@
 // RUN: rm -rf %t/Test
 // RUN: mkdir -p %t/Test
 // RUN: cp %S/main.cpp %S/common.cpp %S/common.h %t/Test
-// RUN: cpp11-migrate -loop-convert -headers -include=%t/Test %t/Test/main.cpp %t/Test/common.cpp --
+// RUN: cpp11-migrate -loop-convert -headers -yaml-only -include=%t/Test %t/Test/main.cpp %t/Test/common.cpp --
 // Check that only 1 file is generated per translation unit and header file.
 // RUN: ls -1 %t/Test | grep -c "main.cpp_common.h_.*.yaml" | grep "^1$"
 // RUN: ls -1 %t/Test | grep -c "common.cpp_common.h_.*.yaml" | grep "^1$"
@@ -22,7 +22,7 @@
 // RUN: rm -rf %t/Test
 // RUN: mkdir -p %t/Test
 // RUN: cp %S/main.cpp %S/common.cpp %S/common.h %t/Test
-// RUN: cpp11-migrate -loop-convert -headers -include=%t/Test %t/Test/main.cpp --
+// RUN: cpp11-migrate -loop-convert -headers -yaml-only -include=%t/Test %t/Test/main.cpp --
 // RUN: cpp11-migrate -loop-convert %t/Test/common.cpp --
 // Check that only one YAML file is generated from main.cpp and common.h and not from common.cpp and common.h since -header is not specified
 // RUN: ls -1 %t/Test | grep -c "main.cpp_common.h_.*.yaml" | grep "^1$"
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1385.1.patch
Type: text/x-patch
Size: 6821 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130813/e9c0ec7a/attachment.bin>


More information about the cfe-commits mailing list