[clang-tools-extra] r189493 - clang-replace: Afford applying replacements in memory

Edwin Vane edwin.vane at intel.com
Wed Aug 28 10:19:10 PDT 2013


Author: revane
Date: Wed Aug 28 12:19:10 2013
New Revision: 189493

URL: http://llvm.org/viewvc/llvm-project?rev=189493&view=rev
Log:
clang-replace: Afford applying replacements in memory

For users of libclangReplace, this patch affords the ability to apply
replacements in memory instead of writing to disk.

Differential Revision: http://llvm-reviews.chandlerc.com/D1519


Modified:
    clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp
    clang-tools-extra/trunk/clang-replace/ApplyReplacements.h
    clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp

Modified: clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp?rev=189493&r1=189492&r2=189493&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp (original)
+++ clang-tools-extra/trunk/clang-replace/ApplyReplacements.cpp Wed Aug 28 12:19:10 2013
@@ -16,6 +16,7 @@
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/Tooling/ReplacementsYaml.h"
 #include "llvm/ADT/ArrayRef.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/MemoryBuffer.h"
@@ -192,10 +193,14 @@ bool mergeAndDeduplicate(const TUReplace
 }
 
 bool applyReplacements(const FileToReplacementsMap &GroupedReplacements,
-                       clang::SourceManager &SM) {
-  Rewriter Rewrites(SM, LangOptions());
+                       clang::Rewriter &Rewrites) {
 
   // Apply all changes
+  //
+  // FIXME: No longer certain GroupedReplacements is really the best kind of
+  // data structure for applying replacements. Rewriter certainly doesn't care.
+  // However, until we nail down the design of ReplacementGroups, might as well
+  // leave this as is.
   for (FileToReplacementsMap::const_iterator I = GroupedReplacements.begin(),
                                              E = GroupedReplacements.end();
        I != E; ++I) {
@@ -203,17 +208,23 @@ bool applyReplacements(const FileToRepla
       return false;
   }
 
-  // Write all changes to disk
-  for (Rewriter::buffer_iterator BufferI = Rewrites.buffer_begin(),
-                                 BufferE = Rewrites.buffer_end();
+  return true;
+}
+
+bool writeFiles(const clang::Rewriter &Rewrites) {
+
+  for (Rewriter::const_buffer_iterator BufferI = Rewrites.buffer_begin(),
+                                       BufferE = Rewrites.buffer_end();
        BufferI != BufferE; ++BufferI) {
+    const char *FileName =
+        Rewrites.getSourceMgr().getFileEntryForID(BufferI->first)->getName();
+
     std::string ErrorInfo;
-    const char *FileName = SM.getFileEntryForID(BufferI->first)->getName();
-    llvm::raw_fd_ostream FileStream(FileName, ErrorInfo,
-                                    llvm::sys::fs::F_Binary);
+
+    llvm::raw_fd_ostream FileStream(FileName, ErrorInfo);
     if (!ErrorInfo.empty()) {
-      errs() << "Unable to open " << FileName << " for writing\n";
-      return false;
+      errs() << "Warning: Could not write to " << FileName << "\n";
+      continue;
     }
     BufferI->second.write(FileStream);
   }

Modified: clang-tools-extra/trunk/clang-replace/ApplyReplacements.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/ApplyReplacements.h?rev=189493&r1=189492&r2=189493&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-replace/ApplyReplacements.h (original)
+++ clang-tools-extra/trunk/clang-replace/ApplyReplacements.h Wed Aug 28 12:19:10 2013
@@ -16,7 +16,7 @@
 #ifndef CPP11_MIGRATE_APPLYCHANGEDESCRIPTIONS_H
 #define CPP11_MIGRATE_APPLYCHANGEDESCRIPTIONS_H
 
-#include "clang/Tooling/ReplacementsYaml.h"
+#include "clang/Tooling/Refactoring.h"
 #include "llvm/ADT/StringMap.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/Support/system_error.h"
@@ -26,6 +26,7 @@
 namespace clang {
 
 class DiagnosticsEngine;
+class Rewriter;
 
 namespace replace {
 
@@ -82,12 +83,19 @@ bool mergeAndDeduplicate(const TUReplace
 ///
 /// \param[in] GroupedReplacements Deduplicated and conflict free Replacements
 /// to apply.
-/// \param[in] SM SourceManager required to construct clang::Rewriter.
+/// \param[out] Rewrites The results of applying replacements will be applied
+/// to this Rewriter.
 ///
 /// \returns \li true If all changes were applied successfully.
 ///          \li false If a replacement failed to apply.
 bool applyReplacements(const FileToReplacementsMap &GroupedReplacements,
-                       clang::SourceManager &SM);
+                       clang::Rewriter &Rewrites);
+
+/// \brief Write the contents of \c FileContents to disk. Keys of the map are
+/// filenames and values are the new contents for those files.
+///
+/// \param[in] Rewrites Rewriter containing written files to write to disk.
+bool writeFiles(const clang::Rewriter &Rewrites);
 
 /// \brief Delete the replacement files.
 ///

Modified: clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp?rev=189493&r1=189492&r2=189493&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp (original)
+++ clang-tools-extra/trunk/clang-replace/tool/ClangReplaceMain.cpp Wed Aug 28 12:19:10 2013
@@ -16,6 +16,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticOptions.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Rewrite/Core/Rewriter.h"
 #include "llvm/Support/CommandLine.h"
 
 using namespace llvm;
@@ -81,6 +82,14 @@ int main(int argc, char **argv) {
   if (!mergeAndDeduplicate(TUs, GroupedReplacements, SM))
     return 1;
 
-  if (!applyReplacements(GroupedReplacements, SM))
+  Rewriter DestRewriter(SM, LangOptions());
+  if (!applyReplacements(GroupedReplacements, DestRewriter)) {
+    errs() << "Failed to apply all replacements. No changes made.\n";
     return 1;
+  }
+
+  if (!writeFiles(DestRewriter))
+    return 1;
+
+  return 0;
 }





More information about the cfe-commits mailing list