<div dir="ltr">Hello <span name="Edwin Vane" class="">Edwin,<br><br>>Added:<br>>    clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp<br>>    clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h<br>
>    clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp<br>>    clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp<br><br>cpp11-migrate/Core/Reformatting.cpp fails on one of the builders:<br>
<a href="http://lab.llvm.org:8011/builders/clang-X86_64-freebsd">http://lab.llvm.org:8011/builders/clang-X86_64-freebsd</a><br>Please have a look at this?<br><br>Thanks<br><br>Galina<br><br></span></div><div class="gmail_extra">
<br><br><div class="gmail_quote">On Tue, Jul 23, 2013 at 5:50 AM, Edwin Vane <span dir="ltr"><<a href="mailto:edwin.vane@intel.com" target="_blank">edwin.vane@intel.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Author: revane<br>
Date: Tue Jul 23 07:50:03 2013<br>
New Revision: 186938<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=186938&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=186938&view=rev</a><br>
Log:<br>
cp11-migrate: Integration with LibFormat<br>
<br>
Adding a feature to optionally reformat code changed by the migrator. Like<br>
LibFormat, can choose between built-in styles (LLVM, Mozilla, Google, Chromium)<br>
or use a YAML-format config file.<br>
<br>
Now with no dependency on iostream by the Reformatting.cpp LIT test.<br>
<br>
Author: Guillaume Papin <<a href="mailto:guillaume.papin@epitech.eu">guillaume.papin@epitech.eu</a>><br>
<br>
<br>
Added:<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h<br>
    clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp<br>
Modified:<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/CMakeLists.txt<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h<br>
    clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp<br>
    clang-tools-extra/trunk/cpp11-migrate/tool/Makefile<br>
    clang-tools-extra/trunk/docs/MigratorUsage.rst<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/TransformTest.cpp<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/CMakeLists.txt?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/CMakeLists.txt?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/Core/CMakeLists.txt (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/Core/CMakeLists.txt Tue Jul 23 07:50:03 2013<br>
@@ -7,9 +7,12 @@ add_clang_library(migrateCore<br>
   Transform.cpp<br>
   IncludeExcludeInfo.cpp<br>
   PerfSupport.cpp<br>
+  Reformatting.cpp<br>
   )<br>
 target_link_libraries(migrateCore<br>
+  clangFormat<br>
   clangTooling<br>
   clangBasic<br>
   clangASTMatchers<br>
+  clangRewriteFrontend<br>
   )<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.cpp Tue Jul 23 07:50:03 2013<br>
@@ -17,8 +17,6 @@<br>
 #include "clang/Basic/Diagnostic.h"<br>
 #include "clang/Basic/DiagnosticOptions.h"<br>
 #include "clang/Basic/SourceManager.h"<br>
-#include "clang/Format/Format.h"<br>
-#include "clang/Lex/Lexer.h"<br>
 #include "clang/Rewrite/Core/Rewriter.h"<br>
 #include "clang/Tooling/Tooling.h"<br>
 #include "llvm/Support/FileSystem.h"<br>
@@ -29,10 +27,11 @@<br>
 using namespace clang;<br>
 using namespace clang::tooling;<br>
<br>
-SourceOverrides::SourceOverrides(llvm::StringRef MainFileName)<br>
-    : MainFileName(MainFileName) {}<br>
+SourceOverrides::SourceOverrides(llvm::StringRef MainFileName,<br>
+                                 bool TrackChanges)<br>
+    : MainFileName(MainFileName), TrackChanges(TrackChanges) {}<br>
<br>
-void SourceOverrides::applyReplacements(tooling::Replacements &Replaces) {<br>
+void SourceOverrides::applyReplacements(Replacements &Replaces) {<br>
   llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(<br>
       new DiagnosticOptions());<br>
   DiagnosticsEngine Diagnostics(<br>
@@ -57,6 +56,8 @@ void SourceOverrides::applyReplacements(<br>
     llvm::errs() << "error: failed to apply some replacements.";<br>
<br>
   applyRewrites(Rewrites);<br>
+  if (TrackChanges)<br>
+    adjustChangedRanges(Replaces);<br>
 }<br>
<br>
 void SourceOverrides::applyRewrites(Rewriter &Rewrites) {<br>
@@ -96,6 +97,30 @@ void SourceOverrides::applyRewrites(Rewr<br>
   }<br>
 }<br>
<br>
+void SourceOverrides::adjustChangedRanges(const Replacements &Replaces) {<br>
+  // Start by grouping replacements by file name<br>
+  Replacements MainFileReplaces;<br>
+  llvm::StringMap<Replacements> HeadersReplaces;<br>
+<br>
+  for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E;<br>
+       ++I) {<br>
+    llvm::StringRef ReplacementFileName = I->getFilePath();<br>
+<br>
+    if (ReplacementFileName == MainFileName)<br>
+      MainFileReplaces.insert(*I);<br>
+    else<br>
+      HeadersReplaces[ReplacementFileName].insert(*I);<br>
+  }<br>
+<br>
+  // Then adjust the changed ranges for each individual file<br>
+  MainFileChanges.adjustChangedRanges(Replaces);<br>
+  for (llvm::StringMap<Replacements>::iterator I = HeadersReplaces.begin(),<br>
+                                               E = HeadersReplaces.end();<br>
+       I != E; ++I) {<br>
+    Headers[I->getKey()].Changes.adjustChangedRanges(I->getValue());<br>
+  }<br>
+}<br>
+<br>
 void SourceOverrides::applyOverrides(SourceManager &SM) const {<br>
   FileManager &FM = SM.getFileManager();<br>
<br>
@@ -154,6 +179,109 @@ SourceOverrides &FileOverrides::getOrCre<br>
   SourceOverrides *&Override = Overrides[Filename];<br>
<br>
   if (Override == NULL)<br>
-    Override = new SourceOverrides(Filename);<br>
+    Override = new SourceOverrides(Filename, TrackChanges);<br>
   return *Override;<br>
 }<br>
+<br>
+namespace {<br>
+<br>
+/// \brief Comparator to be able to order tooling::Range based on their offset.<br>
+bool rangeLess(clang::tooling::Range A, clang::tooling::Range B) {<br>
+  if (A.getOffset() == B.getOffset())<br>
+    return A.getLength() < B.getLength();<br>
+  return A.getOffset() < B.getOffset();<br>
+}<br>
+<br>
+/// \brief Functor that returns the given range without its overlaps with the<br>
+/// replacement given in the constructor.<br>
+struct RangeReplacedAdjuster {<br>
+  RangeReplacedAdjuster(const tooling::Replacement &Replace)<br>
+      : Replace(Replace.getOffset(), Replace.getLength()),<br>
+        ReplaceNewSize(Replace.getReplacementText().size()) {}<br>
+<br>
+  tooling::Range operator()(clang::tooling::Range Range) const {<br>
+    if (!Range.overlapsWith(Replace))<br>
+      return Range;<br>
+    // range inside replacement -> make the range length null<br>
+    if (Replace.contains(Range))<br>
+      return tooling::Range(Range.getOffset(), 0);<br>
+    // replacement inside range -> resize the range<br>
+    if (Range.contains(Replace)) {<br>
+      int Difference = ReplaceNewSize - Replace.getLength();<br>
+      return tooling::Range(Range.getOffset(), Range.getLength() + Difference);<br>
+    }<br>
+    // beginning of the range replaced -> truncate range beginning<br>
+    if (Range.getOffset() > Replace.getOffset()) {<br>
+      unsigned ReplaceEnd = Replace.getOffset() + Replace.getLength();<br>
+      unsigned RangeEnd = Range.getOffset() + Range.getLength();<br>
+      return tooling::Range(ReplaceEnd, RangeEnd - ReplaceEnd);<br>
+    }<br>
+    // end of the range replaced -> truncate range end<br>
+    if (Range.getOffset() < Replace.getOffset())<br>
+      return tooling::Range(Range.getOffset(),<br>
+                            Replace.getOffset() - Range.getOffset());<br>
+    llvm_unreachable("conditions not handled properly");<br>
+  }<br>
+<br>
+  const tooling::Range Replace;<br>
+  const unsigned ReplaceNewSize;<br>
+};<br>
+<br>
+} // end anonymous namespace<br>
+<br>
+void ChangedRanges::adjustChangedRanges(const tooling::Replacements &Replaces) {<br>
+  // first adjust existing ranges in case they overlap with the replacements<br>
+  for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E;<br>
+       ++I) {<br>
+    const tooling::Replacement &Replace = *I;<br>
+<br>
+    std::transform(Ranges.begin(), Ranges.end(), Ranges.begin(),<br>
+                   RangeReplacedAdjuster(Replace));<br>
+  }<br>
+<br>
+  // then shift existing ranges to reflect the new positions<br>
+  for (RangeVec::iterator I = Ranges.begin(), E = Ranges.end(); I != E; ++I) {<br>
+    unsigned ShiftedOffset =<br>
+        tooling::shiftedCodePosition(Replaces, I->getOffset());<br>
+    *I = tooling::Range(ShiftedOffset, I->getLength());<br>
+  }<br>
+<br>
+  // then generate the new ranges from the replacements<br>
+  for (Replacements::iterator I = Replaces.begin(), E = Replaces.end(); I != E;<br>
+       ++I) {<br>
+    const tooling::Replacement &R = *I;<br>
+    unsigned Offset = tooling::shiftedCodePosition(Replaces, R.getOffset());<br>
+    unsigned Length = R.getReplacementText().size();<br>
+<br>
+    Ranges.push_back(tooling::Range(Offset, Length));<br>
+  }<br>
+<br>
+  // cleanups unecessary ranges to finish<br>
+  coalesceRanges();<br>
+}<br>
+<br>
+void ChangedRanges::coalesceRanges() {<br>
+  // sort the ranges by offset and then for each group of adjacent/overlapping<br>
+  // ranges the first one in the group is extended to cover the whole group.<br>
+  std::sort(Ranges.begin(), Ranges.end(), &rangeLess);<br>
+  RangeVec::iterator FirstInGroup = Ranges.begin();<br>
+  assert(!Ranges.empty() && "unexpected empty vector");<br>
+  for (RangeVec::iterator I = Ranges.begin() + 1, E = Ranges.end(); I != E;<br>
+       ++I) {<br>
+    unsigned GroupEnd = FirstInGroup->getOffset() + FirstInGroup->getLength();<br>
+<br>
+    // no contact<br>
+    if (I->getOffset() > GroupEnd)<br>
+      FirstInGroup = I;<br>
+    else {<br>
+      unsigned GrpBegin = FirstInGroup->getOffset();<br>
+      unsigned GrpEnd = std::max(GroupEnd, I->getOffset() + I->getLength());<br>
+      *FirstInGroup = tooling::Range(GrpBegin, GrpEnd - GrpBegin);<br>
+    }<br>
+  }<br>
+<br>
+  // remove the ranges that are covered by the first member of the group<br>
+  Ranges.erase(std::unique(Ranges.begin(), Ranges.end(),<br>
+                           std::mem_fun_ref(&Range::contains)),<br>
+               Ranges.end());<br>
+}<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h Tue Jul 23 07:50:03 2013<br>
@@ -29,6 +29,34 @@ class SourceManager;<br>
 class Rewriter;<br>
 } // namespace clang<br>
<br>
+/// \brief Class encapsulating a list of \c tooling::Range with some<br>
+/// convenience methods.<br>
+///<br>
+/// The ranges stored are used to keep track of the overriden parts of a file.<br>
+class ChangedRanges {<br>
+  typedef std::vector<clang::tooling::Range> RangeVec;<br>
+<br>
+public:<br>
+  typedef RangeVec::const_iterator const_iterator;<br>
+<br>
+  /// \brief Create new ranges from the replacements and adjust existing one<br>
+  /// to remove replaced parts.<br>
+  ///<br>
+  /// Note that all replacements should come from the same file.<br>
+  void adjustChangedRanges(const clang::tooling::Replacements &Replaces);<br>
+<br>
+  /// \brief Iterators.<br>
+  /// @{<br>
+  const_iterator begin() const { return Ranges.begin(); }<br>
+  const_iterator end() const { return Ranges.end(); }<br>
+  /// @}<br>
+<br>
+private:<br>
+  void coalesceRanges();<br>
+<br>
+  RangeVec Ranges;<br>
+};<br>
+<br>
 /// \brief Container for storing override information for a single headers.<br>
 struct HeaderOverride {<br>
   HeaderOverride() {}<br>
@@ -36,6 +64,7 @@ struct HeaderOverride {<br>
<br>
   std::string FileName;<br>
   std::string FileOverride;<br>
+  ChangedRanges Changes;<br>
 };<br>
<br>
 /// \brief Container mapping header file names to override information.<br>
@@ -46,12 +75,18 @@ typedef llvm::StringMap<HeaderOverride><br>
 /// which changes have been made.<br>
 class SourceOverrides {<br>
 public:<br>
-  SourceOverrides(llvm::StringRef MainFileName);<br>
+  SourceOverrides(llvm::StringRef MainFileName, bool TrackChanges);<br>
<br>
   /// \brief Accessors.<br>
   /// @{<br>
   llvm::StringRef getMainFileName() const { return MainFileName; }<br>
   llvm::StringRef getMainFileContent() const { return MainFileOverride; }<br>
+  const ChangedRanges &getChangedRanges() const { return MainFileChanges; }<br>
+<br>
+  /// \brief Is file change tracking enabled?<br>
+  ///<br>
+  /// Tracking file changes can be useful to reformat the code for example.<br>
+  bool isTrackingFileChanges() const { return TrackChanges; }<br>
   /// @}<br>
<br>
   /// \brief Indicates if the source file has been overridden.<br>
@@ -87,8 +122,14 @@ private:<br>
   /// file content overrides.<br>
   void applyRewrites(clang::Rewriter &Rewrite);<br>
<br>
+  /// \brief Adjust the changed ranges to reflect the parts of the files that<br>
+  /// have been replaced.<br>
+  void adjustChangedRanges(const clang::tooling::Replacements &Replaces);<br>
+<br>
   const std::string MainFileName;<br>
   std::string MainFileOverride;<br>
+  const bool TrackChanges;<br>
+  ChangedRanges MainFileChanges;<br>
   HeaderOverrides Headers;<br>
 };<br>
<br>
@@ -98,7 +139,11 @@ public:<br>
   typedef llvm::StringMap<SourceOverrides *> SourceOverridesMap;<br>
   typedef SourceOverridesMap::const_iterator const_iterator;<br>
<br>
-  FileOverrides() {}<br>
+  /// \brief Construct the SourceOverrides manager.<br>
+  ///<br>
+  /// \param TrackChanges Wether or not the \c SourceOverrides should keep track<br>
+  /// of changes. See \c SourceOverrides::isTrackingFileChanges().<br>
+  FileOverrides(bool TrackChanges) : TrackChanges(TrackChanges) {}<br>
   ~FileOverrides();<br>
<br>
   const_iterator find(llvm::StringRef Filename) const {<br>
@@ -120,6 +165,7 @@ private:<br>
   FileOverrides &operator=(const FileOverrides &) LLVM_DELETED_FUNCTION;<br>
<br>
   SourceOverridesMap Overrides;<br>
+  const bool TrackChanges;<br>
 };<br>
<br>
 /// \brief Generate a unique filename to store the replacements.<br>
<br>
Added: clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp?rev=186938&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp?rev=186938&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp (added)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.cpp Tue Jul 23 07:50:03 2013<br>
@@ -0,0 +1,76 @@<br>
+//===-- Core/Reformatting.cpp - LibFormat integration ---------------------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+///<br>
+/// \file<br>
+/// \brief This file provides the LibFormat integration used to reformat<br>
+/// migrated code.<br>
+///<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "Core/Reformatting.h"<br>
+#include "Core/FileOverrides.h"<br>
+#include "clang/Basic/Diagnostic.h"<br>
+#include "clang/Basic/DiagnosticOptions.h"<br>
+#include "clang/Basic/SourceManager.h"<br>
+#include "clang/Lex/Lexer.h"<br>
+<br>
+using namespace clang;<br>
+<br>
+void Reformatter::reformatChanges(SourceOverrides &Overrides) {<br>
+  llvm::IntrusiveRefCntPtr<clang::DiagnosticOptions> DiagOpts(<br>
+      new DiagnosticOptions());<br>
+  DiagnosticsEngine Diagnostics(<br>
+      llvm::IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),<br>
+      DiagOpts.getPtr());<br>
+  FileManager Files((FileSystemOptions()));<br>
+  SourceManager SM(Diagnostics, Files);<br>
+<br>
+  reformatChanges(Overrides, SM);<br>
+}<br>
+<br>
+void Reformatter::reformatChanges(SourceOverrides &Overrides,<br>
+                                  clang::SourceManager &SM) {<br>
+  tooling::Replacements Replaces;<br>
+  Overrides.applyOverrides(SM);<br>
+  if (Overrides.isSourceOverriden())<br>
+    Replaces = reformatSingleFile(Overrides.getMainFileName(),<br>
+                                  Overrides.getChangedRanges(), SM);<br>
+<br>
+  for (HeaderOverrides::const_iterator I = Overrides.headers_begin(),<br>
+                                       E = Overrides.headers_end();<br>
+       I != E; ++I) {<br>
+    const HeaderOverride &Header = I->getValue();<br>
+    const tooling::Replacements &HeaderReplaces =<br>
+        reformatSingleFile(Header.FileName, Header.Changes, SM);<br>
+    Replaces.insert(HeaderReplaces.begin(), HeaderReplaces.end());<br>
+  }<br>
+  Overrides.applyReplacements(Replaces, SM);<br>
+}<br>
+<br>
+tooling::Replacements Reformatter::reformatSingleFile(<br>
+    llvm::StringRef FileName, const ChangedRanges &Changes, SourceManager &SM) {<br>
+  const clang::FileEntry *Entry = SM.getFileManager().getFile(FileName);<br>
+  assert(Entry && "expected an existing file");<br>
+<br>
+  FileID ID = SM.translateFile(Entry);<br>
+  if (ID.isInvalid())<br>
+    ID = SM.createFileID(Entry, SourceLocation(), clang::SrcMgr::C_User);<br>
+<br>
+  std::vector<CharSourceRange> ReformatRanges;<br>
+  SourceLocation StartOfFile = SM.getLocForStartOfFile(ID);<br>
+  for (ChangedRanges::const_iterator I = Changes.begin(), E = Changes.end();<br>
+       I != E; ++I) {<br>
+    SourceLocation Start = StartOfFile.getLocWithOffset(I->getOffset());<br>
+    SourceLocation End = Start.getLocWithOffset(I->getLength());<br>
+    ReformatRanges.push_back(CharSourceRange::getCharRange(Start, End));<br>
+  }<br>
+<br>
+  Lexer Lex(ID, SM.getBuffer(ID), SM, getFormattingLangOpts(Style.Standard));<br>
+  return format::reformat(Style, Lex, SM, ReformatRanges);<br>
+}<br>
<br>
Added: clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h?rev=186938&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h?rev=186938&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h (added)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Reformatting.h Tue Jul 23 07:50:03 2013<br>
@@ -0,0 +1,59 @@<br>
+//===-- Core/Reformatting.h - LibFormat integration -------------*- C++ -*-===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+///<br>
+/// \file<br>
+/// \brief This file provides the LibFormat integration used to reformat<br>
+/// migrated code.<br>
+///<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef CPP11_MIGRATE_REFORMATTING_H<br>
+#define CPP11_MIGRATE_REFORMATTING_H<br>
+<br>
+#include "clang/Format/Format.h"<br>
+<br>
+class SourceOverrides;<br>
+class ChangedRanges;<br>
+<br>
+class Reformatter {<br>
+public:<br>
+  Reformatter(const clang::format::FormatStyle &Style) : Style(Style) {}<br>
+<br>
+  /// \brief Reformat the changes made to the file overrides.<br>
+  ///<br>
+  /// \param Overrides Overriden source files to reformat. Note that since only<br>
+  /// the changes are reformatted, file change tracking has to be enabled.<br>
+  /// \param SM A SourceManager where the overridens files can be found.<br>
+  ///<br>
+  /// \sa \c SourceOverrides::isTrackingFileChanges()<br>
+  void reformatChanges(SourceOverrides &Overrides, clang::SourceManager &SM);<br>
+<br>
+  /// \brief Overload of \c reformatChanges() providing it's own<br>
+  /// \c SourceManager.<br>
+  void reformatChanges(SourceOverrides &Overrides);<br>
+<br>
+  /// \brief Produce a list of replacements to apply on \p FileName, only the<br>
+  /// ranges in \p Changes are replaced.<br>
+  ///<br>
+  /// Since this routine use \c clang::format::reformat() the rules that applies<br>
+  /// on the ranges are identical:<br>
+  ///<br>
+  /// <blockquote> Each range is extended on either end to its next bigger logic<br>
+  /// unit, i.e. everything that might influence its formatting or might be<br>
+  /// influenced by its formatting.<br>
+  /// -- \c clang::format::reformat()</blockquote><br>
+  clang::tooling::Replacements reformatSingleFile(llvm::StringRef FileName,<br>
+                                                  const ChangedRanges &Changes,<br>
+                                                  clang::SourceManager &SM);<br>
+<br>
+private:<br>
+  clang::format::FormatStyle Style;<br>
+};<br>
+<br>
+#endif // CPP11_MIGRATE_REFORMATTING_H<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp Tue Jul 23 07:50:03 2013<br>
@@ -20,6 +20,7 @@<br>
 #include "Core/SyntaxCheck.h"<br>
 #include "Core/Transform.h"<br>
 #include "Core/Transforms.h"<br>
+#include "Core/Reformatting.h"<br>
 #include "LoopConvert/LoopConvert.h"<br>
 #include "UseNullptr/UseNullptr.h"<br>
 #include "UseAuto/UseAuto.h"<br>
@@ -28,6 +29,7 @@<br>
 #include "clang/Frontend/FrontendActions.h"<br>
 #include "clang/Tooling/CommonOptionsParser.h"<br>
 #include "clang/Tooling/Tooling.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
 #include "llvm/Support/Signals.h"<br>
<br>
 namespace cl = llvm::cl;<br>
@@ -43,9 +45,9 @@ static cl::extrahelp MoreHelp(<br>
     "  cpp11-migrate -use-auto path/to/file.cpp -- -Ipath/to/include/\n"<br>
     "\n"<br>
     "Convert for loops to the new ranged-based for loops on all files in a "<br>
-    "subtree:\n\n"<br>
+    "subtree\nand reformat the code automatically using the LLVM style:\n\n"<br>
     "  find path/in/subtree -name '*.cpp' -exec \\\n"<br>
-    "    cpp11-migrate -p build/path -loop-convert {} ';'\n"<br>
+    "    cpp11-migrate -p build/path -format-style=LLVM -loop-convert {} ';'\n"<br>
     "\n"<br>
     "Make use of both nullptr and the override specifier, using git ls-files:\n"<br>
     "\n"<br>
@@ -70,6 +72,14 @@ static cl::opt<bool> FinalSyntaxCheck(<br>
     cl::desc("Check for correct syntax after applying transformations"),<br>
     cl::init(false));<br>
<br>
+static cl::opt<std::string> FormatStyleOpt(<br>
+    "format-style",<br>
+    cl::desc("Coding style to use on the replacements, either a builtin style\n"<br>
+             "or a YAML config file (see: clang-format -dump-config).\n"<br>
+             "Currently supports 4 builtins style:\n"<br>
+             "  LLVM, Google, Chromium, Mozilla.\n"),<br>
+    cl::value_desc("string"));<br>
+<br>
 static cl::opt<bool><br>
 SummaryMode("summary", cl::desc("Print transform summary"),<br>
             cl::init(false));<br>
@@ -108,6 +118,40 @@ static cl::opt<bool, /*ExternalStorage=*<br>
     cl::location(GlobalOptions.EnableHeaderModifications),<br>
     cl::init(false));<br>
<br>
+/// \brief Creates the Reformatter if the format style option is provided,<br>
+/// return a null pointer otherwise.<br>
+///<br>
+/// \param ProgName The name of the program, \c argv[0], used to print errors.<br>
+/// \param Error If the \c -format-style is provided but with wrong parameters<br>
+/// this is parameter is set to \c true, left untouched otherwise. An error<br>
+/// message is printed with an explanation.<br>
+static Reformatter *handleFormatStyle(const char *ProgName, bool &Error) {<br>
+  if (FormatStyleOpt.getNumOccurrences() > 0) {<br>
+    format::FormatStyle Style;<br>
+    if (!format::getPredefinedStyle(FormatStyleOpt, &Style)) {<br>
+      llvm::StringRef ConfigFilePath = FormatStyleOpt;<br>
+      llvm::OwningPtr<llvm::MemoryBuffer> Text;<br>
+      llvm::error_code ec;<br>
+<br>
+      ec = llvm::MemoryBuffer::getFile(ConfigFilePath, Text);<br>
+      if (!ec)<br>
+        ec = parseConfiguration(Text->getBuffer(), &Style);<br>
+<br>
+      if (ec) {<br>
+        llvm::errs() << ProgName << ": invalid format style " << FormatStyleOpt<br>
+                     << ": " << ec.message() << "\n";<br>
+        Error = true;<br>
+        return 0;<br>
+      }<br>
+    }<br>
+<br>
+    // force mode to C++11<br>
+    Style.Standard = clang::format::FormatStyle::LS_Cpp11;<br>
+    return new Reformatter(Style);<br>
+  }<br>
+  return 0;<br>
+}<br>
+<br>
 int main(int argc, const char **argv) {<br>
   llvm::sys::PrintStackTraceOnErrorSignal();<br>
   Transforms TransformManager;<br>
@@ -137,6 +181,13 @@ int main(int argc, const char **argv) {<br>
   // against the default value when the command line option is not specified.<br>
   GlobalOptions.EnableTiming = (TimingDirectoryName != NoTiming);<br>
<br>
+  // Check the reformatting style option<br>
+  bool BadStyle = false;<br>
+  llvm::OwningPtr<Reformatter> ChangesReformatter(<br>
+      handleFormatStyle(argv[0], BadStyle));<br>
+  if (BadStyle)<br>
+    return 1;<br>
+<br>
   // Populate the ModifiableHeaders structure if header modifications are<br>
   // enabled.<br>
   if (GlobalOptions.EnableHeaderModifications) {<br>
@@ -153,7 +204,10 @@ int main(int argc, const char **argv) {<br>
     return 1;<br>
   }<br>
<br>
-  FileOverrides FileStates;<br>
+  // if reformatting is enabled we wants to track file changes so that it's<br>
+  // possible to reformat them.<br>
+  bool TrackReplacements = static_cast<bool>(ChangesReformatter);<br>
+  FileOverrides FileStates(TrackReplacements);<br>
   SourcePerfData PerfData;<br>
<br>
   // Apply transforms.<br>
@@ -183,6 +237,15 @@ int main(int argc, const char **argv) {<br>
     }<br>
   }<br>
<br>
+  // Reformat changes if a reformatter is provided.<br>
+  if (ChangesReformatter)<br>
+    for (FileOverrides::const_iterator I = FileStates.begin(),<br>
+                                       E = FileStates.end();<br>
+         I != E; ++I) {<br>
+      SourceOverrides &Overrides = *I->second;<br>
+      ChangesReformatter->reformatChanges(Overrides);<br>
+    }<br>
+<br>
   if (FinalSyntaxCheck)<br>
     if (!doSyntaxCheck(OptionsParser.getCompilations(),<br>
                        OptionsParser.getSourcePathList(), FileStates))<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/tool/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Makefile?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Makefile?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/tool/Makefile (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Makefile Tue Jul 23 07:50:03 2013<br>
@@ -34,10 +34,10 @@ SOURCES += $(addprefix ../ReplaceAutoPtr<br>
 BUILT_SOURCES += $(ObjDir)/../ReplaceAutoPtr/.objdir<br>
<br>
 LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc mcparser option<br>
-USEDLIBS = migrateCore.a clangTooling.a clangFrontend.a clangSerialization.a clangDriver.a \<br>
-                  clangRewriteFrontend.a clangRewriteCore.a clangParse.a \<br>
-                  clangSema.a clangAnalysis.a \<br>
-                  clangAST.a clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a<br>
+USEDLIBS = migrateCore.a clangFormat.a clangTooling.a clangFrontend.a \<br>
+          clangSerialization.a clangDriver.a clangRewriteFrontend.a \<br>
+          clangRewriteCore.a clangParse.a clangSema.a clangAnalysis.a \<br>
+          clangAST.a clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a<br>
<br>
 include $(CLANG_LEVEL)/Makefile<br>
<br>
<br>
Modified: clang-tools-extra/trunk/docs/MigratorUsage.rst<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/MigratorUsage.rst?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/MigratorUsage.rst?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/docs/MigratorUsage.rst (original)<br>
+++ clang-tools-extra/trunk/docs/MigratorUsage.rst Tue Jul 23 07:50:03 2013<br>
@@ -66,6 +66,43 @@ General Command Line Options<br>
   earlier transforms are already caught when subsequent transforms parse the<br>
   file.<br>
<br>
+.. option:: -format-style=<string><br>
+<br>
+  After all transformations have been applied, reformat the changes using the<br>
+  style ``string`` given as argument to the option. The style can be a builtin<br>
+  style, one of LLVM, Google, Chromium, Mozilla; or a YAML configuration file.<br>
+<br>
+  If you want a place to start for using your own custom configuration file,<br>
+  ClangFormat_ can generate a file with ``clang-format -dump-config``.<br>
+<br>
+  Example:<br>
+<br>
+  .. code-block:: c++<br>
+    :emphasize-lines: 10-12,18<br>
+<br>
+      // file.cpp<br>
+      for (std::vector<int>::const_iterator I = my_container.begin(),<br>
+                                            E = my_container.end();<br>
+           I != E; ++I) {<br>
+        std::cout << *I << std::endl;<br>
+      }<br>
+<br>
+      // No reformatting:<br>
+      //     cpp11-migrate -use-auto file.cpp --<br>
+      for (auto I = my_container.begin(),<br>
+                                            E = my_container.end();<br>
+           I != E; ++I) {<br>
+        std::cout << *I << std::endl;<br>
+      }<br>
+<br>
+      // With reformatting enabled:<br>
+      //     cpp11-migrate -format-style=LLVM -use-auto file.cpp --<br>
+      for (auto I = my_container.begin(), E = my_container.end(); I != E; ++I) {<br>
+        std::cout << *I << std::endl;<br>
+      }<br>
+<br>
+.. _ClangFormat: <a href="http://clang.llvm.org/docs/ClangFormat.html" target="_blank">http://clang.llvm.org/docs/ClangFormat.html</a><br>
+<br>
 .. option:: -summary<br>
<br>
   Displays a summary of the number of changes each transform made or could have<br>
<br>
Added: clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp?rev=186938&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp?rev=186938&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp (added)<br>
+++ clang-tools-extra/trunk/test/cpp11-migrate/Core/Reformatting.cpp Tue Jul 23 07:50:03 2013<br>
@@ -0,0 +1,15 @@<br>
+// RUN: grep -Ev "// *[A-Z-]+:" %s > %t.cpp<br>
+// RUN: not cpp11-migrate -format-style=FOO -use-auto %t.cpp -- -std=c++11<br>
+// RUN: not cpp11-migrate -format-style=/tmp/ -use-auto %t.cpp -- -std=c++11<br>
+// RUN: cpp11-migrate -format-style=LLVM -use-auto %t.cpp -- -std=c++11<br>
+// RUN: FileCheck --strict-whitespace -input-file=%t.cpp %s<br>
+<br>
+class MyType012345678901234567890123456789 {};<br>
+<br>
+int f() {<br>
+  MyType012345678901234567890123456789 *a =<br>
+      new MyType012345678901234567890123456789();<br>
+  // CHECK: {{^\ \ auto\ a\ \=\ new\ MyType012345678901234567890123456789\(\);}}<br>
+<br>
+  delete a;<br>
+}<br>
<br>
Modified: clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt (original)<br>
+++ clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt Tue Jul 23 07:50:03 2013<br>
@@ -8,6 +8,7 @@ include_directories(${CPP11_MIGRATE_SOUR<br>
<br>
 add_extra_unittest(Cpp11MigrateTests<br>
   FileOverridesTest.cpp<br>
+  ReformattingTest.cpp<br>
   IncludeExcludeTest.cpp<br>
   PerfSupportTest.cpp<br>
   TransformTest.cpp<br>
@@ -16,7 +17,9 @@ add_extra_unittest(Cpp11MigrateTests<br>
<br>
 target_link_libraries(Cpp11MigrateTests<br>
   migrateCore<br>
+  clangFormat<br>
   clangTooling<br>
   clangBasic<br>
   clangASTMatchers<br>
+  clangRewriteFrontend<br>
   )<br>
<br>
Modified: clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp (original)<br>
+++ clang-tools-extra/trunk/unittests/cpp11-migrate/FileOverridesTest.cpp Tue Jul 23 07:50:03 2013<br>
@@ -21,10 +21,11 @@ TEST(SourceOverridesTest, Interface) {<br>
       FileName,<br>
       "std::vector<such_a_long_name_for_a_type>::const_iterator long_type =\n"<br>
       "    vec.begin();\n");<br>
-  SourceOverrides Overrides(FileName);<br>
+  SourceOverrides Overrides(FileName, /*TrackFileChanges=*/false);<br>
<br>
   EXPECT_EQ(FileName, Overrides.getMainFileName());<br>
   EXPECT_FALSE(Overrides.isSourceOverriden());<br>
+  EXPECT_FALSE(Overrides.isTrackingFileChanges());<br>
<br>
   Replacements Replaces;<br>
   unsigned ReplacementLength =<br>
@@ -37,3 +38,103 @@ TEST(SourceOverridesTest, Interface) {<br>
                                 "    vec.begin();\n";<br>
   EXPECT_EQ(ExpectedContent, Overrides.getMainFileContent());<br>
 }<br>
+<br>
+namespace {<br>
+Replacement makeReplacement(unsigned Offset, unsigned Length,<br>
+                            unsigned ReplacementLength) {<br>
+  return Replacement("", Offset, Length, std::string(ReplacementLength, '~'));<br>
+}<br>
+<br>
+// generate a set of replacements containing one element<br>
+Replacements makeReplacements(unsigned Offset, unsigned Length,<br>
+                              unsigned ReplacementLength) {<br>
+  Replacements Replaces;<br>
+  Replaces.insert(makeReplacement(Offset, Length, ReplacementLength));<br>
+  return Replaces;<br>
+}<br>
+<br>
+bool equalRanges(Range A, Range B) {<br>
+  return A.getOffset() == B.getOffset() && A.getLength() == B.getLength();<br>
+}<br>
+} // end anonymous namespace<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesShrink) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(0, 0, 4));<br>
+  EXPECT_NE(Changes.begin(), Changes.end());<br>
+  EXPECT_TRUE(equalRanges(Range(0, 4), *Changes.begin()));<br>
+  // create a replacement that cuts the end of the last insertion<br>
+  Changes.adjustChangedRanges(makeReplacements(2, 4, 0));<br>
+  Range ExpectedChanges[] = { Range(0, 2) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesExtend) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(1, 0, 4));<br>
+  // cut the old one by a bigger one<br>
+  Changes.adjustChangedRanges(makeReplacements(3, 4, 6));<br>
+  Range ExpectedChanges[] = { Range(1, 8) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesNoOverlap) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(0, 0, 4));<br>
+  Changes.adjustChangedRanges(makeReplacements(6, 0, 4));<br>
+  Range ExpectedChanges[] = { Range(0, 4), Range(6, 4) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesNullRange) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(0, 4, 0));<br>
+  Range ExpectedChanges[] = { Range(0, 0) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesExtendExisting) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(0, 0, 3));<br>
+  Changes.adjustChangedRanges(makeReplacements(2, 5, 8));<br>
+  Range ExpectedChanges[] = { Range(0, 10) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesSplit) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(0, 0, 3));<br>
+  Changes.adjustChangedRanges(makeReplacements(1, 1, 0));<br>
+  Range ExpectedChanges[] = { Range(0, 2) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesRangeContained) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(3, 0, 2));<br>
+  Changes.adjustChangedRanges(makeReplacements(1, 4, 5));<br>
+  Range ExpectedChanges[] = { Range(1, 5) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
+<br>
+TEST(ChangedRangesTest, adjustChangedRangesRangeResized) {<br>
+  ChangedRanges Changes;<br>
+  Changes.adjustChangedRanges(makeReplacements(2, 0, 5));<br>
+  // first make the range bigger<br>
+  Changes.adjustChangedRanges(makeReplacements(4, 1, 3));<br>
+  Range ExpectedChanges[] = { Range(2, 7) };<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+  // then smaller<br>
+  Changes.adjustChangedRanges(makeReplacements(3, 3, 1));<br>
+  ExpectedChanges[0] = Range(2, 5);<br>
+  EXPECT_TRUE(<br>
+      std::equal(Changes.begin(), Changes.end(), ExpectedChanges, equalRanges));<br>
+}<br>
<br>
Modified: clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile (original)<br>
+++ clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile Tue Jul 23 07:50:03 2013<br>
@@ -12,10 +12,11 @@ include $(CLANG_LEVEL)/../../Makefile.co<br>
<br>
 TESTNAME = Cpp11MigrateTests<br>
 LINK_COMPONENTS := asmparser bitreader support MC MCParser option<br>
-USEDLIBS = migrateCore.a clangTooling.a clangFrontend.a clangSerialization.a clangDriver.a \<br>
-                  clangRewriteFrontend.a clangRewriteCore.a clangParse.a \<br>
-                  clangSema.a clangAnalysis.a \<br>
-                  clangAST.a clangASTMatchers.a clangEdit.a clangLex.a clangBasic.a<br>
+USEDLIBS = migrateCore.a clangFormat.a clangTooling.a clangFrontend.a \<br>
+               clangSerialization.a clangDriver.a clangRewriteFrontend.a \<br>
+               clangRewriteCore.a clangParse.a clangSema.a clangAnalysis.a \<br>
+               clangAST.a clangASTMatchers.a clangEdit.a clangLex.a \<br>
+               clangBasic.a<br>
<br>
 include $(CLANG_LEVEL)/Makefile<br>
 MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1<br>
<br>
Added: clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp?rev=186938&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp?rev=186938&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp (added)<br>
+++ clang-tools-extra/trunk/unittests/cpp11-migrate/ReformattingTest.cpp Tue Jul 23 07:50:03 2013<br>
@@ -0,0 +1,50 @@<br>
+//===- cpp11-migrate/ReformattingTest.cpp - Reformatting unit tests -------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "Core/Reformatting.h"<br>
+#include "Core/FileOverrides.h"<br>
+#include "gtest/gtest.h"<br>
+#include "VirtualFileHelper.h"<br>
+<br>
+using namespace clang;<br>
+using namespace clang::tooling;<br>
+<br>
+namespace {<br>
+// convenience function to create a ChangedRanges containing one Range<br>
+ChangedRanges makeChangedRanges(unsigned Offset, unsigned Length) {<br>
+  ChangedRanges Changes;<br>
+  Replacements Replaces;<br>
+<br>
+  Replaces.insert(Replacement("", Offset, 0, std::string(Length, '~')));<br>
+  Changes.adjustChangedRanges(Replaces);<br>
+  return Changes;<br>
+}<br>
+} // end anonymous namespace<br>
+<br>
+TEST(Reformatter, SingleReformat) {<br>
+  VirtualFileHelper VFHelper;<br>
+  llvm::StringRef FileName = "<test>";<br>
+  VFHelper.mapFile(FileName, "int  a;\n"<br>
+                             "int  b;\n");<br>
+<br>
+  Reformatter ChangesReformatter(format::getLLVMStyle());<br>
+  ChangedRanges Changes = makeChangedRanges(0, 6);<br>
+  tooling::Replacements Replaces = ChangesReformatter.reformatSingleFile(<br>
+      FileName, Changes, VFHelper.getNewSourceManager());<br>
+<br>
+  SourceOverrides Overrides(FileName, /*TrackChanges=*/false);<br>
+  Overrides.applyReplacements(Replaces, VFHelper.getNewSourceManager());<br>
+<br>
+  std::string Expected, Result;<br>
+<br>
+  Expected = "int a;\n"<br>
+             "int  b;\n";<br>
+  Result = Overrides.getMainFileContent();<br>
+  EXPECT_EQ(Expected, Result);<br>
+}<br>
<br>
Modified: clang-tools-extra/trunk/unittests/cpp11-migrate/TransformTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/TransformTest.cpp?rev=186938&r1=186937&r2=186938&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/TransformTest.cpp?rev=186938&r1=186937&r2=186938&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/unittests/cpp11-migrate/TransformTest.cpp (original)<br>
+++ clang-tools-extra/trunk/unittests/cpp11-migrate/TransformTest.cpp Tue Jul 23 07:50:03 2013<br>
@@ -161,7 +161,7 @@ TEST(Transform, Timings) {<br>
<br>
   // Transform's handle* functions require FileOverrides to be set, even if<br>
   // there aren't any.<br>
-  FileOverrides Overrides;<br>
+  FileOverrides Overrides(/*TrackFileChanges=*/false);<br>
   T.setOverrides(Overrides);<br>
<br>
   Tool.run(clang::tooling::newFrontendActionFactory(&Factory, &Callbacks));<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>