[clang-tools-extra] r192032 - clang-modernize: Apply replacements using clang-apply-replacements

Edwin Vane edwin.vane at intel.com
Sat Oct 5 05:15:59 PDT 2013


Author: revane
Date: Sat Oct  5 07:15:58 2013
New Revision: 192032

URL: http://llvm.org/viewvc/llvm-project?rev=192032&view=rev
Log:
clang-modernize: Apply replacements using clang-apply-replacements

Summary:
The clang-apply-replacements process is now invoked to apply
replacements between applying transforms. This resulted in a massive
simplification of the tool:
- FileOverrides class no longer needed.
- Change tracking and code formatting no longer needed.
- No more dependency on libclangApplyReplacements.
- Final syntax check is easier to do directly now than with a separate
  header/source pair.

Replacement handling stuff abstracted into a new header/source pair to
de-clutter ClangModernize.cpp somewhat.

Tests updated.

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

Added:
    clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.cpp
    clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.h
    clang-tools-extra/trunk/test/clang-modernize/Core/Inputs/
    clang-tools-extra/trunk/test/clang-modernize/Core/Inputs/.clang-format
Removed:
    clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.cpp
    clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.h
    clang-tools-extra/trunk/clang-modernize/Core/Reformatting.cpp
    clang-tools-extra/trunk/clang-modernize/Core/Reformatting.h
    clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.cpp
    clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.h
    clang-tools-extra/trunk/test/clang-modernize/Core/NoReformattingNeeded.cpp
    clang-tools-extra/trunk/unittests/clang-modernize/FileOverridesTest.cpp
    clang-tools-extra/trunk/unittests/clang-modernize/ReformattingTest.cpp
Modified:
    clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
    clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.cpp
    clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.h
    clang-tools-extra/trunk/clang-modernize/CMakeLists.txt
    clang-tools-extra/trunk/clang-modernize/Core/CMakeLists.txt
    clang-tools-extra/trunk/clang-modernize/Core/Transform.cpp
    clang-tools-extra/trunk/clang-modernize/Core/Transform.h
    clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.cpp
    clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.h
    clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.cpp
    clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.h
    clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.cpp
    clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.h
    clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.cpp
    clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.h
    clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.cpp
    clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.h
    clang-tools-extra/trunk/clang-modernize/tool/CMakeLists.txt
    clang-tools-extra/trunk/clang-modernize/tool/ClangModernize.cpp
    clang-tools-extra/trunk/clang-modernize/tool/Makefile
    clang-tools-extra/trunk/test/clang-modernize/Core/Reformatting.cpp
    clang-tools-extra/trunk/test/clang-modernize/HeaderReplacements/main.cpp
    clang-tools-extra/trunk/unittests/clang-modernize/CMakeLists.txt
    clang-tools-extra/trunk/unittests/clang-modernize/PerfSupportTest.cpp
    clang-tools-extra/trunk/unittests/clang-modernize/TransformTest.cpp
    clang-tools-extra/trunk/unittests/clang-modernize/UniqueHeaderNameTest.cpp

Modified: clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp (original)
+++ clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp Sat Oct  5 07:15:58 2013
@@ -228,7 +228,7 @@ int main(int argc, char **argv) {
   if (ErrorCode) {
     errs() << "Trouble iterating over directory '" << Directory
            << "': " << ErrorCode.message() << "\n";
-    return false;
+    return 1;
   }
 
   // Remove the TUReplacementFiles (triggered by "remove-change-desc-files"

Modified: clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.cpp Sat Oct  5 07:15:58 2013
@@ -29,8 +29,7 @@ static cl::opt<bool> DetectMacros(
     cl::desc("Detect and use macros that expand to the 'override' keyword."),
     cl::cat(TransformsOptionsCategory));
 
-int AddOverrideTransform::apply(const FileOverrides &InputStates,
-                                const CompilationDatabase &Database,
+int AddOverrideTransform::apply(const CompilationDatabase &Database,
                                 const std::vector<std::string> &SourcePaths) {
   ClangTool AddOverrideTool(Database, SourcePaths);
   unsigned AcceptedChanges = 0;
@@ -42,8 +41,6 @@ int AddOverrideTransform::apply(const Fi
   // Make Fixer available to handleBeginSource().
   this->Fixer = &Fixer;
 
-  setOverrides(InputStates);
-
   if (int result = AddOverrideTool.run(createActionFactory(Finder))) {
     llvm::errs() << "Error encountered during translation.\n";
     return result;

Modified: clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.h (original)
+++ clang-tools-extra/trunk/clang-modernize/AddOverride/AddOverride.h Sat Oct  5 07:15:58 2013
@@ -31,8 +31,7 @@ public:
       : Transform("AddOverride", Options) {}
 
   /// \see Transform::run().
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) LLVM_OVERRIDE;
 
   virtual bool handleBeginSource(clang::CompilerInstance &CI,

Modified: clang-tools-extra/trunk/clang-modernize/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/CMakeLists.txt?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-modernize/CMakeLists.txt Sat Oct  5 07:15:58 2013
@@ -1,6 +1,3 @@
-get_filename_component(ClangReplaceLocation
-  "${CMAKE_CURRENT_SOURCE_DIR}/../clang-apply-replacements/include" ABSOLUTE)
-
 include_directories(
   ${CMAKE_CURRENT_SOURCE_DIR}
   ${ClangReplaceLocation}

Modified: clang-tools-extra/trunk/clang-modernize/Core/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/CMakeLists.txt?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/CMakeLists.txt Sat Oct  5 07:15:58 2013
@@ -1,13 +1,11 @@
 set(LLVM_LINK_COMPONENTS support)
 
 add_clang_library(modernizeCore
-  FileOverrides.cpp
-  SyntaxCheck.cpp
+  ReplacementHandling.cpp
   Transforms.cpp
   Transform.cpp
   IncludeExcludeInfo.cpp
   PerfSupport.cpp
-  Reformatting.cpp
   IncludeDirectives.cpp
   )
 target_link_libraries(modernizeCore

Removed: clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.cpp?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.cpp (removed)
@@ -1,198 +0,0 @@
-//===-- Core/FileOverrides.cpp --------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file provides types and functionality for dealing with source
-/// and header file content overrides.
-///
-//===----------------------------------------------------------------------===//
-
-#include "Core/FileOverrides.h"
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/DiagnosticOptions.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Rewrite/Core/Rewriter.h"
-#include "clang/Tooling/Tooling.h"
-#include "clang/Tooling/ReplacementsYaml.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
-#include "llvm/Support/raw_ostream.h"
-#include "llvm/Support/system_error.h"
-#include <algorithm>
-
-using namespace clang;
-using namespace clang::tooling;
-
-bool generateReplacementsFileName(const llvm::StringRef MainSourceFile,
-                                  llvm::SmallVectorImpl<char> &Result,
-                                  llvm::SmallVectorImpl<char> &Error) {
-  using namespace llvm::sys;
-
-  Error.clear();
-  if (llvm::error_code EC = fs::createUniqueFile(
-          MainSourceFile + "_%%_%%_%%_%%_%%_%%.yaml", Result)) {
-    Error.append(EC.message().begin(), EC.message().end());
-    return false;
-  }
-
-  return true;
-}
-
-namespace {
-
-/// \brief Comparator to be able to order tooling::Range based on their offset.
-bool rangeLess(clang::tooling::Range A, clang::tooling::Range B) {
-  if (A.getOffset() == B.getOffset())
-    return A.getLength() < B.getLength();
-  return A.getOffset() < B.getOffset();
-}
-
-/// \brief Functor that returns the given range without its overlaps with the
-/// replacement given in the constructor.
-struct RangeReplacedAdjuster {
-  RangeReplacedAdjuster(const tooling::Replacement &Replace)
-      : Replace(Replace.getOffset(), Replace.getLength()),
-        ReplaceNewSize(Replace.getReplacementText().size()) {}
-
-  tooling::Range operator()(clang::tooling::Range Range) const {
-    if (!Range.overlapsWith(Replace))
-      return Range;
-    // range inside replacement -> make the range length null
-    if (Replace.contains(Range))
-      return tooling::Range(Range.getOffset(), 0);
-    // replacement inside range -> resize the range
-    if (Range.contains(Replace)) {
-      int Difference = ReplaceNewSize - Replace.getLength();
-      return tooling::Range(Range.getOffset(), Range.getLength() + Difference);
-    }
-    // beginning of the range replaced -> truncate range beginning
-    if (Range.getOffset() > Replace.getOffset()) {
-      unsigned ReplaceEnd = Replace.getOffset() + Replace.getLength();
-      unsigned RangeEnd = Range.getOffset() + Range.getLength();
-      return tooling::Range(ReplaceEnd, RangeEnd - ReplaceEnd);
-    }
-    // end of the range replaced -> truncate range end
-    if (Range.getOffset() < Replace.getOffset())
-      return tooling::Range(Range.getOffset(),
-                            Replace.getOffset() - Range.getOffset());
-    llvm_unreachable("conditions not handled properly");
-  }
-
-  const tooling::Range Replace;
-  const unsigned ReplaceNewSize;
-};
-
-} // end anonymous namespace
-
-void
-ChangedRanges::adjustChangedRanges(const tooling::ReplacementsVec &Replaces) {
-  // first adjust existing ranges in case they overlap with the replacements
-  for (ReplacementsVec::const_iterator I = Replaces.begin(), E = Replaces.end();
-       I != E; ++I) {
-    const tooling::Replacement &Replace = *I;
-
-    std::transform(Ranges.begin(), Ranges.end(), Ranges.begin(),
-                   RangeReplacedAdjuster(Replace));
-  }
-
-  // then shift existing ranges to reflect the new positions
-  for (RangeVec::iterator I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {
-    unsigned ShiftedOffset =
-        tooling::shiftedCodePosition(Replaces, I->getOffset());
-    *I = tooling::Range(ShiftedOffset, I->getLength());
-  }
-
-  // then generate the new ranges from the replacements
-  for (ReplacementsVec::const_iterator I = Replaces.begin(), E = Replaces.end();
-       I != E; ++I) {
-    const tooling::Replacement &R = *I;
-    unsigned Offset = tooling::shiftedCodePosition(Replaces, R.getOffset());
-    unsigned Length = R.getReplacementText().size();
-
-    Ranges.push_back(tooling::Range(Offset, Length));
-  }
-
-  // cleanups unecessary ranges to finish
-  coalesceRanges();
-}
-
-void ChangedRanges::coalesceRanges() {
-  // sort the ranges by offset and then for each group of adjacent/overlapping
-  // ranges the first one in the group is extended to cover the whole group.
-  std::sort(Ranges.begin(), Ranges.end(), &rangeLess);
-  RangeVec::iterator FirstInGroup = Ranges.begin();
-  assert(!Ranges.empty() && "unexpected empty vector");
-  for (RangeVec::iterator I = Ranges.begin() + 1, E = Ranges.end(); I != E;
-       ++I) {
-    unsigned GroupEnd = FirstInGroup->getOffset() + FirstInGroup->getLength();
-
-    // no contact
-    if (I->getOffset() > GroupEnd)
-      FirstInGroup = I;
-    else {
-      unsigned GrpBegin = FirstInGroup->getOffset();
-      unsigned GrpEnd = std::max(GroupEnd, I->getOffset() + I->getLength());
-      *FirstInGroup = tooling::Range(GrpBegin, GrpEnd - GrpBegin);
-    }
-  }
-
-  // remove the ranges that are covered by the first member of the group
-  Ranges.erase(std::unique(Ranges.begin(), Ranges.end(),
-                           std::mem_fun_ref(&Range::contains)),
-               Ranges.end());
-}
-
-void FileOverrides::applyOverrides(clang::SourceManager &SM) const {
-  FileManager &FM = SM.getFileManager();
-
-  for (FileStateMap::const_iterator I = FileStates.begin(),
-                                    E = FileStates.end();
-       I != E; ++I) {
-    SM.overrideFileContents(FM.getFile(I->getKey()),
-                            llvm::MemoryBuffer::getMemBuffer(I->getValue()));
-  }
-}
-
-void FileOverrides::adjustChangedRanges(
-    const clang::replace::FileToReplacementsMap &Replaces) {
-
-  for (replace::FileToReplacementsMap::const_iterator I = Replaces.begin(),
-       E = Replaces.end(); I != E; ++I) {
-    ChangeTracking[I->getKey()].adjustChangedRanges(I->getValue());
-  }
-}
-
-void FileOverrides::updateState(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();
-    const RewriteBuffer &RewriteBuf = BufferI->second;
-    FileStates[FileName].assign(RewriteBuf.begin(), RewriteBuf.end());
-  }
-}
-
-bool FileOverrides::writeToDisk(DiagnosticsEngine &Diagnostics) const {
-  bool Errors = false;
-  for (FileStateMap::const_iterator I = FileStates.begin(),
-                                    E = FileStates.end();
-       I != E; ++I) {
-    std::string ErrorInfo;
-    // The extra transform through std::string is to ensure null-termination
-    // of the filename stored as the key of the StringMap.
-    llvm::raw_fd_ostream FileStream(I->getKey().str().c_str(), ErrorInfo);
-    if (!ErrorInfo.empty()) {
-      llvm::errs() << "Failed to write new state for " << I->getKey() << ".\n";
-      Errors = true;
-    }
-    FileStream << I->getValue();
-  }
-  return !Errors;
-}

Removed: clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.h?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.h (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/FileOverrides.h (removed)
@@ -1,129 +0,0 @@
-//===-- Core/FileOverrides.h ------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file provides types and functionality for dealing with source
-/// and header file content overrides.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef CLANG_MODERNIZE_FILE_OVERRIDES_H
-#define CLANG_MODERNIZE_FILE_OVERRIDES_H
-
-#include "Core/Refactoring.h"
-#include "clang-apply-replacements/Tooling/ApplyReplacements.h"
-#include "clang/Tooling/ReplacementsYaml.h"
-#include "llvm/ADT/StringMap.h"
-
-// Forward Declarations
-namespace llvm {
-template <typename T>
-class SmallVectorImpl;
-} // namespace llvm
-namespace clang {
-class SourceManager;
-class Rewriter;
-} // namespace clang
-
-/// \brief Class encapsulating a list of \c tooling::Range with some
-/// convenience methods.
-///
-/// The ranges stored are used to keep track of the overriden parts of a file.
-class ChangedRanges {
-  typedef std::vector<clang::tooling::Range> RangeVec;
-
-public:
-  typedef RangeVec::const_iterator const_iterator;
-
-  /// \brief Create new ranges from the replacements and adjust existing one
-  /// to remove replaced parts.
-  ///
-  /// Note that all replacements should come from the same file.
-  void adjustChangedRanges(const clang::tooling::ReplacementsVec &Replaces);
-
-  /// \brief Iterators.
-  /// \{
-  const_iterator begin() const { return Ranges.begin(); }
-  const_iterator end() const { return Ranges.end(); }
-  /// \}
-
-private:
-  void coalesceRanges();
-
-  RangeVec Ranges;
-};
-
-/// \brief Maintains current state of transformed files and tracks source ranges
-/// where changes have been made.
-class FileOverrides {
-public:
-  /// \brief Maps file names to file contents.
-  typedef llvm::StringMap<std::string> FileStateMap;
-
-  /// \brief Maps file names to change tracking info for a file.
-  typedef llvm::StringMap<ChangedRanges> ChangeMap;
-
-
-  /// \brief Override file contents seen by \c SM for all files stored by this
-  /// object.
-  void applyOverrides(clang::SourceManager &SM) const;
-
-  /// \brief Update change tracking information based on replacements stored in
-  /// \c Replaces.
-  void
-  adjustChangedRanges(const clang::replace::FileToReplacementsMap &Replaces);
-
-  /// \brief Accessor for change tracking information.
-  const ChangeMap &getChangedRanges() const {
-    return ChangeTracking;
-  }
-
-  /// \brief Coalesce changes stored in \c Rewrites and replace file contents 
-  /// overrides stored in this object.
-  ///
-  /// \param Rewrites Rewriter containing changes to files.
-  void updateState(const clang::Rewriter &Rewrites);
-
-  /// \brief Accessor for current file state.
-  const FileStateMap &getState() const { return FileStates; }
-
-  /// \brief Write all file contents overrides to disk.
-  ///
-  /// \param Diagnostics DiagnosticsEngine for error output.
-  ///
-  /// \returns \li true if all files with overridden file contents were written
-  ///              to disk successfully.
-  ///          \li false if any failure occurred.
-  bool writeToDisk(clang::DiagnosticsEngine &Diagnostics) const;
-
-private:
-  FileStateMap FileStates;
-  ChangeMap ChangeTracking;
-};
-
-/// \brief Generate a unique filename to store the replacements.
-///
-/// Generates a unique filename in the same directory as \c MainSourceFile. The
-/// filename is generated following this pattern:
-///
-/// MainSourceFile_%%_%%_%%_%%_%%_%%.yaml
-///
-/// where all '%' will be replaced by a randomly chosen hex number.
-///
-/// \param[in] MainSourceFile Full path to the source file.
-/// \param[out] Result The resulting unique filename in the same directory as
-///             the \c MainSourceFile.
-/// \param[out] Error If an error occurs a description of that error is
-///             placed in this string.
-/// \returns true on success, false if a unique file name could not be created.
-bool generateReplacementsFileName(const llvm::StringRef MainSourceFile,
-                                  llvm::SmallVectorImpl<char> &Result,
-                                  llvm::SmallVectorImpl<char> &Error);
-
-#endif // CLANG_MODERNIZE_FILE_OVERRIDES_H

Removed: clang-tools-extra/trunk/clang-modernize/Core/Reformatting.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/Reformatting.cpp?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/Reformatting.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/Reformatting.cpp (removed)
@@ -1,62 +0,0 @@
-//===-- Core/Reformatting.cpp - LibFormat integration ---------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file provides the LibFormat integration used to reformat
-/// migrated code.
-///
-//===----------------------------------------------------------------------===//
-
-#include "Core/Reformatting.h"
-#include "Core/FileOverrides.h"
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/DiagnosticOptions.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Lex/Lexer.h"
-
-using namespace clang;
-
-void Reformatter::reformatChanges(const FileOverrides &FileStates,
-                                  clang::SourceManager &SM,
-                                  clang::tooling::ReplacementsVec &Replaces) {
-  FileStates.applyOverrides(SM);
-
-  for (FileOverrides::ChangeMap::const_iterator
-           I = FileStates.getChangedRanges().begin(),
-           E = FileStates.getChangedRanges().end();
-       I != E; ++I) {
-    reformatSingleFile(I->getKey(), I->getValue(), SM, Replaces);
-  }
-}
-
-void Reformatter::reformatSingleFile(
-    const llvm::StringRef FileName, const ChangedRanges &Changes,
-    SourceManager &SM, clang::tooling::ReplacementsVec &FormatReplacements) {
-
-  const clang::FileEntry *Entry = SM.getFileManager().getFile(FileName);
-  assert(Entry && "expected an existing file");
-
-  FileID ID = SM.translateFile(Entry);
-  if (ID.isInvalid())
-    ID = SM.createFileID(Entry, SourceLocation(), clang::SrcMgr::C_User);
-
-  std::vector<CharSourceRange> ReformatRanges;
-  SourceLocation StartOfFile = SM.getLocForStartOfFile(ID);
-  for (ChangedRanges::const_iterator I = Changes.begin(), E = Changes.end();
-       I != E; ++I) {
-    SourceLocation Start = StartOfFile.getLocWithOffset(I->getOffset());
-    SourceLocation End = Start.getLocWithOffset(I->getLength());
-    ReformatRanges.push_back(CharSourceRange::getCharRange(Start, End));
-  }
-
-  Lexer Lex(ID, SM.getBuffer(ID), SM, getFormattingLangOpts(Style.Standard));
-  const tooling::Replacements &R =
-      format::reformat(Style, Lex, SM, ReformatRanges);
-  std::copy(R.begin(), R.end(), std::back_inserter(FormatReplacements));
-}

Removed: clang-tools-extra/trunk/clang-modernize/Core/Reformatting.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/Reformatting.h?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/Reformatting.h (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/Reformatting.h (removed)
@@ -1,60 +0,0 @@
-//===-- Core/Reformatting.h - LibFormat integration -------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file provides the LibFormat integration used to reformat
-/// migrated code.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef CLANG_MODERNIZE_REFORMATTING_H
-#define CLANG_MODERNIZE_REFORMATTING_H
-
-#include "Core/Refactoring.h"
-#include "clang/Format/Format.h"
-
-class FileOverrides;
-class ChangedRanges;
-
-class Reformatter {
-public:
-  Reformatter(const clang::format::FormatStyle &Style) : Style(Style) {}
-
-  /// \brief Reformat the changes made to the file overrides.
-  ///
-  /// This function will apply the state of files stored in \c FileState to \c
-  /// SM.
-  ///
-  /// \param[in] FileState Files to reformat.
-  /// \param[in] SM SourceManager for access to source files.
-  /// \param[out] Replaces Container to store all reformatting replacements.
-  void reformatChanges(const FileOverrides &FileState, clang::SourceManager &SM,
-                       clang::tooling::ReplacementsVec &Replaces);
-
-  /// \brief Produce a list of replacements to apply on \p FileName, only the
-  /// ranges in \p Changes are replaced.
-  ///
-  /// Since this routine use \c clang::format::reformat() the rules that
-  /// function applies to ranges also apply here.
-  ///
-  /// \param[in] FileName Name of file to reformat.
-  /// \param[in] Changes Description of where changes were made to the file.
-  /// \param[in] SM SourceManager required to create replacements.
-  /// \param[out] FormatReplacements New reformatting replacements are appended
-  /// to this container.
-  void reformatSingleFile(const llvm::StringRef FileName,
-                          const ChangedRanges &Changes,
-                          clang::SourceManager &SM,
-                          clang::tooling::ReplacementsVec &FormatReplacements);
-
-private:
-  clang::format::FormatStyle Style;
-};
-
-#endif // CLANG_MODERNIZE_REFORMATTING_H

Added: clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.cpp?rev=192032&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.cpp (added)
+++ clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.cpp Sat Oct  5 07:15:58 2013
@@ -0,0 +1,155 @@
+//===-- Core/ReplacementHandling.cpp --------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file provides implementations for the ReplacementHandling class.
+///
+//===----------------------------------------------------------------------===//
+
+#include "Core/ReplacementHandling.h"
+#include "clang/Tooling/ReplacementsYaml.h"
+#include "llvm/ADT/SmallString.h"
+#include "llvm/Support/FileSystem.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/Program.h"
+#include "llvm/Support/system_error.h"
+
+using namespace llvm;
+using namespace llvm::sys;
+using namespace clang::tooling;
+
+bool ReplacementHandling::findClangApplyReplacements(const char *Argv0) {
+  CARPath = FindProgramByName("clang-apply-replacements");
+
+  if (!CARPath.empty())
+    return true;
+
+  static int StaticSymbol;
+  CARPath = fs::getMainExecutable(Argv0, &StaticSymbol);
+  SmallString<128> TestPath = path::parent_path(CARPath);
+  path::append(TestPath, "clang-apply-replacements");
+  if (fs::can_execute(Twine(TestPath)))
+    CARPath = TestPath.str();
+
+  return !CARPath.empty();
+}
+
+StringRef ReplacementHandling::useTempDestinationDir() {
+  DestinationDir = generateTempDir();
+  return DestinationDir;
+}
+
+void ReplacementHandling::enableFormatting(StringRef Style,
+                                           StringRef StyleConfigDir) {
+  DoFormat = true;
+  FormatStyle = Style;
+  this->StyleConfigDir = StyleConfigDir;
+}
+
+bool ReplacementHandling::serializeReplacements(
+    const TUReplacementsMap &Replacements) {
+  assert(!DestinationDir.empty() && "Destination directory not set");
+
+  bool Errors = false;
+
+  for (TUReplacementsMap::const_iterator I = Replacements.begin(),
+                                         E = Replacements.end();
+       I != E; ++I) {
+    SmallString<128> ReplacementsFileName;
+    SmallString<64> Error;
+    bool Result = generateReplacementsFileName(DestinationDir,
+                                               I->getValue().MainSourceFile,
+                                               ReplacementsFileName, Error);
+    if (!Result) {
+      errs() << "Failed to generate replacements filename:" << Error << "\n";
+      Errors = true;
+      continue;
+    }
+
+    std::string ErrorInfo;
+    raw_fd_ostream ReplacementsFile(ReplacementsFileName.c_str(), ErrorInfo,
+                                    fs::F_Binary);
+    if (!ErrorInfo.empty()) {
+      errs() << "Error opening file: " << ErrorInfo << "\n";
+      Errors = true;
+      continue;
+    }
+    yaml::Output YAML(ReplacementsFile);
+    YAML << const_cast<TranslationUnitReplacements &>(I->getValue());
+  }
+  return !Errors;
+}
+
+bool ReplacementHandling::applyReplacements() {
+  SmallVector<const char *, 8> Argv;
+  Argv.push_back(CARPath.c_str());
+  std::string Style = "--style=" + FormatStyle;
+  std::string StyleConfig = "--style-config=" + StyleConfigDir;
+  if (DoFormat) {
+    Argv.push_back("--format");
+    Argv.push_back(Style.c_str());
+    if (!StyleConfigDir.empty())
+      Argv.push_back(StyleConfig.c_str());
+  }
+  Argv.push_back("--remove-change-desc-files");
+  Argv.push_back(DestinationDir.c_str());
+
+  // Argv array needs to be null terminated.
+  Argv.push_back(0);
+
+  std::string ErrorMsg;
+  bool ExecutionFailed = false;
+  int ReturnCode = ExecuteAndWait(CARPath.c_str(), Argv.data(), /* env */ 0,
+                                  /* redirects */ 0,
+                                  /* secondsToWait */ 0, /* memoryLimit */ 0,
+                                  &ErrorMsg, &ExecutionFailed);
+  if (ExecutionFailed || !ErrorMsg.empty()) {
+    errs() << "Failed to launch clang-apply-replacements: " << ErrorMsg << "\n";
+    errs() << "Command Line:\n";
+    for (const char **I = Argv.begin(), **E = Argv.end(); I != E; ++I) {
+      if (*I)
+        errs() << *I << "\n";
+    }
+    return false;
+  }
+
+  if (ReturnCode != 0) {
+    errs() << "clang-apply-replacements failed with return code " << ReturnCode
+           << "\n";
+    return false;
+  }
+
+  return true;
+}
+
+std::string ReplacementHandling::generateTempDir() {
+  SmallString<128> Prefix;
+  path::system_temp_directory(true, Prefix);
+  path::append(Prefix, "clang-modernize");
+  SmallString<128> Result;
+  fs::createUniqueDirectory(Twine(Prefix), Result);
+  return Result.str();
+}
+
+bool ReplacementHandling::generateReplacementsFileName(
+    StringRef DestinationDir, StringRef MainSourceFile,
+    SmallVectorImpl<char> &Result, SmallVectorImpl<char> &Error) {
+
+  Error.clear();
+  SmallString<128> Prefix = DestinationDir;
+  path::append(Prefix, path::filename(MainSourceFile));
+  if (error_code EC =
+          fs::createUniqueFile(Prefix + "_%%_%%_%%_%%_%%_%%.yaml", Result)) {
+    const std::string &Msg = EC.message();
+    Error.append(Msg.begin(), Msg.end());
+    return false;
+  }
+
+  return true;
+}

Added: clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.h?rev=192032&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.h (added)
+++ clang-tools-extra/trunk/clang-modernize/Core/ReplacementHandling.h Sat Oct  5 07:15:58 2013
@@ -0,0 +1,119 @@
+//===-- Core/ReplacementHandling.h ------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file defines the ReplacementHandling class which abstracts
+/// serialization and application of serialized replacements.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_MODERNIZE_REPLACEMENTHANDLING_H
+#define CLANG_MODERNIZE_REPLACEMENTHANDLING_H
+
+#include "llvm/ADT/StringRef.h"
+#include "Core/Transform.h"
+
+class ReplacementHandling {
+public:
+
+  /// \brief Finds the path to the executable 'clang-apply-replacements'.
+  ///
+  /// The executable is searched for on the PATH. If not found, looks in the
+  /// same directory as the image used to start the current executable.
+  ///
+  /// \param[in] Argv0 argv[0] as passed to main().
+  ///
+  /// \returns \li true if clang-apply-replacements was found.
+  ///          \li false otherwise.
+  bool findClangApplyReplacements(const char *Argv0);
+
+  /// \brief Set the name of the directory in which replacements will be
+  /// serialized.
+  ///
+  /// \param[in] Dir Destination directory  name
+  void setDestinationDir(llvm::StringRef Dir) { DestinationDir = Dir; }
+
+  /// \brief Create a new temporary directory to serialize replacements into.
+  ///
+  /// \returns The name of the directory createdy.
+  llvm::StringRef useTempDestinationDir();
+
+  /// \brief Enable clang-apply-replacements do code reformatting when applying
+  /// serialized replacements.
+  ///
+  /// \param[in] Style Value to pass to clang-apply-replacement's --style
+  /// option.
+  /// \param[in] StyleConfigDir If non-empty, value to pass to
+  /// clang-apply-replacement's --style-config option.
+  void enableFormatting(llvm::StringRef Style,
+                        llvm::StringRef StyleConfigDir = "");
+
+  /// \brief Write all TranslationUnitReplacements stored in \c Replacements
+  /// to disk.
+  /// 
+  /// \pre Destination directory must have been previously set by calling
+  /// setDestiantionDir() or useTempDestinationDir().
+  /// \pre Destination dir must exist.
+  ///
+  /// \param[in] Replacements Container of replacements to serialize.
+  ///
+  /// \returns \li true if all replacements were serialized successfully to
+  ///          disk.
+  ///          \li false otherwise.
+  bool serializeReplacements(const TUReplacementsMap &Replacements);
+
+  /// \brief Invoke clang-apply-replacements to apply all serialized
+  /// replacements stored in the destination directory.
+  ///
+  /// \pre Destination directory must have been previously set by calling
+  /// setDestiantionDir() or useTempDestinationDir().
+  ///
+  /// \returns \li true if clang-apply-replacements was successfully launched
+  ///          and successfully completed.
+  ///          \li false otherwise.
+  bool applyReplacements();
+
+  /// \brief Generate a unique filename to store the replacements.
+  ///
+  /// Generates a unique filename in \c DestinationDir. The filename is generated
+  /// following this pattern:
+  ///
+  /// DestinationDir/Prefix_%%_%%_%%_%%_%%_%%.yaml
+  ///
+  /// where Prefix := llvm::sys::path::filename(MainSourceFile) and all '%' will
+  /// be replaced by a randomly chosen hex digit.
+  ///
+  /// \param[in] DestinationDir Directory the unique file should be placed in.
+  /// \param[in] MainSourceFile Full path to the source file.
+  /// \param[out] Result The resulting unique filename.
+  /// \param[out] Error If an error occurs a description of that error is
+  ///             placed in this string.
+  ///
+  /// \returns \li true on success
+  ///          \li false if a unique file name could not be created.
+  static bool generateReplacementsFileName(llvm::StringRef DestinationDir,
+                                           llvm::StringRef MainSourceFile,
+                                           llvm::SmallVectorImpl<char> &Result,
+                                           llvm::SmallVectorImpl<char> &Error);
+
+  /// \brief Helper to create a temporary directory name.
+  ///
+  /// \param[out] Resulting name is placed here.
+  static std::string generateTempDir();
+
+private:
+
+  std::string CARPath;
+  std::string DestinationDir;
+  bool DoFormat;
+  std::string FormatStyle;
+  std::string StyleConfigDir;
+};
+
+#endif // CLANG_MODERNIZE_REPLACEMENTHANDLING_H

Removed: clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.cpp?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.cpp (removed)
@@ -1,73 +0,0 @@
-//===-- Core/SyntaxCheck.cpp ----------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file exposes functionaliy for doing a syntax-only check on
-/// files with overridden contents.
-///
-//===----------------------------------------------------------------------===//
-
-#include "Core/SyntaxCheck.h"
-#include "Core/FileOverrides.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Frontend/FrontendActions.h"
-#include "clang/Tooling/Tooling.h"
-
-using namespace clang;
-using namespace tooling;
-
-class SyntaxCheck : public SyntaxOnlyAction {
-public:
-  SyntaxCheck(const FileOverrides &Overrides) : Overrides(Overrides) {}
-
-  virtual bool BeginSourceFileAction(CompilerInstance &CI, StringRef Filename) {
-    if (!SyntaxOnlyAction::BeginSourceFileAction(CI, Filename))
-      return false;
-
-    Overrides.applyOverrides(CI.getSourceManager());
-
-    return true;
-  }
-
-private:
-  const FileOverrides &Overrides;
-};
-
-class SyntaxCheckFactory : public FrontendActionFactory {
-public:
-  SyntaxCheckFactory(const FileOverrides &Overrides)
-      : Overrides(Overrides) {}
-
-  virtual FrontendAction *create() { return new SyntaxCheck(Overrides); }
-
-private:
-  const FileOverrides &Overrides;
-};
-
-class SyntaxArgumentsAdjuster : public ArgumentsAdjuster {
-  CommandLineArguments Adjust(const CommandLineArguments &Args) {
-    CommandLineArguments AdjustedArgs = Args;
-    AdjustedArgs.push_back("-fsyntax-only");
-    AdjustedArgs.push_back("-std=c++11");
-    return AdjustedArgs;
-  }
-};
-
-bool doSyntaxCheck(const CompilationDatabase &Database,
-                   const std::vector<std::string> &SourcePaths,
-                   const FileOverrides &Overrides) {
-  ClangTool SyntaxTool(Database, SourcePaths);
-
-  // Ensure C++11 support is enabled.
-  // FIXME: This isn't necessary anymore since the Modernizer requires C++11
-  // to be enabled in the CompilationDatabase. Remove later.
-  SyntaxTool.setArgumentsAdjuster(new SyntaxArgumentsAdjuster);
-
-  return SyntaxTool.run(new SyntaxCheckFactory(Overrides)) == 0;
-}

Removed: clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.h?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.h (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/SyntaxCheck.h (removed)
@@ -1,38 +0,0 @@
-//===-- Core/SyntaxCheck.h --------------------------------------*- C++ -*-===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file exposes functionaliy for doing a syntax-only check on
-/// files with overridden contents.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef CLANG_MODERNIZE_SYNTAX_CHECK_H
-#define CLANG_MODERNIZE_SYNTAX_CHECK_H
-
-#include <string>
-#include <vector>
-
-// Forward Declarations
-namespace clang {
-namespace tooling {
-class CompilationDatabase;
-} // namespace tooling
-} // namespace clang
-
-class FileOverrides;
-
-/// \brief Perform a syntax-only check over all files in \c SourcePaths using
-/// options provided by \c Database using file contents from \c Overrides if
-/// available.
-extern bool doSyntaxCheck(const clang::tooling::CompilationDatabase &Database,
-                          const std::vector<std::string> &SourcePaths,
-                          const FileOverrides &Overrides);
-
-#endif // CLANG_MODERNIZE_SYNTAX_CHECK_H

Modified: clang-tools-extra/trunk/clang-modernize/Core/Transform.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/Transform.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/Transform.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/Transform.cpp Sat Oct  5 07:15:58 2013
@@ -14,7 +14,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "Core/Transform.h"
-#include "Core/FileOverrides.h"
 #include "clang/ASTMatchers/ASTMatchFinder.h"
 #include "clang/Basic/LangOptions.h"
 #include "clang/Basic/SourceManager.h"
@@ -76,7 +75,7 @@ private:
 } // namespace
 
 Transform::Transform(llvm::StringRef Name, const TransformOptions &Options)
-    : Name(Name), GlobalOptions(Options), Overrides(0) {
+    : Name(Name), GlobalOptions(Options) {
   Reset();
 }
 
@@ -95,9 +94,6 @@ bool Transform::isFileModifiable(const S
 }
 
 bool Transform::handleBeginSource(CompilerInstance &CI, StringRef Filename) {
-  assert(Overrides != 0 && "Subclass transform didn't provide InputState");
-
-  Overrides->applyOverrides(CI.getSourceManager());
   CurrentSource = Filename;
 
   if (Options().EnableTiming) {

Modified: clang-tools-extra/trunk/clang-modernize/Core/Transform.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/Core/Transform.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/Core/Transform.h (original)
+++ clang-tools-extra/trunk/clang-modernize/Core/Transform.h Sat Oct  5 07:15:58 2013
@@ -50,9 +50,6 @@ class MatchFinder;
 } // namespace ast_matchers
 } // namespace clang
 
-class FileOverrides;
-
-
 // \brief Maps main source file names to a TranslationUnitReplacements
 // structure storing replacements for that translation unit.
 typedef llvm::StringMap<clang::tooling::TranslationUnitReplacements>
@@ -95,13 +92,13 @@ public:
 
   /// \brief Apply a transform to all files listed in \p SourcePaths.
   ///
-  /// \p Database must contain information for how to compile all files in \p
-  /// SourcePaths. \p InputStates contains the file contents of files in \p
-  /// SourcePaths and should take precedence over content of files on disk.
-  /// Upon return, \p ResultStates shall contain the result of performing this
-  /// transform on the files listed in \p SourcePaths.
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  /// \param[in] Database Contains information for how to compile all files in
+  /// \p SourcePaths.
+  /// \param[in] SourcePaths list of sources to transform.
+  ///
+  /// \returns \li 0 if successful
+  ///          \li 1 otherwise
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) = 0;
 
   /// \brief Query if changes were made during the last call to apply().
@@ -207,15 +204,6 @@ protected:
   /// created with.
   const TransformOptions &Options() { return GlobalOptions; }
 
-  /// \brief Affords a subclass to provide file contents overrides before
-  /// applying frontend actions.
-  ///
-  /// It is an error not to call this function before calling ClangTool::run()
-  /// with the factory provided by createActionFactory().
-  void setOverrides(const FileOverrides &Overrides) {
-    this->Overrides = &Overrides;
-  }
-
   /// \brief Subclasses must call this function to create a
   /// FrontendActionFactory to pass to ClangTool.
   ///
@@ -227,7 +215,6 @@ protected:
 private:
   const std::string Name;
   const TransformOptions &GlobalOptions;
-  const FileOverrides *Overrides;
   TUReplacementsMap Replacements;
   std::string CurrentSource;
   TimingVec Timings;

Modified: clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.cpp Sat Oct  5 07:15:58 2013
@@ -24,8 +24,7 @@ using clang::ast_matchers::MatchFinder;
 using namespace clang::tooling;
 using namespace clang;
 
-int LoopConvertTransform::apply(const FileOverrides &InputStates,
-                                const CompilationDatabase &Database,
+int LoopConvertTransform::apply(const CompilationDatabase &Database,
                                 const std::vector<std::string> &SourcePaths) {
   ClangTool LoopTool(Database, SourcePaths);
 
@@ -49,8 +48,6 @@ int LoopConvertTransform::apply(const Fi
                                   LFK_PseudoArray, /*Owner=*/ *this);
   Finder.addMatcher(makePseudoArrayLoopMatcher(), &PseudoarrrayLoopFixer);
 
-  setOverrides(InputStates);
-
   if (int result = LoopTool.run(createActionFactory(Finder))) {
     llvm::errs() << "Error encountered during translation.\n";
     return result;

Modified: clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.h (original)
+++ clang-tools-extra/trunk/clang-modernize/LoopConvert/LoopConvert.h Sat Oct  5 07:15:58 2013
@@ -31,8 +31,7 @@ public:
       : Transform("LoopConvert", Options) {}
 
   /// \see Transform::run().
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) LLVM_OVERRIDE;
 
   virtual bool handleBeginSource(clang::CompilerInstance &CI,

Modified: clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.cpp Sat Oct  5 07:15:58 2013
@@ -21,8 +21,7 @@ using namespace clang;
 using namespace clang::tooling;
 using namespace clang::ast_matchers;
 
-int PassByValueTransform::apply(const FileOverrides &InputStates,
-                                const tooling::CompilationDatabase &Database,
+int PassByValueTransform::apply(const tooling::CompilationDatabase &Database,
                                 const std::vector<std::string> &SourcePaths) {
   ClangTool Tool(Database, SourcePaths);
   unsigned AcceptedChanges = 0;
@@ -36,8 +35,6 @@ int PassByValueTransform::apply(const Fi
   // make the replacer available to handleBeginSource()
   this->Replacer = &Replacer;
 
-  setOverrides(InputStates);
-
   if (Tool.run(createActionFactory(Finder))) {
     llvm::errs() << "Error encountered during translation.\n";
     return 1;

Modified: clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.h (original)
+++ clang-tools-extra/trunk/clang-modernize/PassByValue/PassByValue.h Sat Oct  5 07:15:58 2013
@@ -58,8 +58,7 @@ public:
       : Transform("PassByValue", Options), Replacer(0) {}
 
   /// \see Transform::apply().
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) LLVM_OVERRIDE;
 
 private:

Modified: clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.cpp Sat Oct  5 07:15:58 2013
@@ -22,8 +22,7 @@ using namespace clang::tooling;
 using namespace clang::ast_matchers;
 
 int
-ReplaceAutoPtrTransform::apply(const FileOverrides &InputStates,
-                               const CompilationDatabase &Database,
+ReplaceAutoPtrTransform::apply(const CompilationDatabase &Database,
                                const std::vector<std::string> &SourcePaths) {
   ClangTool Tool(Database, SourcePaths);
   unsigned AcceptedChanges = 0;
@@ -35,8 +34,6 @@ ReplaceAutoPtrTransform::apply(const Fil
   Finder.addMatcher(makeAutoPtrUsingDeclMatcher(), &Replacer);
   Finder.addMatcher(makeTransferOwnershipExprMatcher(), &Fixer);
 
-  setOverrides(InputStates);
-
   if (Tool.run(createActionFactory(Finder))) {
     llvm::errs() << "Error encountered during translation.\n";
     return 1;

Modified: clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.h (original)
+++ clang-tools-extra/trunk/clang-modernize/ReplaceAutoPtr/ReplaceAutoPtr.h Sat Oct  5 07:15:58 2013
@@ -47,8 +47,7 @@ public:
       : Transform("ReplaceAutoPtr", Options) {}
 
   /// \see Transform::run().
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) LLVM_OVERRIDE;
 };
 

Modified: clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.cpp Sat Oct  5 07:15:58 2013
@@ -20,8 +20,7 @@ using clang::ast_matchers::MatchFinder;
 using namespace clang;
 using namespace clang::tooling;
 
-int UseAutoTransform::apply(const FileOverrides &InputStates,
-                            const clang::tooling::CompilationDatabase &Database,
+int UseAutoTransform::apply(const clang::tooling::CompilationDatabase &Database,
                             const std::vector<std::string> &SourcePaths) {
   ClangTool UseAutoTool(Database, SourcePaths);
 
@@ -37,8 +36,6 @@ int UseAutoTransform::apply(const FileOv
   Finder.addMatcher(makeIteratorDeclMatcher(), &ReplaceIterators);
   Finder.addMatcher(makeDeclWithNewMatcher(), &ReplaceNew);
 
-  setOverrides(InputStates);
-
   if (int Result = UseAutoTool.run(createActionFactory(Finder))) {
     llvm::errs() << "Error encountered during translation.\n";
     return Result;

Modified: clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.h (original)
+++ clang-tools-extra/trunk/clang-modernize/UseAuto/UseAuto.h Sat Oct  5 07:15:58 2013
@@ -34,8 +34,7 @@ public:
       : Transform("UseAuto", Options) {}
 
   /// \see Transform::run().
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) LLVM_OVERRIDE;
 };
 

Modified: clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.cpp Sat Oct  5 07:15:58 2013
@@ -24,8 +24,7 @@ using clang::ast_matchers::MatchFinder;
 using namespace clang::tooling;
 using namespace clang;
 
-int UseNullptrTransform::apply(const FileOverrides &InputStates,
-                               const CompilationDatabase &Database,
+int UseNullptrTransform::apply(const CompilationDatabase &Database,
                                const std::vector<std::string> &SourcePaths) {
   ClangTool UseNullptrTool(Database, SourcePaths);
 
@@ -36,8 +35,6 @@ int UseNullptrTransform::apply(const Fil
 
   Finder.addMatcher(makeCastSequenceMatcher(), &Fixer);
 
-  setOverrides(InputStates);
-
   if (int result = UseNullptrTool.run(createActionFactory(Finder))) {
     llvm::errs() << "Error encountered during translation.\n";
     return result;

Modified: clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.h?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.h (original)
+++ clang-tools-extra/trunk/clang-modernize/UseNullptr/UseNullptr.h Sat Oct  5 07:15:58 2013
@@ -28,8 +28,7 @@ public:
       : Transform("UseNullptr", Options) {}
 
   /// \see Transform::run().
-  virtual int apply(const FileOverrides &InputStates,
-                    const clang::tooling::CompilationDatabase &Database,
+  virtual int apply(const clang::tooling::CompilationDatabase &Database,
                     const std::vector<std::string> &SourcePaths) LLVM_OVERRIDE;
 };
 

Modified: clang-tools-extra/trunk/clang-modernize/tool/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/tool/CMakeLists.txt?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/tool/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/clang-modernize/tool/CMakeLists.txt Sat Oct  5 07:15:58 2013
@@ -34,7 +34,6 @@ add_dependencies(clang-modernize
   )
 
 target_link_libraries(clang-modernize
-  clangApplyReplacements
   modernizeCore
   )
 

Modified: clang-tools-extra/trunk/clang-modernize/tool/ClangModernize.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/tool/ClangModernize.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/tool/ClangModernize.cpp (original)
+++ clang-tools-extra/trunk/clang-modernize/tool/ClangModernize.cpp Sat Oct  5 07:15:58 2013
@@ -15,23 +15,20 @@
 ///
 //===----------------------------------------------------------------------===//
 
-#include "Core/FileOverrides.h"
 #include "Core/PerfSupport.h"
-#include "Core/SyntaxCheck.h"
+#include "Core/ReplacementHandling.h"
 #include "Core/Transform.h"
 #include "Core/Transforms.h"
-#include "Core/Reformatting.h"
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/DiagnosticOptions.h"
 #include "clang/Basic/SourceManager.h"
+#include "clang/Format/Format.h"
 #include "clang/Frontend/FrontendActions.h"
-#include "clang/Rewrite/Core/Rewriter.h"
 #include "clang/Tooling/CommonOptionsParser.h"
 #include "clang/Tooling/Tooling.h"
-#include "clang-apply-replacements/Tooling/ApplyReplacements.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/StringSwitch.h"
-#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
 #include "llvm/Support/Signals.h"
 
 namespace cl = llvm::cl;
@@ -81,13 +78,29 @@ static cl::opt<bool> FinalSyntaxCheck(
     cl::desc("Check for correct syntax after applying transformations"),
     cl::init(false));
 
-static cl::opt<std::string> FormatStyleOpt(
-    "format-style",
-    cl::desc("Coding style to use on the replacements, either a builtin style\n"
-             "or a YAML config file (see: clang-format -dump-config).\n"
-             "Currently supports 4 builtins style:\n"
-             "  LLVM, Google, Chromium, Mozilla.\n"),
-    cl::value_desc("string"));
+static cl::OptionCategory FormattingCategory("Formatting Options");
+
+static cl::opt<bool> DoFormat(
+    "format",
+    cl::desc("Enable formatting of code changed by applying replacements.\n"
+             "Use -style to choose formatting style.\n"),
+    cl::cat(FormattingCategory));
+
+static cl::opt<std::string>
+FormatStyleOpt("style", cl::desc(format::StyleOptionHelpDescription),
+               cl::init("LLVM"), cl::cat(FormattingCategory));
+
+// FIXME: Consider making the default behaviour for finding a style
+// configuration file to start the search anew for every file being changed to
+// handle situations where the style is different for different parts of a
+// project.
+
+static cl::opt<std::string> FormatStyleConfig(
+    "style-config",
+    cl::desc("Path to a directory containing a .clang-format file\n"
+             "describing a formatting style to use for formatting\n"
+             "code when -style=file.\n"),
+    cl::init(""), cl::cat(FormattingCategory));
 
 static cl::opt<bool>
 SummaryMode("summary", cl::desc("Print transform summary"),
@@ -98,29 +111,46 @@ static cl::opt<std::string> TimingDirect
                      "directory. Default: ./migrate_perf"),
     cl::ValueOptional, cl::value_desc("directory name"));
 
+static cl::OptionCategory IncludeExcludeCategory("Inclusion/Exclusion Options");
+
 static cl::opt<std::string>
 IncludePaths("include",
              cl::desc("Comma seperated list of paths to consider to be "
-                      "transformed"));
+                      "transformed"),
+             cl::cat(IncludeExcludeCategory));
+
 static cl::opt<std::string>
-ExcludePaths("exclude",
-             cl::desc("Comma seperated list of paths that can not "
-                      "be transformed"));
+ExcludePaths("exclude", cl::desc("Comma seperated list of paths that can not "
+                                 "be transformed"),
+             cl::cat(IncludeExcludeCategory));
+
 static cl::opt<std::string>
 IncludeFromFile("include-from", cl::value_desc("filename"),
                 cl::desc("File containing a list of paths to consider to "
-                         "be transformed"));
+                         "be transformed"),
+                cl::cat(IncludeExcludeCategory));
+
 static cl::opt<std::string>
 ExcludeFromFile("exclude-from", cl::value_desc("filename"),
                 cl::desc("File containing a list of paths that can not be "
-                         "transforms"));
+                         "transforms"),
+                cl::cat(IncludeExcludeCategory));
+
+static cl::OptionCategory SerializeCategory("Serialization Options");
 
 static cl::opt<bool>
-SerializeReplacements("serialize-replacements",
-                      cl::Hidden,
-                      cl::desc("Serialize translation unit replacements to "
-                               "disk instead of changing files."),
-                      cl::init(false));
+SerializeOnly("serialize-replacements",
+              cl::desc("Serialize translation unit replacements to "
+                       "disk instead of changing files."),
+              cl::init(false),
+              cl::cat(SerializeCategory));
+
+static cl::opt<std::string>
+SerializeLocation("serialize-dir",
+                  cl::desc("Path to an existing directory in which to write\n"
+                           "serialized replacements. Default behaviour is to\n"
+                           "write to a temporary directory.\n"),
+                  cl::cat(SerializeCategory));
 
 cl::opt<std::string> SupportedCompilers(
     "for-compilers", cl::value_desc("string"),
@@ -184,102 +214,6 @@ static CompilerVersions handleSupportedC
   return RequiredVersions;
 }
 
-/// \brief Creates the Reformatter if the format style option is provided,
-/// return a null pointer otherwise.
-///
-/// \param ProgName The name of the program, \c argv[0], used to print errors.
-/// \param Error If the \c -format-style is provided but with wrong parameters
-/// this is parameter is set to \c true, left untouched otherwise. An error
-/// message is printed with an explanation.
-static Reformatter *handleFormatStyle(const char *ProgName, bool &Error) {
-  if (FormatStyleOpt.getNumOccurrences() > 0) {
-    format::FormatStyle Style;
-    if (!format::getPredefinedStyle(FormatStyleOpt, &Style)) {
-      llvm::StringRef ConfigFilePath = FormatStyleOpt;
-      llvm::OwningPtr<llvm::MemoryBuffer> Text;
-      llvm::error_code ec;
-
-      ec = llvm::MemoryBuffer::getFile(ConfigFilePath, Text);
-      if (!ec)
-        ec = parseConfiguration(Text->getBuffer(), &Style);
-
-      if (ec) {
-        llvm::errs() << ProgName << ": invalid format style " << FormatStyleOpt
-                     << ": " << ec.message() << "\n";
-        Error = true;
-        return 0;
-      }
-    }
-
-    // force mode to C++11
-    Style.Standard = clang::format::FormatStyle::LS_Cpp11;
-    return new Reformatter(Style);
-  }
-  return 0;
-}
-
-/// \brief Use \c ChangesReformatter to reformat all changed regions of all
-/// files stored in \c Overrides and write the result to disk.
-///
-/// \returns \li true if reformatting replacements were successfully applied
-///              without conflicts and all files were successfully written to
-///              disk.
-///          \li false if reformatting could not be successfully applied or
-///              if at least one file failed to write to disk.
-void reformat(Reformatter &ChangesReformatter, FileOverrides &Overrides,
-              DiagnosticsEngine &Diagnostics) {
-  FileManager Files((FileSystemOptions()));
-  SourceManager SM(Diagnostics, Files);
-
-  replace::TUReplacements AllReplacements(1);
-  ChangesReformatter.reformatChanges(Overrides, SM,
-                                     AllReplacements.front().Replacements);
-
-  replace::FileToReplacementsMap GroupedReplacements;
-  if (!replace::mergeAndDeduplicate(AllReplacements, GroupedReplacements, SM)) {
-    llvm::errs() << "Warning: Reformatting produced conflicts.\n";
-    return;
-  }
-
-  Rewriter DestRewriter(SM, LangOptions());
-  if (!replace::applyReplacements(GroupedReplacements, DestRewriter)) {
-    llvm::errs() << "Warning: Failed to apply reformatting conflicts!\n";
-    return;
-  }
-
-  Overrides.updateState(DestRewriter);
-}
-
-bool serializeReplacements(const replace::TUReplacements &Replacements) {
-  bool Errors = false;
-  for (replace::TUReplacements::const_iterator I = Replacements.begin(),
-                                               E = Replacements.end();
-       I != E; ++I) {
-    llvm::SmallString<128> ReplacementsFileName;
-    llvm::SmallString<64> Error;
-    bool Result = generateReplacementsFileName(I->MainSourceFile,
-                                               ReplacementsFileName, Error);
-    if (!Result) {
-      llvm::errs() << "Failed to generate replacements filename:" << Error
-                   << "\n";
-      Errors = true;
-      continue;
-    }
-
-    std::string ErrorInfo;
-    llvm::raw_fd_ostream ReplacementsFile(ReplacementsFileName.c_str(),
-                                          ErrorInfo, llvm::sys::fs::F_Binary);
-    if (!ErrorInfo.empty()) {
-      llvm::errs() << "Error opening file: " << ErrorInfo << "\n";
-      Errors = true;
-      continue;
-    }
-    llvm::yaml::Output YAML(ReplacementsFile);
-    YAML << const_cast<TranslationUnitReplacements &>(*I);
-  }
-  return !Errors;
-}
-
 CompilationDatabase *autoDetectCompilations(std::string &ErrorMessage) {
   // Auto-detect a compilation database from BuildPath.
   if (BuildPath.getNumOccurrences() > 0)
@@ -332,6 +266,7 @@ static bool isFileExplicitlyExcludedPred
 int main(int argc, const char **argv) {
   llvm::sys::PrintStackTraceOnErrorSignal();
   Transforms TransformManager;
+  ReplacementHandling ReplacementHandler;
 
   TransformManager.registerTransforms();
 
@@ -386,11 +321,7 @@ int main(int argc, const char **argv) {
   // Enable timming.
   GlobalOptions.EnableTiming = TimingDirectoryName.getNumOccurrences() > 0;
 
-  // Check the reformatting style option
   bool CmdSwitchError = false;
-  llvm::OwningPtr<Reformatter> ChangesReformatter(
-      handleFormatStyle(argv[0], CmdSwitchError));
-
   CompilerVersions RequiredVersions =
       handleSupportedCompilers(argv[0], CmdSwitchError);
   if (CmdSwitchError)
@@ -398,15 +329,6 @@ int main(int argc, const char **argv) {
 
   TransformManager.createSelectedTransforms(GlobalOptions, RequiredVersions);
 
-  llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(
-      new DiagnosticOptions());
-  DiagnosticsEngine Diagnostics(
-      llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
-      DiagOpts.getPtr());
-
-  // FIXME: Make this DiagnosticsEngine available to all Transforms probably via
-  // GlobalOptions.
-
   if (TransformManager.begin() == TransformManager.end()) {
     if (SupportedCompilers.empty())
       llvm::errs() << llvm::sys::path::filename(argv[0])
@@ -417,28 +339,52 @@ int main(int argc, const char **argv) {
     return 1;
   }
 
-  // If SerializeReplacements is requested, then change reformatting must be
-  // turned off and only one transform should be requested. Reformatting is
-  // basically another transform so even if there's only one other transform,
-  // the reformatting pass would make two.
-  if (SerializeReplacements &&
+  llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(
+      new DiagnosticOptions());
+  DiagnosticsEngine Diagnostics(
+      llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
+      DiagOpts.getPtr());
+
+  // FIXME: Make this DiagnosticsEngine available to all Transforms probably via
+  // GlobalOptions.
+
+  // If SerializeReplacements is requested, then code reformatting must be
+  // turned off and only one transform should be requested.
+  if (SerializeOnly &&
       (std::distance(TransformManager.begin(), TransformManager.end()) > 1 ||
-       ChangesReformatter)) {
+       DoFormat)) {
     llvm::errs() << "Serialization of replacements requested for multiple "
                     "transforms.\nChanges from only one transform can be "
                     "serialized.\n";
     return 1;
   }
 
+  // If we're asked to apply changes to files on disk, need to locate
+  // clang-apply-replacements.
+  if (!SerializeOnly) {
+    if (!ReplacementHandler.findClangApplyReplacements(argv[0])) {
+      llvm::errs() << "Could not find clang-apply-replacements\n";
+      return 1;
+    }
+
+    if (DoFormat)
+      ReplacementHandler.enableFormatting(FormatStyleOpt, FormatStyleConfig);
+  }
+
+  StringRef TempDestinationDir;
+  if (SerializeLocation.getNumOccurrences() > 0)
+    ReplacementHandler.setDestinationDir(SerializeLocation);
+  else
+    TempDestinationDir = ReplacementHandler.useTempDestinationDir();
+
   SourcePerfData PerfData;
-  FileOverrides FileStates;
 
   for (Transforms::const_iterator I = TransformManager.begin(),
                                   E = TransformManager.end();
        I != E; ++I) {
     Transform *T = *I;
 
-    if (T->apply(FileStates, *Compilations, Sources) != 0) {
+    if (T->apply(*Compilations, Sources) != 0) {
       // FIXME: Improve ClangTool to not abort if just one file fails.
       return 1;
     }
@@ -456,64 +402,24 @@ int main(int argc, const char **argv) {
       llvm::outs() << "\n";
     }
 
-    // Collect all TranslationUnitReplacements generated from the translation
-    // units the transform worked on and store them in AllReplacements.
-    replace::TUReplacements AllReplacements;
-    const TUReplacementsMap &ReplacementsMap = T->getAllReplacements();
-    const TranslationUnitReplacements &(
-        TUReplacementsMap::value_type::*getValue)() const =
-        &TUReplacementsMap::value_type::getValue;
-    std::transform(ReplacementsMap.begin(), ReplacementsMap.end(),
-                   std::back_inserter(AllReplacements),
-                   std::mem_fun_ref(getValue));
-
-    if (SerializeReplacements)
-      serializeReplacements(AllReplacements);
-
-    FileManager Files((FileSystemOptions()));
-    SourceManager SM(Diagnostics, Files);
-
-    // Make sure SourceManager is updated to have the same initial state as the
-    // transforms.
-    FileStates.applyOverrides(SM);
-
-    replace::FileToReplacementsMap GroupedReplacements;
-    if (!replace::mergeAndDeduplicate(AllReplacements, GroupedReplacements,
-                                      SM)) {
-      llvm::outs() << "Transform " << T->getName()
-                   << " resulted in conflicts. Discarding all "
-                   << "replacements.\n";
-      continue;
-    }
-
-    // Apply replacements and update FileStates with new state.
-    Rewriter DestRewriter(SM, LangOptions());
-    if (!replace::applyReplacements(GroupedReplacements, DestRewriter)) {
-      llvm::outs() << "Some replacements failed to apply. Discarding "
-                      "all replacements.\n";
-      continue;
-    }
-
-    // Update contents of files in memory to serve as initial state for next
-    // transform.
-    FileStates.updateState(DestRewriter);
-
-    // Update changed ranges for reformatting
-    if (ChangesReformatter)
-      FileStates.adjustChangedRanges(GroupedReplacements);
-  }
+    if (!ReplacementHandler.serializeReplacements(T->getAllReplacements()))
+      return 1;
 
-  // Skip writing final file states to disk if we were asked to serialize
-  // replacements. Otherwise reformat changes if reformatting is enabled.
-  if (!SerializeReplacements) {
-    if (ChangesReformatter)
-      reformat(*ChangesReformatter, FileStates, Diagnostics);
-    FileStates.writeToDisk(Diagnostics);
+    if (!SerializeOnly)
+      if (!ReplacementHandler.applyReplacements())
+        return 1;
   }
 
-  if (FinalSyntaxCheck)
-    if (!doSyntaxCheck(*Compilations, Sources, FileStates))
+  // Let the user know which temporary directory the replacements got written
+  // to.
+  if (SerializeOnly && !TempDestinationDir.empty())
+    llvm::errs() << "Replacements serialized to: " << TempDestinationDir << "\n";
+
+  if (FinalSyntaxCheck) {
+    ClangTool SyntaxTool(*Compilations, SourcePaths);
+    if (SyntaxTool.run(newFrontendActionFactory<SyntaxOnlyAction>()) != 0)
       return 1;
+  }
 
   // Report execution times.
   if (GlobalOptions.EnableTiming && !PerfData.empty()) {

Modified: clang-tools-extra/trunk/clang-modernize/tool/Makefile
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-modernize/tool/Makefile?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-modernize/tool/Makefile (original)
+++ clang-tools-extra/trunk/clang-modernize/tool/Makefile Sat Oct  5 07:15:58 2013
@@ -36,14 +36,14 @@ SOURCES += $(addprefix ../ReplaceAutoPtr
 BUILT_SOURCES += $(ObjDir)/../ReplaceAutoPtr/.objdir
 
 LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc mcparser option
-USEDLIBS = modernizeCore.a clangFormat.a clangApplyReplacements.a clangTooling.a clangFrontend.a \
+USEDLIBS = modernizeCore.a clangFormat.a clangTooling.a clangFrontend.a \
 	   clangSerialization.a clangDriver.a clangRewriteFrontend.a \
 	   clangRewriteCore.a clangParse.a clangSema.a clangAnalysis.a \
 	   clangAST.a clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a
 
 include $(CLANG_LEVEL)/Makefile
 
-CPP.Flags += -I$(PROJ_SRC_DIR)/.. -I$(PROJ_SRC_DIR)/../../clang-apply-replacements/include
+CPP.Flags += -I$(PROJ_SRC_DIR)/..
 
 # BUILT_SOURCES gets used as a prereq for many top-level targets. However, at
 # the point those targets are defined, $(ObjDir) hasn't been defined and so the

Added: clang-tools-extra/trunk/test/clang-modernize/Core/Inputs/.clang-format
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-modernize/Core/Inputs/.clang-format?rev=192032&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-modernize/Core/Inputs/.clang-format (added)
+++ clang-tools-extra/trunk/test/clang-modernize/Core/Inputs/.clang-format Sat Oct  5 07:15:58 2013
@@ -0,0 +1,43 @@
+---
+# BasedOnStyle:  Google
+AccessModifierOffset: -1
+ConstructorInitializerIndentWidth: 4
+AlignEscapedNewlinesLeft: true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortIfStatementsOnASingleLine: true
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakTemplateDeclarations: true
+AlwaysBreakBeforeMultilineStrings: true
+BreakBeforeBinaryOperators: false
+BreakConstructorInitializersBeforeComma: false
+BinPackParameters: true
+ColumnLimit:     80
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+DerivePointerBinding: true
+ExperimentalAutoDetectBinPacking: false
+IndentCaseLabels: true
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCSpaceBeforeProtocolList: false
+PenaltyBreakComment: 60
+PenaltyBreakString: 1000
+PenaltyBreakFirstLessLess: 120
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 200
+PointerBindsToType: true
+SpacesBeforeTrailingComments: 2
+Cpp11BracedListStyle: true
+Standard:        Auto
+IndentWidth:     2
+TabWidth:        8
+UseTab:          Never
+BreakBeforeBraces: Attach
+IndentFunctionDeclarationAfterType: true
+SpacesInParentheses: false
+SpaceInEmptyParentheses: false
+SpacesInCStyleCastParentheses: false
+SpaceAfterControlStatementKeyword: true
+SpaceBeforeAssignmentOperators: true
+...
+

Removed: clang-tools-extra/trunk/test/clang-modernize/Core/NoReformattingNeeded.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-modernize/Core/NoReformattingNeeded.cpp?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-modernize/Core/NoReformattingNeeded.cpp (original)
+++ clang-tools-extra/trunk/test/clang-modernize/Core/NoReformattingNeeded.cpp (removed)
@@ -1,10 +0,0 @@
-// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
-// RUN: clang-modernize -format-style=LLVM -use-auto %t.cpp -- -std=c++11
-// RUN: FileCheck --strict-whitespace -input-file=%t.cpp %s
-
-class C {};
-
-void f() { //
-  C *a = new C();
-  // CHECK: {{^\ \ auto\ a\ \=\ new\ C\(\);}}
-}

Modified: clang-tools-extra/trunk/test/clang-modernize/Core/Reformatting.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-modernize/Core/Reformatting.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-modernize/Core/Reformatting.cpp (original)
+++ clang-tools-extra/trunk/test/clang-modernize/Core/Reformatting.cpp Sat Oct  5 07:15:58 2013
@@ -1,11 +1,37 @@
 // RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
-// RUN: not clang-modernize -format-style=non_existent_file.yaml -use-auto %t.cpp -- -std=c++11
-// RUN: touch %T/non_format_config.yaml
-// RUN: not clang-modernize -format-style=%T/non_format_config.yaml -use-auto %t.cpp -- -std=c++11
-// RUN: clang-modernize -format-style=LLVM -use-auto %t.cpp -- -std=c++11
+// RUN: clang-modernize -format -use-auto %t.cpp
 // RUN: FileCheck --strict-whitespace -input-file=%t.cpp %s
 
-class MyType012345678901234567890123456789 {};
+// Ensure that -style is forwarded to clang-apply-replacements by using a style
+// other than LLVM and ensuring the result is styled as requested.
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-modernize -format -style=Google -use-nullptr %t.cpp
+// RUN: FileCheck --check-prefix=Google --strict-whitespace -input-file=%t.cpp %s
+
+// Ensure -style-config is forwarded to clang-apply-replacements. The .clang-format
+// in %S/Inputs is a dump of the Google style so the same test can be used.
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp
+// RUN: clang-modernize -format -style=file -style-config=%S/Inputs -use-nullptr %t.cpp
+// RUN: FileCheck --check-prefix=Google --strict-whitespace -input-file=%t.cpp %s
+
+class MyType012345678901234567890123456789 {
+public:
+  MyType012345678901234567890123456789()
+      : iiiiiiiiiiii(0), jjjjjjjjjjjj(0), kkkkkkkkkkkk(0), mmmmmmmmmmmm(0),
+        nnnnnnnnnnnn(0) {}
+  // Google: iiiiiiiiiiii(nullptr),
+  // Google-NEXT: jjjjjjjjjjjj(nullptr),
+  // Google-NEXT: kkkkkkkkkkkk(nullptr),
+  // Google-NEXT: mmmmmmmmmmmm(nullptr),
+  // Google-NEXT: nnnnnnnnnnnn(nullptr) {}
+
+private:
+  int *iiiiiiiiiiii;
+  int *jjjjjjjjjjjj;
+  int *kkkkkkkkkkkk;
+  int *mmmmmmmmmmmm;
+  int *nnnnnnnnnnnn;
+};
 
 int f() {
   MyType012345678901234567890123456789 *a =
@@ -13,4 +39,6 @@ int f() {
   // CHECK: {{^\ \ auto\ a\ \=\ new\ MyType012345678901234567890123456789\(\);}}
 
   delete a;
+
+  return 0;
 }

Modified: clang-tools-extra/trunk/test/clang-modernize/HeaderReplacements/main.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-modernize/HeaderReplacements/main.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/test/clang-modernize/HeaderReplacements/main.cpp (original)
+++ clang-tools-extra/trunk/test/clang-modernize/HeaderReplacements/main.cpp Sat Oct  5 07:15:58 2013
@@ -7,7 +7,7 @@
 // RUN: rm -rf %T/SerializeTest
 // RUN: mkdir -p %T/SerializeTest
 // RUN: cp %S/main.cpp %S/common.cpp %S/common.h %T/SerializeTest
-// RUN: clang-modernize -loop-convert -serialize-replacements -include=%T/SerializeTest %T/SerializeTest/main.cpp %T/SerializeTest/common.cpp --
+// RUN: clang-modernize -loop-convert -serialize-replacements -serialize-dir=%T/SerializeTest -include=%T/SerializeTest %T/SerializeTest/main.cpp %T/SerializeTest/common.cpp --
 // Check that only 1 file is generated per translation unit
 // RUN: ls -1 %T/SerializeTest | FileCheck %s --check-prefix=MAIN_CPP
 // RUN: ls -1 %T/SerializeTest | FileCheck %s --check-prefix=COMMON_CPP

Modified: clang-tools-extra/trunk/unittests/clang-modernize/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-modernize/CMakeLists.txt?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-modernize/CMakeLists.txt (original)
+++ clang-tools-extra/trunk/unittests/clang-modernize/CMakeLists.txt Sat Oct  5 07:15:58 2013
@@ -15,8 +15,6 @@ include_directories(
   )
 
 add_extra_unittest(ClangModernizeTests
-  FileOverridesTest.cpp
-  ReformattingTest.cpp
   IncludeExcludeTest.cpp
   PerfSupportTest.cpp
   TransformTest.cpp

Removed: clang-tools-extra/trunk/unittests/clang-modernize/FileOverridesTest.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-modernize/FileOverridesTest.cpp?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-modernize/FileOverridesTest.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-modernize/FileOverridesTest.cpp (removed)
@@ -1,187 +0,0 @@
-//===- clang-modernize/FileOverridesTest.cpp - File overrides unit tests --===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Core/FileOverrides.h"
-#include "Core/Refactoring.h"
-#include "gtest/gtest.h"
-#include "common/VirtualFileHelper.h"
-#include "clang/Rewrite/Core/Rewriter.h"
-
-using namespace clang;
-using namespace clang::tooling;
-
-static Replacement makeReplacement(unsigned Offset, unsigned Length,
-                                   unsigned ReplacementLength,
-                                   llvm::StringRef FilePath) {
-  return Replacement(FilePath, Offset, Length,
-                     std::string(ReplacementLength, '~'));
-}
-
-// generate a set of replacements containing one element
-static ReplacementsVec makeReplacements(unsigned Offset, unsigned Length,
-                                        unsigned ReplacementLength,
-                                        llvm::StringRef FilePath = "~") {
-  ReplacementsVec Replaces;
-  Replaces.push_back(
-      makeReplacement(Offset, Length, ReplacementLength, FilePath));
-  return Replaces;
-}
-
-static bool equalRanges(Range A, Range B) {
-  return A.getOffset() == B.getOffset() && A.getLength() == B.getLength();
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesShrink) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(0, 0, 4));
-  EXPECT_NE(Changes.begin(), Changes.end());
-  EXPECT_TRUE(equalRanges(Range(0, 4), *Changes.begin()));
-  // create a replacement that cuts the end of the last insertion
-  Changes.adjustChangedRanges(makeReplacements(2, 4, 0));
-  Range ExpectedChanges[] = { Range(0, 2) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesExtend) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(1, 0, 4));
-  // cut the old one by a bigger one
-  Changes.adjustChangedRanges(makeReplacements(3, 4, 6));
-  Range ExpectedChanges[] = { Range(1, 8) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesNoOverlap) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(0, 0, 4));
-  Changes.adjustChangedRanges(makeReplacements(6, 0, 4));
-  Range ExpectedChanges[] = { Range(0, 4), Range(6, 4) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesNullRange) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(0, 4, 0));
-  Range ExpectedChanges[] = { Range(0, 0) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesExtendExisting) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(0, 0, 3));
-  Changes.adjustChangedRanges(makeReplacements(2, 5, 8));
-  Range ExpectedChanges[] = { Range(0, 10) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesSplit) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(0, 0, 3));
-  Changes.adjustChangedRanges(makeReplacements(1, 1, 0));
-  Range ExpectedChanges[] = { Range(0, 2) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesRangeContained) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(3, 0, 2));
-  Changes.adjustChangedRanges(makeReplacements(1, 4, 5));
-  Range ExpectedChanges[] = { Range(1, 5) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(ChangedRangesTest, adjustChangedRangesRangeResized) {
-  ChangedRanges Changes;
-  Changes.adjustChangedRanges(makeReplacements(2, 0, 5));
-  // first make the range bigger
-  Changes.adjustChangedRanges(makeReplacements(4, 1, 3));
-  Range ExpectedChanges[] = { Range(2, 7) };
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-  // then smaller
-  Changes.adjustChangedRanges(makeReplacements(3, 3, 1));
-  ExpectedChanges[0] = Range(2, 5);
-  EXPECT_TRUE(
-      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));
-}
-
-TEST(FileOverridesTest, applyOverrides) {
-
-  // Set up initial state
-  VirtualFileHelper VFHelper;
-
-  SmallString<128> fileAPath("fileA.cpp");
-  ASSERT_FALSE(llvm::sys::fs::make_absolute(fileAPath));
-  SmallString<128> fileBPath("fileB.cpp");
-  ASSERT_FALSE(llvm::sys::fs::make_absolute(fileBPath));
-  VFHelper.mapFile(fileAPath, "Content A");
-  VFHelper.mapFile(fileBPath, "Content B");
-  SourceManager &SM = VFHelper.getNewSourceManager();
-
-  // Fill a Rewriter with changes
-  Rewriter Rewrites(SM, LangOptions());
-  ReplacementsVec R(1, Replacement(fileAPath, 0, 7, "Stuff"));
-  ASSERT_TRUE(applyAllReplacements(R, Rewrites));
-
-  FileOverrides Overrides;
-  Overrides.updateState(Rewrites);
-  
-  const FileOverrides::FileStateMap &State = Overrides.getState();
-  
-  // Ensure state updated
-  ASSERT_TRUE(State.end() == State.find(fileBPath));
-  ASSERT_TRUE(State.begin() == State.find(fileAPath));
-  ASSERT_EQ("Stuff A", State.begin()->getValue());
-
-  Overrides.applyOverrides(SM);
-
-  const FileEntry *EntryA = SM.getFileManager().getFile(fileAPath);
-  FileID IdA = SM.translateFile(EntryA);
-  ASSERT_FALSE(IdA.isInvalid());
-
-  // Ensure the contents of the buffer matches what we'd expect.
-  const llvm::MemoryBuffer *BufferA = SM.getBuffer(IdA);
-  ASSERT_FALSE(0 == BufferA);
-  ASSERT_EQ("Stuff A", BufferA->getBuffer());
-}
-
-TEST(FileOverridesTest, adjustChangedRanges) {
-  SmallString<128> fileAPath("fileA.cpp");
-  ASSERT_FALSE(llvm::sys::fs::make_absolute(fileAPath));
-  SmallString<128> fileBPath("fileB.cpp");
-  ASSERT_FALSE(llvm::sys::fs::make_absolute(fileBPath));
-
-  replace::FileToReplacementsMap GroupedReplacements;
-  GroupedReplacements[fileAPath] = makeReplacements(0, 5, 4, fileAPath);
-  GroupedReplacements[fileBPath] = makeReplacements(10, 0, 6, fileBPath);
-
-  FileOverrides Overrides;
-
-  const FileOverrides::ChangeMap &Map = Overrides.getChangedRanges();
-
-  ASSERT_TRUE(Map.empty());
-
-  Overrides.adjustChangedRanges(GroupedReplacements);
-
-  ASSERT_TRUE(Map.end() != Map.find(fileAPath));
-  ASSERT_TRUE(Map.end() != Map.find(fileBPath));
-  const Range &RA = *Map.find(fileAPath)->second.begin();
-  EXPECT_EQ(0u, RA.getOffset());
-  EXPECT_EQ(4u, RA.getLength());
-  const Range &RB = *Map.find(fileBPath)->second.begin();
-  EXPECT_EQ(10u, RB.getOffset());
-  EXPECT_EQ(6u, RB.getLength());
-}

Modified: clang-tools-extra/trunk/unittests/clang-modernize/PerfSupportTest.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-modernize/PerfSupportTest.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-modernize/PerfSupportTest.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-modernize/PerfSupportTest.cpp Sat Oct  5 07:15:58 2013
@@ -18,8 +18,7 @@ public:
   TransformA(const TransformOptions &Options)
       : Transform("TransformA", Options) {}
 
-  virtual int apply(const FileOverrides &,
-                    const tooling::CompilationDatabase &,
+  virtual int apply(const tooling::CompilationDatabase &,
                     const std::vector<std::string> &) {
     return 0;
   }
@@ -34,8 +33,7 @@ public:
   TransformB(const TransformOptions &Options)
       : Transform("TransformB", Options) {}
 
-  virtual int apply(const FileOverrides &,
-                    const tooling::CompilationDatabase &,
+  virtual int apply(const tooling::CompilationDatabase &,
                     const std::vector<std::string> &) {
     return 0;
   }

Removed: clang-tools-extra/trunk/unittests/clang-modernize/ReformattingTest.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-modernize/ReformattingTest.cpp?rev=192031&view=auto
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-modernize/ReformattingTest.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-modernize/ReformattingTest.cpp (removed)
@@ -1,55 +0,0 @@
-//===- clang-modernize/ReformattingTest.cpp - Reformatting unit tests -----===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "Core/Reformatting.h"
-#include "Core/FileOverrides.h"
-#include "Core/Refactoring.h"
-#include "gtest/gtest.h"
-#include "common/VirtualFileHelper.h"
-
-using namespace clang;
-using namespace clang::tooling;
-
-namespace {
-// convenience function to create a ChangedRanges containing one Range
-ChangedRanges makeChangedRanges(unsigned Offset, unsigned Length) {
-  ChangedRanges Changes;
-  ReplacementsVec Replaces;
-
-  Replaces.push_back(Replacement("", Offset, 0, std::string(Length, '~')));
-  Changes.adjustChangedRanges(Replaces);
-  return Changes;
-}
-} // end anonymous namespace
-
-TEST(Reformatter, SingleReformat) {
-  VirtualFileHelper VFHelper;
-  llvm::StringRef FileName = "<test>";
-  VFHelper.mapFile(FileName, "int  a;\n"
-                             "int  b;\n");
-
-  Reformatter ChangesReformatter(format::getLLVMStyle());
-  ChangedRanges Changes = makeChangedRanges(0, 6);
-  tooling::ReplacementsVec Replaces;
-  ChangesReformatter.reformatSingleFile(
-      FileName, Changes, VFHelper.getNewSourceManager(), Replaces);
-
-  // We expect the code above to reformatted like so:
-  //
-  // int a;
-  // int  b;
-  //
-  // This test is slightly fragile since there's more than one Replacement that
-  // results in the above change. However, testing the result of applying the
-  // replacement is more trouble than it's worth in this context.
-  ASSERT_EQ(1u, Replaces.size());
-  EXPECT_EQ(3u, Replaces[0].getOffset());
-  EXPECT_EQ(2u, Replaces[0].getLength());
-  EXPECT_EQ(" ", Replaces[0].getReplacementText());
-}

Modified: clang-tools-extra/trunk/unittests/clang-modernize/TransformTest.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-modernize/TransformTest.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-modernize/TransformTest.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-modernize/TransformTest.cpp Sat Oct  5 07:15:58 2013
@@ -8,7 +8,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "gtest/gtest.h"
-#include "Core/FileOverrides.h"
 #include "Core/Transform.h"
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/DeclGroup.h"
@@ -26,8 +25,7 @@ public:
   DummyTransform(llvm::StringRef Name, const TransformOptions &Options)
       : Transform(Name, Options) {}
 
-  virtual int apply(const FileOverrides &,
-                    const tooling::CompilationDatabase &,
+  virtual int apply(const tooling::CompilationDatabase &,
                     const std::vector<std::string> &) { return 0; }
 
   void setAcceptedChanges(unsigned Changes) {
@@ -40,10 +38,6 @@ public:
     Transform::setDeferredChanges(Changes);
   }
 
-  void setOverrides(FileOverrides &Overrides) {
-    Transform::setOverrides(Overrides);
-  }
-
 };
 
 TEST(Transform, Interface) {
@@ -159,11 +153,6 @@ TEST(Transform, Timings) {
   // handleEndSource() calls to it.
   CallbackForwarder Callbacks(T);
 
-  // Transform's handle* functions require FileOverrides to be set, even if
-  // there aren't any.
-  FileOverrides Overrides;
-  T.setOverrides(Overrides);
-
   Tool.run(clang::tooling::newFrontendActionFactory(&Factory, &Callbacks));
 
   EXPECT_TRUE(Factory.Called);

Modified: clang-tools-extra/trunk/unittests/clang-modernize/UniqueHeaderNameTest.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clang-modernize/UniqueHeaderNameTest.cpp?rev=192032&r1=192031&r2=192032&view=diff
==============================================================================
--- clang-tools-extra/trunk/unittests/clang-modernize/UniqueHeaderNameTest.cpp (original)
+++ clang-tools-extra/trunk/unittests/clang-modernize/UniqueHeaderNameTest.cpp Sat Oct  5 07:15:58 2013
@@ -12,7 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "gtest/gtest.h"
-#include "Core/FileOverrides.h"
+#include "Core/ReplacementHandling.h"
 #include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Regex.h"
@@ -28,10 +28,13 @@ TEST(UniqueHeaderName, testUniqueHeaderN
   append(SourceFile, "project/lib/feature.cpp");
   native(SourceFile.str().str(), SourceFile);
 
+  llvm::SmallString<128> DestDir(TmpDir);
+  append(DestDir, "replacements");
+
   llvm::SmallString<128> FullActualPath;
   llvm::SmallString<128> Error;
-  bool Result =
-      generateReplacementsFileName(SourceFile, FullActualPath, Error);
+  bool Result = ReplacementHandling::generateReplacementsFileName(
+      DestDir, SourceFile, FullActualPath, Error);
 
   ASSERT_TRUE(Result);
   EXPECT_TRUE(Error.empty());
@@ -45,7 +48,7 @@ TEST(UniqueHeaderName, testUniqueHeaderN
   llvm::SmallString<128> ActualName =
       llvm::sys::path::filename(FullActualPath);
 
-  EXPECT_STREQ(ExpectedPath.c_str(), ActualPath.c_str());
+  EXPECT_STREQ(DestDir.c_str(), ActualPath.c_str());
 
   llvm::StringRef ExpectedName =
       "^feature.cpp_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_[0-9a-f]{2}_["





More information about the cfe-commits mailing list