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; } _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
