<div dir="ltr">Thanks for getting to this.<div><br></div><div>-- Sean Silva</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Sep 3, 2013 at 1:58 PM, 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 Sep  3 12:58:19 2013<br>
New Revision: 189832<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=189832&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=189832&view=rev</a><br>
Log:<br>
Rename clang-replace -> clang-apply-replacements<br>
<br>
Made changes throughout clang-tools-extra for the renaming of<br>
clang-replace to clang-apply-replacements as per feedback from<br>
community.<br>
<br>
<br>
Added:<br>
    clang-tools-extra/trunk/clang-apply-replacements/<br>
    clang-tools-extra/trunk/clang-apply-replacements/CMakeLists.txt<br>
    clang-tools-extra/trunk/clang-apply-replacements/Makefile<br>
    clang-tools-extra/trunk/clang-apply-replacements/include/<br>
    clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/<br>
    clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/<br>
    clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/ApplyReplacements.h<br>
    clang-tools-extra/trunk/clang-apply-replacements/lib/<br>
    clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/<br>
    clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp<br>
    clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/Makefile<br>
    clang-tools-extra/trunk/clang-apply-replacements/tool/<br>
    clang-tools-extra/trunk/clang-apply-replacements/tool/CMakeLists.txt<br>
    clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp<br>
    clang-tools-extra/trunk/clang-apply-replacements/tool/Makefile<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/basic.h<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file1.yaml<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file2.yaml<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/common.h<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/expected.txt<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file1.yaml<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file2.yaml<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file3.yaml<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/basic.cpp<br>
    clang-tools-extra/trunk/test/clang-apply-replacements/conflict.cpp<br>
Removed:<br>
    clang-tools-extra/trunk/clang-replace/<br>
    clang-tools-extra/trunk/test/clang-replace/<br>
Modified:<br>
    clang-tools-extra/trunk/CMakeLists.txt<br>
    clang-tools-extra/trunk/Makefile<br>
    clang-tools-extra/trunk/cpp11-migrate/CMakeLists.txt<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h<br>
    clang-tools-extra/trunk/cpp11-migrate/Core/Makefile<br>
    clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt<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/Doxyfile<br>
    clang-tools-extra/trunk/test/CMakeLists.txt<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt<br>
    clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile<br>
<br>
Modified: clang-tools-extra/trunk/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/CMakeLists.txt (original)<br>
+++ clang-tools-extra/trunk/CMakeLists.txt Tue Sep  3 12:58:19 2013<br>
@@ -1,7 +1,7 @@<br>
 add_subdirectory(remove-cstr-calls)<br>
 add_subdirectory(tool-template)<br>
+add_subdirectory(clang-apply-replacements)<br>
 add_subdirectory(cpp11-migrate)<br>
-add_subdirectory(clang-replace)<br>
 add_subdirectory(modularize)<br>
 add_subdirectory(clang-tidy)<br>
<br>
<br>
Modified: clang-tools-extra/trunk/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/Makefile?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/Makefile (original)<br>
+++ clang-tools-extra/trunk/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -12,7 +12,7 @@ CLANG_LEVEL := ../..<br>
 include $(CLANG_LEVEL)/../../Makefile.config<br>
<br>
 PARALLEL_DIRS := remove-cstr-calls tool-template modularize<br>
-DIRS := clang-replace cpp11-migrate clang-tidy unittests<br>
+DIRS := clang-apply-replacements cpp11-migrate clang-tidy unittests<br>
<br>
 include $(CLANG_LEVEL)/Makefile<br>
<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/CMakeLists.txt?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/CMakeLists.txt?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/CMakeLists.txt (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/CMakeLists.txt Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,22 @@<br>
+set(LLVM_LINK_COMPONENTS<br>
+  ${LLVM_TARGETS_TO_BUILD}<br>
+  asmparser<br>
+  bitreader<br>
+  support<br>
+  mc<br>
+  )<br>
+<br>
+add_clang_library(clangApplyReplacements<br>
+  lib/Tooling/ApplyReplacements.cpp<br>
+  )<br>
+target_link_libraries(clangApplyReplacements<br>
+  clangTooling<br>
+  clangBasic<br>
+  clangRewriteFrontend<br>
+  )<br>
+<br>
+include_directories(<br>
+  ${CMAKE_CURRENT_SOURCE_DIR}<br>
+  include<br>
+  )<br>
+add_subdirectory(tool)<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/Makefile?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/Makefile?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/Makefile (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,15 @@<br>
+##===- clang-apply-replacements/Makefile -------------------*- Makefile -*-===##<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>
+CLANG_LEVEL := ../../..<br>
+include $(CLANG_LEVEL)/../../Makefile.config<br>
+<br>
+DIRS = lib/Tooling tool<br>
+<br>
+include $(CLANG_LEVEL)/Makefile<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/ApplyReplacements.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/ApplyReplacements.h?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/ApplyReplacements.h?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/ApplyReplacements.h (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/include/clang-apply-replacements/Tooling/ApplyReplacements.h Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,114 @@<br>
+//===-- ApplyReplacements.h - Deduplicate and apply replacements -- 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 interface for deduplicating, detecting<br>
+/// conflicts in, and applying collections of Replacements.<br>
+///<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#ifndef LLVM_CLANG_APPLYREPLACEMENTS_H<br>
+#define LLVM_CLANG_APPLYREPLACEMENTS_H<br>
+<br>
+#include "clang/Tooling/Refactoring.h"<br>
+#include "llvm/ADT/StringMap.h"<br>
+#include "llvm/ADT/StringRef.h"<br>
+#include "llvm/Support/system_error.h"<br>
+#include <vector><br>
+#include <string><br>
+<br>
+namespace clang {<br>
+<br>
+class DiagnosticsEngine;<br>
+class Rewriter;<br>
+<br>
+namespace replace {<br>
+<br>
+/// \brief Collection of TranslationUnitReplacements.<br>
+typedef std::vector<clang::tooling::TranslationUnitReplacements><br>
+TUReplacements;<br>
+<br>
+/// \brief Collection of TranslationUnitReplacement files.<br>
+typedef std::vector<std::string> TUReplacementFiles;<br>
+<br>
+/// \brief Map mapping file name to Replacements targeting that file.<br>
+typedef llvm::StringMap<std::vector<clang::tooling::Replacement> ><br>
+FileToReplacementsMap;<br>
+<br>
+/// \brief Recursively descends through a directory structure rooted at \p<br>
+/// Directory and attempts to deserialize *.yaml files as<br>
+/// TranslationUnitReplacements. All docs that successfully deserialize are<br>
+/// added to \p TUs.<br>
+///<br>
+/// Directories starting with '.' are ignored during traversal.<br>
+///<br>
+/// \param[in] Directory Directory to begin search for serialized<br>
+/// TranslationUnitReplacements.<br>
+/// \param[out] TUs Collection of all found and deserialized<br>
+/// TranslationUnitReplacements.<br>
+/// \param[out] TURFiles Collection of all TranslationUnitReplacement files<br>
+/// found in \c Directory.<br>
+/// \param[in] Diagnostics DiagnosticsEngine used for error output.<br>
+///<br>
+/// \returns An error_code indicating success or failure in navigating the<br>
+/// directory structure.<br>
+llvm::error_code<br>
+collectReplacementsFromDirectory(const llvm::StringRef Directory,<br>
+                                 TUReplacements &TUs,<br>
+                                 TUReplacementFiles &TURFiles,<br>
+                                 clang::DiagnosticsEngine &Diagnostics);<br>
+<br>
+/// \brief Deduplicate, check for conflicts, and apply all Replacements stored<br>
+/// in \c TUs. If conflicts occur, no Replacements are applied.<br>
+///<br>
+/// \param[in] TUs Collection of TranslationUnitReplacements to merge,<br>
+/// deduplicate, and test for conflicts.<br>
+/// \param[out] GroupedReplacements Container grouping all Replacements by the<br>
+/// file they target.<br>
+/// \param[in] SM SourceManager required for conflict reporting.<br>
+///<br>
+/// \returns \li true If all changes were applied successfully.<br>
+///          \li false If there were conflicts.<br>
+bool mergeAndDeduplicate(const TUReplacements &TUs,<br>
+                         FileToReplacementsMap &GroupedReplacements,<br>
+                         clang::SourceManager &SM);<br>
+<br>
+/// \brief Apply all replacements in \c GroupedReplacements.<br>
+///<br>
+/// \param[in] GroupedReplacements Deduplicated and conflict free Replacements<br>
+/// to apply.<br>
+/// \param[out] Rewrites The results of applying replacements will be applied<br>
+/// to this Rewriter.<br>
+///<br>
+/// \returns \li true If all changes were applied successfully.<br>
+///          \li false If a replacement failed to apply.<br>
+bool applyReplacements(const FileToReplacementsMap &GroupedReplacements,<br>
+                       clang::Rewriter &Rewrites);<br>
+<br>
+/// \brief Write the contents of \c FileContents to disk. Keys of the map are<br>
+/// filenames and values are the new contents for those files.<br>
+///<br>
+/// \param[in] Rewrites Rewriter containing written files to write to disk.<br>
+bool writeFiles(const clang::Rewriter &Rewrites);<br>
+<br>
+/// \brief Delete the replacement files.<br>
+///<br>
+/// \param[in] Files Replacement files to delete.<br>
+/// \param[in] Diagnostics DiagnosticsEngine used for error output.<br>
+///<br>
+/// \returns \li true If all files have been deleted successfully.<br>
+///          \li false If at least one or more failures occur when deleting<br>
+/// files.<br>
+bool deleteReplacementFiles(const TUReplacementFiles &Files,<br>
+                            clang::DiagnosticsEngine &Diagnostics);<br>
+<br>
+} // end namespace replace<br>
+} // end namespace clang<br>
+<br>
+#endif // LLVM_CLANG_APPLYREPLACEMENTS_H<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,254 @@<br>
+//===-- ApplyReplacements.cpp - Apply and deduplicate replacements --------===//<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 implementation for deduplicating, detecting<br>
+/// conflicts in, and applying collections of Replacements.<br>
+///<br>
+/// FIXME: Use Diagnostics for output instead of llvm::errs().<br>
+///<br>
+//===----------------------------------------------------------------------===//<br>
+#include "clang-apply-replacements/Tooling/ApplyReplacements.h"<br>
+#include "clang/Basic/LangOptions.h"<br>
+#include "clang/Basic/SourceManager.h"<br>
+#include "clang/Rewrite/Core/Rewriter.h"<br>
+#include "clang/Tooling/ReplacementsYaml.h"<br>
+#include "llvm/ADT/ArrayRef.h"<br>
+#include "llvm/Support/FileSystem.h"<br>
+#include "llvm/Support/MemoryBuffer.h"<br>
+#include "llvm/Support/Path.h"<br>
+#include "llvm/Support/raw_ostream.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace clang;<br>
+<br>
+<br>
+static void eatDiagnostics(const SMDiagnostic &, void *) {}<br>
+<br>
+namespace clang {<br>
+namespace replace {<br>
+<br>
+<br>
+llvm::error_code<br>
+collectReplacementsFromDirectory(const llvm::StringRef Directory,<br>
+                                 TUReplacements &TUs,<br>
+                                 TUReplacementFiles & TURFiles,<br>
+                                 clang::DiagnosticsEngine &Diagnostics) {<br>
+  using namespace llvm::sys::fs;<br>
+  using namespace llvm::sys::path;<br>
+<br>
+  error_code ErrorCode;<br>
+<br>
+  for (recursive_directory_iterator I(Directory, ErrorCode), E;<br>
+       I != E && !ErrorCode; I.increment(ErrorCode)) {<br>
+    if (filename(I->path())[0] == '.') {<br>
+      // Indicate not to descend into directories beginning with '.'<br>
+      I.no_push();<br>
+      continue;<br>
+    }<br>
+<br>
+    if (extension(I->path()) != ".yaml")<br>
+      continue;<br>
+<br>
+    TURFiles.push_back(I->path());<br>
+<br>
+    OwningPtr<MemoryBuffer> Out;<br>
+    error_code BufferError = MemoryBuffer::getFile(I->path(), Out);<br>
+    if (BufferError) {<br>
+      errs() << "Error reading " << I->path() << ": " << BufferError.message()<br>
+             << "\n";<br>
+      continue;<br>
+    }<br>
+<br>
+    yaml::Input YIn(Out->getBuffer());<br>
+    YIn.setDiagHandler(&eatDiagnostics);<br>
+    tooling::TranslationUnitReplacements TU;<br>
+    YIn >> TU;<br>
+    if (YIn.error()) {<br>
+      // File doesn't appear to be a header change description. Ignore it.<br>
+      continue;<br>
+    }<br>
+<br>
+    // Only keep files that properly parse.<br>
+    TUs.push_back(TU);<br>
+  }<br>
+<br>
+  return ErrorCode;<br>
+}<br>
+<br>
+/// \brief Dumps information for a sequence of conflicting Replacements.<br>
+///<br>
+/// \param[in] File FileEntry for the file the conflicting Replacements are<br>
+/// for.<br>
+/// \param[in] ConflictingReplacements List of conflicting Replacements.<br>
+/// \param[in] SM SourceManager used for reporting.<br>
+static void reportConflict(<br>
+    const FileEntry *File,<br>
+    const llvm::ArrayRef<clang::tooling::Replacement> ConflictingReplacements,<br>
+    SourceManager &SM) {<br>
+  FileID FID = SM.translateFile(File);<br>
+  if (FID.isInvalid())<br>
+    FID = SM.createFileID(File, SourceLocation(), SrcMgr::C_User);<br>
+<br>
+  // FIXME: Output something a little more user-friendly (e.g. unified diff?)<br>
+  errs() << "The following changes conflict:\n";<br>
+  for (const tooling::Replacement *I = ConflictingReplacements.begin(),<br>
+                                  *E = ConflictingReplacements.end();<br>
+       I != E; ++I) {<br>
+    if (I->getLength() == 0) {<br>
+      errs() << "  Insert at " << SM.getLineNumber(FID, I->getOffset()) << ":"<br>
+             << SM.getColumnNumber(FID, I->getOffset()) << " "<br>
+             << I->getReplacementText() << "\n";<br>
+    } else {<br>
+      if (I->getReplacementText().empty())<br>
+        errs() << "  Remove ";<br>
+      else<br>
+        errs() << "  Replace ";<br>
+<br>
+      errs() << SM.getLineNumber(FID, I->getOffset()) << ":"<br>
+             << SM.getColumnNumber(FID, I->getOffset()) << "-"<br>
+             << SM.getLineNumber(FID, I->getOffset() + I->getLength() - 1)<br>
+             << ":"<br>
+             << SM.getColumnNumber(FID, I->getOffset() + I->getLength() - 1);<br>
+<br>
+      if (I->getReplacementText().empty())<br>
+        errs() << "\n";<br>
+      else<br>
+        errs() << " with \"" << I->getReplacementText() << "\"\n";<br>
+    }<br>
+  }<br>
+}<br>
+<br>
+/// \brief Deduplicates and tests for conflicts among the replacements for each<br>
+/// file in \c Replacements. Any conflicts found are reported.<br>
+///<br>
+/// \param[in,out] Replacements Container of all replacements grouped by file<br>
+/// to be deduplicated and checked for conflicts.<br>
+/// \param[in] SM SourceManager required for conflict reporting.<br>
+///<br>
+/// \returns \li true if conflicts were detected<br>
+///          \li false if no conflicts were detected<br>
+static bool deduplicateAndDetectConflicts(FileToReplacementsMap &Replacements,<br>
+                                          SourceManager &SM) {<br>
+  bool conflictsFound = false;<br>
+<br>
+  for (FileToReplacementsMap::iterator I = Replacements.begin(),<br>
+                                       E = Replacements.end();<br>
+       I != E; ++I) {<br>
+<br>
+    const FileEntry *Entry = SM.getFileManager().getFile(I->getKey());<br>
+    if (!Entry) {<br>
+      errs() << "Described file '" << I->getKey()<br>
+             << "' doesn't exist. Ignoring...\n";<br>
+      continue;<br>
+    }<br>
+<br>
+    std::vector<tooling::Range> Conflicts;<br>
+    tooling::deduplicate(I->getValue(), Conflicts);<br>
+<br>
+    if (Conflicts.empty())<br>
+      continue;<br>
+<br>
+    conflictsFound = true;<br>
+<br>
+    errs() << "There are conflicting changes to " << I->getKey() << ":\n";<br>
+<br>
+    for (std::vector<tooling::Range>::const_iterator<br>
+             ConflictI = Conflicts.begin(),<br>
+             ConflictE = Conflicts.end();<br>
+         ConflictI != ConflictE; ++ConflictI) {<br>
+      ArrayRef<tooling::Replacement> ConflictingReplacements(<br>
+          &I->getValue()[ConflictI->getOffset()], ConflictI->getLength());<br>
+      reportConflict(Entry, ConflictingReplacements, SM);<br>
+    }<br>
+  }<br>
+<br>
+  return conflictsFound;<br>
+}<br>
+<br>
+bool mergeAndDeduplicate(const TUReplacements &TUs,<br>
+                         FileToReplacementsMap &GroupedReplacements,<br>
+                         clang::SourceManager &SM) {<br>
+<br>
+  // Group all replacements by target file.<br>
+  for (TUReplacements::const_iterator TUI = TUs.begin(), TUE = TUs.end();<br>
+       TUI != TUE; ++TUI)<br>
+    for (std::vector<tooling::Replacement>::const_iterator<br>
+             RI = TUI->Replacements.begin(),<br>
+             RE = TUI->Replacements.end();<br>
+         RI != RE; ++RI)<br>
+      GroupedReplacements[RI->getFilePath()].push_back(*RI);<br>
+<br>
+<br>
+  // Ask clang to deduplicate and report conflicts.<br>
+  if (deduplicateAndDetectConflicts(GroupedReplacements, SM))<br>
+    return false;<br>
+<br>
+  return true;<br>
+}<br>
+<br>
+bool applyReplacements(const FileToReplacementsMap &GroupedReplacements,<br>
+                       clang::Rewriter &Rewrites) {<br>
+<br>
+  // Apply all changes<br>
+  //<br>
+  // FIXME: No longer certain GroupedReplacements is really the best kind of<br>
+  // data structure for applying replacements. Rewriter certainly doesn't care.<br>
+  // However, until we nail down the design of ReplacementGroups, might as well<br>
+  // leave this as is.<br>
+  for (FileToReplacementsMap::const_iterator I = GroupedReplacements.begin(),<br>
+                                             E = GroupedReplacements.end();<br>
+       I != E; ++I) {<br>
+    if (!tooling::applyAllReplacements(I->getValue(), Rewrites))<br>
+      return false;<br>
+  }<br>
+<br>
+  return true;<br>
+}<br>
+<br>
+bool writeFiles(const clang::Rewriter &Rewrites) {<br>
+<br>
+  for (Rewriter::const_buffer_iterator BufferI = Rewrites.buffer_begin(),<br>
+                                       BufferE = Rewrites.buffer_end();<br>
+       BufferI != BufferE; ++BufferI) {<br>
+    const char *FileName =<br>
+        Rewrites.getSourceMgr().getFileEntryForID(BufferI->first)->getName();<br>
+<br>
+    std::string ErrorInfo;<br>
+<br>
+    llvm::raw_fd_ostream FileStream(FileName, ErrorInfo);<br>
+    if (!ErrorInfo.empty()) {<br>
+      errs() << "Warning: Could not write to " << FileName << "\n";<br>
+      continue;<br>
+    }<br>
+    BufferI->second.write(FileStream);<br>
+  }<br>
+<br>
+  return true;<br>
+}<br>
+<br>
+bool deleteReplacementFiles(const TUReplacementFiles &Files,<br>
+                            clang::DiagnosticsEngine &Diagnostics) {<br>
+  bool Success = true;<br>
+  for (TUReplacementFiles::const_iterator I = Files.begin(), E = Files.end();<br>
+       I != E; ++I) {<br>
+    error_code Error = llvm::sys::fs::remove(*I);<br>
+    if (Error) {<br>
+      Success = false;<br>
+      // FIXME: Use Diagnostics for outputting errors.<br>
+      errs() << "Error deleting file: " << *I << "\n";<br>
+      errs() << Error.message() << "\n";<br>
+      errs() << "Please delete the file manually\n";<br>
+    }<br>
+  }<br>
+  return Success;<br>
+}<br>
+<br>
+} // end namespace replace<br>
+} // end namespace clang<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/Makefile?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/Makefile?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/Makefile (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/lib/Tooling/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,14 @@<br>
+##===- clang-apply-replacements/lib/Tooling/Makefile -------*- Makefile -*-===##<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>
+CLANG_LEVEL := ../../../../..<br>
+LIBRARYNAME := clangApplyReplacements<br>
+include $(CLANG_LEVEL)/../../Makefile.config<br>
+include $(CLANG_LEVEL)/Makefile<br>
+CPP.Flags += -I$(PROJ_SRC_DIR)/../../include<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/tool/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/CMakeLists.txt?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/CMakeLists.txt?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/tool/CMakeLists.txt (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/tool/CMakeLists.txt Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,17 @@<br>
+set(LLVM_LINK_COMPONENTS<br>
+  ${LLVM_TARGETS_TO_BUILD}<br>
+  asmparser<br>
+  bitreader<br>
+  support<br>
+  mc<br>
+  )<br>
+<br>
+add_clang_executable(clang-apply-replacements<br>
+  ClangApplyReplacementsMain.cpp<br>
+  )<br>
+target_link_libraries(clang-apply-replacements<br>
+  clangApplyReplacements<br>
+  )<br>
+<br>
+install(TARGETS clang-apply-replacements<br>
+  RUNTIME DESTINATION bin)<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/tool/ClangApplyReplacementsMain.cpp Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,96 @@<br>
+//===-- ClangApplyReplacementsMain.cpp - Main file for the tool -----------===//<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 main function for the<br>
+/// clang-apply-replacements tool.<br>
+///<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+#include "clang-apply-replacements/Tooling/ApplyReplacements.h"<br>
+#include "clang/Basic/Diagnostic.h"<br>
+#include "clang/Basic/DiagnosticOptions.h"<br>
+#include "clang/Basic/SourceManager.h"<br>
+#include "clang/Rewrite/Core/Rewriter.h"<br>
+#include "llvm/Support/CommandLine.h"<br>
+<br>
+using namespace llvm;<br>
+using namespace clang;<br>
+using namespace clang::replace;<br>
+<br>
+static cl::opt<std::string> Directory(cl::Positional, cl::Required,<br>
+                                      cl::desc("<Search Root Directory>"));<br>
+<br>
+static cl::opt<bool> RemoveTUReplacementFiles(<br>
+    "remove-change-desc-files",<br>
+    cl::desc("Remove the change description files regardless of successful\n"<br>
+             "merging/replacing."),<br>
+    cl::init(false));<br>
+<br>
+// Helper object to remove the TUReplacement files (triggered by<br>
+// "remove-change-desc-files" command line option) when exiting current scope.<br>
+class ScopedFileRemover {<br>
+public:<br>
+  ScopedFileRemover(const TUReplacementFiles &Files,<br>
+                    clang::DiagnosticsEngine &Diagnostics)<br>
+      : TURFiles(Files), Diag(Diagnostics) {}<br>
+<br>
+  ~ScopedFileRemover() {<br>
+    deleteReplacementFiles(TURFiles, Diag);<br>
+  }<br>
+<br>
+private:<br>
+  const TUReplacementFiles &TURFiles;<br>
+  clang::DiagnosticsEngine &Diag;<br>
+};<br>
+<br>
+int main(int argc, char **argv) {<br>
+  cl::ParseCommandLineOptions(argc, argv);<br>
+<br>
+  IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());<br>
+  DiagnosticsEngine Diagnostics(<br>
+      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),<br>
+      DiagOpts.getPtr());<br>
+<br>
+  TUReplacements TUs;<br>
+  TUReplacementFiles TURFiles;<br>
+<br>
+  error_code ErrorCode =<br>
+      collectReplacementsFromDirectory(Directory, TUs, TURFiles, Diagnostics);<br>
+<br>
+  if (ErrorCode) {<br>
+    errs() << "Trouble iterating over directory '" << Directory<br>
+           << "': " << ErrorCode.message() << "\n";<br>
+    return false;<br>
+  }<br>
+<br>
+  // Remove the TUReplacementFiles (triggered by "remove-change-desc-files"<br>
+  // command line option) when exiting main().<br>
+  OwningPtr<ScopedFileRemover> Remover;<br>
+  if (RemoveTUReplacementFiles)<br>
+    Remover.reset(new ScopedFileRemover(TURFiles, Diagnostics));<br>
+<br>
+  FileManager Files((FileSystemOptions()));<br>
+  SourceManager SM(Diagnostics, Files);<br>
+<br>
+  FileToReplacementsMap GroupedReplacements;<br>
+  if (!mergeAndDeduplicate(TUs, GroupedReplacements, SM))<br>
+    return 1;<br>
+<br>
+  Rewriter DestRewriter(SM, LangOptions());<br>
+  if (!applyReplacements(GroupedReplacements, DestRewriter)) {<br>
+    errs() << "Failed to apply all replacements. No changes made.\n";<br>
+    return 1;<br>
+  }<br>
+<br>
+  if (!writeFiles(DestRewriter))<br>
+    return 1;<br>
+<br>
+  return 0;<br>
+}<br>
<br>
Added: clang-tools-extra/trunk/clang-apply-replacements/tool/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/Makefile?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-apply-replacements/tool/Makefile?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/clang-apply-replacements/tool/Makefile (added)<br>
+++ clang-tools-extra/trunk/clang-apply-replacements/tool/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,28 @@<br>
+##===- clang-apply-replacements/tool/Makefile --------------*- Makefile -*-===##<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>
+CLANG_LEVEL := ../../../..<br>
+include $(CLANG_LEVEL)/../../Makefile.config<br>
+<br>
+TOOLNAME = clang-apply-replacements<br>
+<br>
+# No plugins, optimize startup time.<br>
+TOOL_NO_EXPORTS = 1<br>
+<br>
+SOURCES = ClangApplyReplacementsMain.cpp<br>
+<br>
+LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser bitreader support mc mcparser option<br>
+USEDLIBS = clangApplyReplacements.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>
+CPP.Flags += -I$(PROJ_SRC_DIR)/../include<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/CMakeLists.txt (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/CMakeLists.txt Tue Sep  3 12:58:19 2013<br>
@@ -1,5 +1,5 @@<br>
 get_filename_component(ClangReplaceLocation<br>
-  "${CMAKE_CURRENT_SOURCE_DIR}/../clang-replace/include" ABSOLUTE)<br>
+  "${CMAKE_CURRENT_SOURCE_DIR}/../clang-apply-replacements/include" ABSOLUTE)<br>
<br>
 include_directories(<br>
   ${CMAKE_CURRENT_SOURCE_DIR}<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=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/FileOverrides.h?rev=189832&r1=189831&r2=189832&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 Sep  3 12:58:19 2013<br>
@@ -17,7 +17,7 @@<br>
 #define CPP11_MIGRATE_FILE_OVERRIDES_H<br>
<br>
 #include "Core/Refactoring.h"<br>
-#include "clang-replace/Tooling/ApplyReplacements.h"<br>
+#include "clang-apply-replacements/Tooling/ApplyReplacements.h"<br>
 #include "clang/Tooling/ReplacementsYaml.h"<br>
 #include "llvm/ADT/StringMap.h"<br>
<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/Core/Makefile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Makefile?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/Core/Makefile?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/Core/Makefile (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/Core/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -11,4 +11,4 @@ LIBRARYNAME := migrateCore<br>
<br>
 include $(CLANG_LEVEL)/Makefile<br>
<br>
-CPP.Flags += -I$(PROJ_SRC_DIR)/.. -I$(PROJ_SRC_DIR)/../../clang-replace/include<br>
+CPP.Flags += -I$(PROJ_SRC_DIR)/.. -I$(PROJ_SRC_DIR)/../../clang-apply-replacements/include<br>
<br>
Modified: clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/tool/CMakeLists.txt Tue Sep  3 12:58:19 2013<br>
@@ -34,7 +34,7 @@ add_dependencies(cpp11-migrate<br>
   )<br>
<br>
 target_link_libraries(cpp11-migrate<br>
-  clangReplace<br>
+  clangApplyReplacements<br>
   migrateCore<br>
   )<br>
<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=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Cpp11Migrate.cpp?rev=189832&r1=189831&r2=189832&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 Sep  3 12:58:19 2013<br>
@@ -28,7 +28,7 @@<br>
 #include "clang/Rewrite/Core/Rewriter.h"<br>
 #include "clang/Tooling/CommonOptionsParser.h"<br>
 #include "clang/Tooling/Tooling.h"<br>
-#include "clang-replace/Tooling/ApplyReplacements.h"<br>
+#include "clang-apply-replacements/Tooling/ApplyReplacements.h"<br>
 #include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/ADT/StringSwitch.h"<br>
 #include "llvm/Support/MemoryBuffer.h"<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=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/cpp11-migrate/tool/Makefile?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/cpp11-migrate/tool/Makefile (original)<br>
+++ clang-tools-extra/trunk/cpp11-migrate/tool/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -36,14 +36,14 @@ 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 clangFormat.a clangReplace.a clangTooling.a clangFrontend.a \<br>
+USEDLIBS = migrateCore.a clangFormat.a clangApplyReplacements.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>
-CPP.Flags += -I$(PROJ_SRC_DIR)/.. -I$(PROJ_SRC_DIR)/../../clang-replace/include<br>
+CPP.Flags += -I$(PROJ_SRC_DIR)/.. -I$(PROJ_SRC_DIR)/../../clang-apply-replacements/include<br>
<br>
 # BUILT_SOURCES gets used as a prereq for many top-level targets. However, at<br>
 # the point those targets are defined, $(ObjDir) hasn't been defined and so the<br>
<br>
Modified: clang-tools-extra/trunk/docs/Doxyfile<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/Doxyfile?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/Doxyfile?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/docs/Doxyfile (original)<br>
+++ clang-tools-extra/trunk/docs/Doxyfile Tue Sep  3 12:58:19 2013<br>
@@ -648,7 +648,7 @@ WARN_LOGFILE           =<br>
 # directories like "/usr/src/myproject". Separate the files or directories<br>
 # with spaces.<br>
<br>
-INPUT                  = ../cpp11-migrate ../clang-replace<br>
+INPUT                  = ../cpp11-migrate ../clang-apply-replacements<br>
<br>
 # This tag can be used to specify the character encoding of the source files<br>
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is<br>
<br>
Modified: clang-tools-extra/trunk/test/CMakeLists.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/CMakeLists.txt?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/CMakeLists.txt (original)<br>
+++ clang-tools-extra/trunk/test/CMakeLists.txt Tue Sep  3 12:58:19 2013<br>
@@ -27,7 +27,7 @@ set(CLANG_TOOLS_TEST_DEPS<br>
   clang clang-headers FileCheck count not<br>
<br>
   # Individual tools we test.<br>
-  remove-cstr-calls clang-replace cpp11-migrate modularize clang-tidy<br>
+  remove-cstr-calls clang-apply-replacements cpp11-migrate modularize clang-tidy<br>
<br>
   # Unit tests<br>
   ExtraToolsUnitTests<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/basic.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/basic.h?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/basic.h?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/basic.h (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/basic.h Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,32 @@<br>
+#ifndef BASIC_H<br>
+#define BASIC_H<br>
+<br>
+<br>
+class Parent {<br>
+public:<br>
+  virtual void func() {}<br>
+};<br>
+<br>
+class Derived : public Parent {<br>
+public:<br>
+  virtual void func() {}<br>
+  // CHECK: virtual void func() override {}<br>
+};<br>
+<br>
+extern void ext(int (&)[5], const Parent &);<br>
+<br>
+void func(int t) {<br>
+  int ints[5];<br>
+  for (unsigned i = 0; i < 5; ++i) {<br>
+    int &e = ints[i];<br>
+    e = t;<br>
+    // CHECK: for (auto & elem : ints) {<br>
+    // CHECK-NEXT: elem = t;<br>
+  }<br>
+<br>
+  Derived d;<br>
+<br>
+  ext(ints, d);<br>
+}<br>
+<br>
+#endif // BASIC_H<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file1.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file1.yaml?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file1.yaml?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file1.yaml (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file1.yaml Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,16 @@<br>
+---<br>
+MainSourceFile:     "source1.cpp"<br>
+Replacements:<br>
+  - FilePath:        "$(path)/basic.h"<br>
+    Offset:          242<br>
+    Length:          26<br>
+    ReplacementText: "auto & elem : ints"<br>
+  - FilePath:        "$(path)/basic.h"<br>
+    Offset:          276<br>
+    Length:          22<br>
+    ReplacementText: ""<br>
+  - FilePath:        "$(path)/basic.h"<br>
+    Offset:          298<br>
+    Length:          1<br>
+    ReplacementText: "elem"<br>
+...<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file2.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file2.yaml?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file2.yaml?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file2.yaml (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/basic/file2.yaml Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,8 @@<br>
+---<br>
+MainSourceFile:     "source2.cpp"<br>
+Replacements:<br>
+  - FilePath:        "$(path)/basic.h"<br>
+    Offset:          148<br>
+    Length:          0<br>
+    ReplacementText: "override "<br>
+...<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/common.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/common.h?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/common.h?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/common.h (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/common.h Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,17 @@<br>
+#ifndef COMMON_H<br>
+#define COMMON_H<br>
+<br>
+extern void ext(int (&)[5]);<br>
+<br>
+void func(int t) {<br>
+  int ints[5];<br>
+  for (unsigned i = 0; i < 5; ++i) {<br>
+    ints[i] = t;<br>
+  }<br>
+<br>
+  int *i = 0;<br>
+<br>
+  ext(ints);<br>
+}<br>
+<br>
+#endif // COMMON_H<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/expected.txt<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/expected.txt?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/expected.txt?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/expected.txt (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/expected.txt Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,11 @@<br>
+There are conflicting changes to $(path)/common.h:<br>
+The following changes conflict:<br>
+  Replace 8:8-8:33 with "auto & i : ints"<br>
+  Replace 8:8-8:33 with "int & elem : ints"<br>
+The following changes conflict:<br>
+  Replace 9:5-9:11 with "elem"<br>
+  Replace 9:5-9:11 with "i"<br>
+The following changes conflict:<br>
+  Remove 12:3-12:14<br>
+  Insert at 12:12 (int*)<br>
+  Replace 12:12-12:12 with "nullptr"<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file1.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file1.yaml?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file1.yaml?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file1.yaml (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file1.yaml Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,16 @@<br>
+---<br>
+MainSourceFile: "source1.cpp"<br>
+Replacements:<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          106<br>
+    Length:          26<br>
+    ReplacementText: "auto & i : ints"<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          140<br>
+    Length:          7<br>
+    ReplacementText: "i"<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          160<br>
+    Length:          12<br>
+    ReplacementText: ""<br>
+...<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file2.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file2.yaml?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file2.yaml?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file2.yaml (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file2.yaml Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,16 @@<br>
+---<br>
+MainSourceFile: "source2.cpp"<br>
+Replacements:<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          106<br>
+    Length:          26<br>
+    ReplacementText: "int & elem : ints"<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          140<br>
+    Length:          7<br>
+    ReplacementText: "elem"<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          169<br>
+    Length:          1<br>
+    ReplacementText: "nullptr"<br>
+...<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file3.yaml<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file3.yaml?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file3.yaml?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file3.yaml (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/Inputs/conflict/file3.yaml Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,8 @@<br>
+---<br>
+MainSourceFile: "source1.cpp"<br>
+Replacements:<br>
+  - FilePath:        "$(path)/common.h"<br>
+    Offset:          169<br>
+    Length:          0<br>
+    ReplacementText: "(int*)"<br>
+...<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/basic.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/basic.cpp?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/basic.cpp?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/basic.cpp (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/basic.cpp Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,17 @@<br>
+// RUN: mkdir -p %T/Inputs/basic<br>
+// RUN: grep -Ev "// *[A-Z-]+:" %S/Inputs/basic/basic.h > %T/Inputs/basic/basic.h<br>
+// RUN: sed "s#\$(path)#%/T/Inputs/basic#" %S/Inputs/basic/file1.yaml > %T/Inputs/basic/file1.yaml<br>
+// RUN: sed "s#\$(path)#%/T/Inputs/basic#" %S/Inputs/basic/file2.yaml > %T/Inputs/basic/file2.yaml<br>
+// RUN: clang-apply-replacements %T/Inputs/basic<br>
+// RUN: FileCheck -input-file=%T/Inputs/basic/basic.h %S/Inputs/basic/basic.h<br>
+//<br>
+// Check that the yaml files are *not* deleted after running clang-apply-replacements without remove-change-desc-files.<br>
+// RUN: ls -1 %T/Inputs/basic | FileCheck %s --check-prefix=YAML<br>
+//<br>
+// Check that the yaml files *are* deleted after running clang-apply-replacements with remove-change-desc-files.<br>
+// RUN: grep -Ev "// *[A-Z-]+:" %S/Inputs/basic/basic.h > %T/Inputs/basic/basic.h<br>
+// RUN: clang-apply-replacements -remove-change-desc-files %T/Inputs/basic<br>
+// RUN: ls -1 %T/Inputs/basic | FileCheck %s --check-prefix=NO_YAML<br>
+//<br>
+// YAML: {{^file.\.yaml$}}<br>
+// NO_YAML-NOT: {{^file.\.yaml$}}<br>
<br>
Added: clang-tools-extra/trunk/test/clang-apply-replacements/conflict.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/conflict.cpp?rev=189832&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-apply-replacements/conflict.cpp?rev=189832&view=auto</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/test/clang-apply-replacements/conflict.cpp (added)<br>
+++ clang-tools-extra/trunk/test/clang-apply-replacements/conflict.cpp Tue Sep  3 12:58:19 2013<br>
@@ -0,0 +1,17 @@<br>
+// RUN: mkdir -p %T/Inputs/conflict<br>
+// RUN: sed "s#\$(path)#%/S/Inputs/conflict#" %S/Inputs/conflict/file1.yaml > %T/Inputs/conflict/file1.yaml<br>
+// RUN: sed "s#\$(path)#%/S/Inputs/conflict#" %S/Inputs/conflict/file2.yaml > %T/Inputs/conflict/file2.yaml<br>
+// RUN: sed "s#\$(path)#%/S/Inputs/conflict#" %S/Inputs/conflict/file3.yaml > %T/Inputs/conflict/file3.yaml<br>
+// RUN: sed "s#\$(path)#%/S/Inputs/conflict#" %S/Inputs/conflict/expected.txt > %T/Inputs/conflict/expected.txt<br>
+// RUN: not clang-apply-replacements %T/Inputs/conflict > %T/Inputs/conflict/output.txt 2>&1<br>
+// RUN: diff -b %T/Inputs/conflict/output.txt %T/Inputs/conflict/expected.txt<br>
+//<br>
+// Check that the yaml files are *not* deleted after running clang-apply-replacements without remove-change-desc-files even when there is a failure.<br>
+// RUN: ls -1 %T/Inputs/conflict | FileCheck %s --check-prefix=YAML<br>
+//<br>
+// Check that the yaml files *are* deleted after running clang-apply-replacements with remove-change-desc-files even when there is a failure.<br>
+// RUN: not clang-apply-replacements %T/Inputs/conflict -remove-change-desc-files > %T/Inputs/conflict/output.txt 2>&1<br>
+// RUN: ls -1 %T/Inputs/conflict | FileCheck %s --check-prefix=NO_YAML<br>
+//<br>
+// YAML: {{^file.\.yaml$}}<br>
+// NO_YAML-NOT: {{^file.\.yaml$}}<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=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/CMakeLists.txt?rev=189832&r1=189831&r2=189832&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 Sep  3 12:58:19 2013<br>
@@ -5,7 +5,7 @@ set(LLVM_LINK_COMPONENTS<br>
 get_filename_component(CPP11_MIGRATE_SOURCE_DIR<br>
   ${CMAKE_CURRENT_SOURCE_DIR}/../../cpp11-migrate REALPATH)<br>
 get_filename_component(ClangReplaceLocation<br>
-  "${CMAKE_CURRENT_SOURCE_DIR}/../../clang-replace/include" REALPATH)<br>
+  "${CMAKE_CURRENT_SOURCE_DIR}/../../clang-apply-replacements/include" REALPATH)<br>
 include_directories(<br>
   ${CPP11_MIGRATE_SOURCE_DIR}<br>
   ${ClangReplaceLocation}<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=189832&r1=189831&r2=189832&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile?rev=189832&r1=189831&r2=189832&view=diff</a><br>

==============================================================================<br>
--- clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile (original)<br>
+++ clang-tools-extra/trunk/unittests/cpp11-migrate/Makefile Tue Sep  3 12:58:19 2013<br>
@@ -13,7 +13,7 @@ include $(CLANG_LEVEL)/../../Makefile.co<br>
 TESTNAME = Cpp11MigrateTests<br>
 LINK_COMPONENTS := asmparser bitreader support MC MCParser option \<br>
                TransformUtils<br>
-USEDLIBS = migrateCore.a clangFormat.a clangReplace.a clangTooling.a clangFrontend.a \<br>
+USEDLIBS = migrateCore.a clangFormat.a clangApplyReplacements.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>
@@ -21,5 +21,5 @@ USEDLIBS = migrateCore.a clangFormat.a c<br>
<br>
 include $(CLANG_LEVEL)/Makefile<br>
 MAKEFILE_UNITTEST_NO_INCLUDE_COMMON := 1<br>
-CPP.Flags += -I$(PROJ_SRC_DIR)/../../cpp11-migrate -I$(PROJ_SRC_DIR)/../../clang-replace/include<br>
+CPP.Flags += -I$(PROJ_SRC_DIR)/../../cpp11-migrate -I$(PROJ_SRC_DIR)/../../clang-apply-replacements/include<br>
 include $(LLVM_SRC_ROOT)/unittests/Makefile.unittest<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>