[PATCH] clang-replace: Afford applying replacements in memory
Edwin Vane
edwin.vane at intel.com
Tue Aug 27 06:17:35 PDT 2013
- comment fix
- Using Rewriter to transfer data between applyReplacements and writeFiles
Hi klimek,
http://llvm-reviews.chandlerc.com/D1519
CHANGE SINCE LAST DIFF
http://llvm-reviews.chandlerc.com/D1519?vs=3765&id=3808#toc
Files:
clang-replace/ApplyReplacements.cpp
clang-replace/ApplyReplacements.h
clang-replace/tool/ClangReplaceMain.cpp
Index: clang-replace/ApplyReplacements.cpp
===================================================================
--- clang-replace/ApplyReplacements.cpp
+++ clang-replace/ApplyReplacements.cpp
@@ -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"
@@ -189,28 +190,38 @@
}
bool applyReplacements(const FileToReplacementsMap &GroupedReplacements,
- clang::SourceManager &SM) {
- Rewriter Rewrites(SM, LangOptions());
+ clang::Rewriter &DestRewriter) {
// 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) {
- if (!tooling::applyAllReplacements(I->getValue(), Rewrites))
+ if (!tooling::applyAllReplacements(I->getValue(), DestRewriter))
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);
}
Index: clang-replace/ApplyReplacements.h
===================================================================
--- clang-replace/ApplyReplacements.h
+++ clang-replace/ApplyReplacements.h
@@ -16,15 +16,16 @@
#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"
#include <vector>
namespace clang {
class DiagnosticsEngine;
+class Rewriter;
namespace replace {
@@ -75,12 +76,19 @@
///
/// \param[in] GroupedReplacements Deduplicated and conflict free Replacements
/// to apply.
-/// \param[in] SM SourceManager required to construct clang::Rewriter.
+/// \param[out] DestRewriter 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 &DestRewriter);
+
+/// \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);
} // end namespace replace
} // end namespace clang
Index: clang-replace/tool/ClangReplaceMain.cpp
===================================================================
--- clang-replace/tool/ClangReplaceMain.cpp
+++ clang-replace/tool/ClangReplaceMain.cpp
@@ -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;
@@ -51,6 +52,14 @@
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;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D1519.3.patch
Type: text/x-patch
Size: 4871 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130827/97456237/attachment.bin>
More information about the cfe-commits
mailing list