<div dir="ltr">Thanks Adrian!<div><br></div><div>I tried turning <span style="color:rgb(33,33,33)">LLVM_ENABLE_LOCAL_SUBMODULE_</span><span style="color:rgb(33,33,33)">VISIBILITY</span> off but couldn't reproduce the cycle on my local machine. Could you take a look at my patch <a href="https://reviews.llvm.org/D30777">https://reviews.llvm.org/D30777</a>? It includes clangFormat header from clangToolingRefactor, and I couldn't see how the cycle was formed on the GreenDragon bot (<span style="background-color:rgb(255,0,0);color:rgb(255,255,255);font-family:monospace;font-size:10.5625px;white-space:pre-wrap">Clang_Tooling -> Clang_Format -> Clang_Tooling</span>). Thanks!</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Mar 30, 2017 at 8:49 PM Adrian Prantl <<a href="mailto:aprantl@apple.com">aprantl@apple.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="gmail_msg">Note that the green dragon bot doesn't use local submodule visibility, so every #include pulls in the entire clang module that header belongs to. Does this explain what you are seeing? (You should be able to reproduce with cmake -DLLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY=0)</div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">-- adrian</div></div><div style="word-wrap:break-word" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"><div class="gmail_msg"><blockquote type="cite" class="gmail_msg"><div class="gmail_msg">On Mar 30, 2017, at 11:44 AM, Juergen Ributzka <<a href="mailto:juergen@ributzka.de" class="gmail_msg" target="_blank">juergen@ributzka.de</a>> wrote:</div><br class="m_-1291460072575138510Apple-interchange-newline gmail_msg"><div class="gmail_msg"><div dir="ltr" class="gmail_msg">[+ Adrian]<div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">Adrian knows more about the bot setup.</div></div><div class="gmail_extra gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg">On Wed, Mar 29, 2017 at 8:04 AM, Eric Liu <span dir="ltr" class="gmail_msg"><<a href="mailto:ioeric@google.com" class="gmail_msg" target="_blank">ioeric@google.com</a>></span> wrote:<br class="gmail_msg"><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">Hi Juergen, thanks for taking care of this, but I'm wondering if this build bot is using a different set of build rules? The error message says "<span style="color:rgb(255,255,255);font-family:monospace;white-space:pre-wrap;background-color:rgb(255,0,0)" class="gmail_msg">Clang_Tooling -> Clang_Format -> Clang_Tooling</span>"; however, the actual dependency is clangToolingRefactor -> clangFormat -> clangToolingCore, which seems fine for me. I guess the module build uses build rules with lower granularity. <span class="m_-1291460072575138510HOEnZb gmail_msg"><font color="#888888" class="gmail_msg"><div class="gmail_msg"><br class="gmail_msg"></div><div class="gmail_msg">- Eric</div></font></span></div><div class="m_-1291460072575138510HOEnZb gmail_msg"><div class="m_-1291460072575138510h5 gmail_msg"><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Wed, Mar 29, 2017 at 2:39 AM Juergen Ributzka <<a href="mailto:juergen@ributzka.de" class="gmail_msg" target="_blank">juergen@ributzka.de</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">I reverted the commit in r298967. Please fix the cyclic dependency issue found here:<div class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"><a href="http://lab.llvm.org:8080/green/job/clang-stage2-cmake-modulesRDA_build/4776/" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">http://lab.llvm.org:8080/green/job/clang-stage2-cmake-modulesRDA_build/4776/</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"></div><div class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"></div><div class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">Cheers,</div><div class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">Juergen</div></div><div class="gmail_extra m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"><div class="gmail_quote m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">On Tue, Mar 28, 2017 at 6:05 AM, Eric Liu via cfe-commits <span dir="ltr" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"><<a href="mailto:cfe-commits@lists.llvm.org" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"><blockquote class="gmail_quote m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ioeric<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Date: Tue Mar 28 08:05:32 2017<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
New Revision: 298913<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=298913&view=rev" rel="noreferrer" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=298913&view=rev</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Log:<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Added `applyAtomicChanges` function.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Summary: ... which applies a set of `AtomicChange`s on code.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Reviewers: klimek, djasper<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Reviewed By: djasper<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Subscribers: cfe-commits<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D30777" rel="noreferrer" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">https://reviews.llvm.org/D30777</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Modified:<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
    cfe/trunk/include/clang/Tooling/Refactoring/AtomicChange.h<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
    cfe/trunk/lib/Tooling/Refactoring/AtomicChange.cpp<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
    cfe/trunk/unittests/Tooling/RefactoringTest.cpp<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Modified: cfe/trunk/include/clang/Tooling/Refactoring/AtomicChange.h<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/Refactoring/AtomicChange.h?rev=298913&r1=298912&r2=298913&view=diff" rel="noreferrer" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Tooling/Refactoring/AtomicChange.h?rev=298913&r1=298912&r2=298913&view=diff</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
==============================================================================<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
--- cfe/trunk/include/clang/Tooling/Refactoring/AtomicChange.h (original)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+++ cfe/trunk/include/clang/Tooling/Refactoring/AtomicChange.h Tue Mar 28 08:05:32 2017<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
@@ -16,6 +16,7 @@<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 #define LLVM_CLANG_TOOLING_REFACTOR_ATOMICCHANGE_H<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 #include "clang/Basic/SourceManager.h"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "clang/Format/Format.h"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 #include "clang/Tooling/Core/Replacement.h"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 #include "llvm/ADT/StringRef.h"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 #include "llvm/Support/Error.h"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
@@ -123,6 +124,39 @@ private:<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
   tooling::Replacements Replaces;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 };<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+// Defines specs for applying changes.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+struct ApplyChangesSpec {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // If true, cleans up redundant/erroneous code around changed code with<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // clang-format's cleanup functionality, e.g. redundant commas around deleted<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // parameter or empty namespaces introduced by deletions.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  bool Cleanup = true;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  format::FormatStyle Style = format::getNoStyle();<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // Options for selectively formatting changes with clang-format:<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // kAll: Format all changed lines.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // kNone: Don't format anything.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // kViolations: Format lines exceeding the `ColumnLimit` in `Style`.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  enum FormatOption { kAll, kNone, kViolations };<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  FormatOption Format = kNone;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+};<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// \brief Applies all AtomicChanges in \p Changes to the \p Code.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+///<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// This completely ignores the file path in each change and replaces them with<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// \p FilePath, i.e. callers are responsible for ensuring all changes are for<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// the same file.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+///<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// \returns The changed code if all changes are applied successfully;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// otherwise, an llvm::Error carrying llvm::StringError is returned (the Error<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// message can be converted to string with `llvm::toString()` and the<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+/// error_code should be ignored).<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+llvm::Expected<std::string><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+applyAtomicChanges(llvm::StringRef FilePath, llvm::StringRef Code,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                   llvm::ArrayRef<AtomicChange> Changes,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                   const ApplyChangesSpec &Spec);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 } // end namespace tooling<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 } // end namespace clang<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Modified: cfe/trunk/lib/Tooling/Refactoring/AtomicChange.cpp<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Refactoring/AtomicChange.cpp?rev=298913&r1=298912&r2=298913&view=diff" rel="noreferrer" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Refactoring/AtomicChange.cpp?rev=298913&r1=298912&r2=298913&view=diff</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
==============================================================================<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
--- cfe/trunk/lib/Tooling/Refactoring/AtomicChange.cpp (original)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+++ cfe/trunk/lib/Tooling/Refactoring/AtomicChange.cpp Tue Mar 28 08:05:32 2017<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
@@ -84,6 +84,116 @@ template <> struct MappingTraits<clang::<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 namespace clang {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 namespace tooling {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+namespace {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+// Returns true if there is any line that violates \p ColumnLimit in range<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+// [Start, End].<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+bool violatesColumnLimit(llvm::StringRef Code, unsigned ColumnLimit,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                         unsigned Start, unsigned End) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto StartPos = Code.rfind('\n', Start);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  StartPos = (StartPos == llvm::StringRef::npos) ? 0 : StartPos + 1;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto EndPos = Code.find("\n", End);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (EndPos == llvm::StringRef::npos)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    EndPos = Code.size();<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  llvm::SmallVector<llvm::StringRef, 8> Lines;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Code.substr(StartPos, EndPos - StartPos).split(Lines, '\n');<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  for (llvm::StringRef Line : Lines)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (Line.size() > ColumnLimit)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      return true;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  return false;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+std::vector<Range><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+getRangesForFormating(llvm::StringRef Code, unsigned ColumnLimit,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                      ApplyChangesSpec::FormatOption Format,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                      const clang::tooling::Replacements &Replaces) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // kNone suppresses formatting entirely.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (Format == ApplyChangesSpec::kNone)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return {};<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  std::vector<clang::tooling::Range> Ranges;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // This works assuming that replacements are ordered by offset.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // FIXME: use `getAffectedRanges()` to calculate when it does not include '\n'<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // at the end of an insertion in affected ranges.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  int Offset = 0;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  for (const clang::tooling::Replacement &R : Replaces) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    int Start = R.getOffset() + Offset;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    int End = Start + R.getReplacementText().size();<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (!R.getReplacementText().empty() &&<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        R.getReplacementText().back() == '\n' && R.getLength() == 0 &&<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        R.getOffset() > 0 && R.getOffset() <= Code.size() &&<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        Code[R.getOffset() - 1] == '\n')<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      // If we are inserting at the start of a line and the replacement ends in<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      // a newline, we don't need to format the subsequent line.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      --End;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    Offset += R.getReplacementText().size() - R.getLength();<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (Format == ApplyChangesSpec::kAll ||<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        violatesColumnLimit(Code, ColumnLimit, Start, End))<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      Ranges.emplace_back(Start, End - Start);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  return Ranges;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+inline llvm::Error make_string_error(const llvm::Twine &Message) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  return llvm::make_error<llvm::StringError>(Message,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                             llvm::inconvertibleErrorCode());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+// Creates replacements for inserting/deleting #include headers.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+llvm::Expected<Replacements><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+createReplacementsForHeaders(llvm::StringRef FilePath, llvm::StringRef Code,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                             llvm::ArrayRef<AtomicChange> Changes,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                             const format::FormatStyle &Style) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // Create header insertion/deletion replacements to be cleaned up<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // (i.e. converted to real insertion/deletion replacements).<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Replacements HeaderReplacements;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  for (const auto &Change : Changes) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    for (llvm::StringRef Header : Change.getInsertedHeaders()) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      std::string EscapedHeader =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          Header.startswith("<") || Header.startswith("\"")<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+              ? Header.str()<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+              : ("\"" + Header + "\"").str();<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      std::string ReplacementText = "#include " + EscapedHeader;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      // Offset UINT_MAX and length 0 indicate that the replacement is a header<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      // insertion.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      llvm::Error Err = HeaderReplacements.add(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          tooling::Replacement(FilePath, UINT_MAX, 0, ReplacementText));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      if (Err)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        return std::move(Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    for (const std::string &Header : Change.getRemovedHeaders()) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      // Offset UINT_MAX and length 1 indicate that the replacement is a header<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      // deletion.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      llvm::Error Err =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          HeaderReplacements.add(Replacement(FilePath, UINT_MAX, 1, Header));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      if (Err)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        return std::move(Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // cleanupAroundReplacements() converts header insertions/deletions into<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // actual replacements that add/remove headers at the right location.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  return clang::format::cleanupAroundReplacements(Code, HeaderReplacements,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                  Style);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+// Combine replacements in all Changes as a `Replacements`. This ignores the<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+// file path in all replacements and replaces them with \p FilePath.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+llvm::Expected<Replacements><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+combineReplacementsInChanges(llvm::StringRef FilePath,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                             llvm::ArrayRef<AtomicChange> Changes) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Replacements Replaces;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  for (const auto &Change : Changes)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    for (const auto &R : Change.getReplacements())<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      if (auto Err = Replaces.add(Replacement(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+              FilePath, R.getOffset(), R.getLength(), R.getReplacementText())))<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        return std::move(Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  return Replaces;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+} // end namespace<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 AtomicChange::AtomicChange(const SourceManager &SM,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
                            SourceLocation KeyPosition) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
@@ -168,5 +278,74 @@ void AtomicChange::removeHeader(llvm::St<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
   RemovedHeaders.push_back(Header);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+llvm::Expected<std::string><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+applyAtomicChanges(llvm::StringRef FilePath, llvm::StringRef Code,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                   llvm::ArrayRef<AtomicChange> Changes,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                   const ApplyChangesSpec &Spec) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  llvm::Expected<Replacements> HeaderReplacements =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      createReplacementsForHeaders(FilePath, Code, Changes, Spec.Style);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (!HeaderReplacements)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return make_string_error(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        "Failed to create replacements for header changes: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        llvm::toString(HeaderReplacements.takeError()));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  llvm::Expected<Replacements> Replaces =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      combineReplacementsInChanges(FilePath, Changes);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (!Replaces)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return make_string_error("Failed to combine replacements in all changes: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                             llvm::toString(Replaces.takeError()));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Replacements AllReplaces = std::move(*Replaces);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  for (const auto &R : *HeaderReplacements) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    llvm::Error Err = AllReplaces.add(R);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (Err)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      return make_string_error(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          "Failed to combine existing replacements with header replacements: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          llvm::toString(std::move(Err)));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (Spec.Cleanup) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    llvm::Expected<Replacements> CleanReplaces =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        format::cleanupAroundReplacements(Code, AllReplaces, Spec.Style);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (!CleanReplaces)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      return make_string_error("Failed to cleanup around replacements: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                               llvm::toString(CleanReplaces.takeError()));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    AllReplaces = std::move(*CleanReplaces);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // Apply all replacements.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  llvm::Expected<std::string> ChangedCode =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      applyAllReplacements(Code, AllReplaces);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (!ChangedCode)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return make_string_error("Failed to apply all replacements: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                             llvm::toString(ChangedCode.takeError()));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // Sort inserted headers. This is done even if other formatting is turned off<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // as incorrectly sorted headers are always just wrong, it's not a matter of<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // taste.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Replacements HeaderSortingReplacements = format::sortIncludes(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      Spec.Style, *ChangedCode, AllReplaces.getAffectedRanges(), FilePath);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ChangedCode = applyAllReplacements(*ChangedCode, HeaderSortingReplacements);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (!ChangedCode)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return make_string_error(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        "Failed to apply replacements for sorting includes: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        llvm::toString(ChangedCode.takeError()));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  AllReplaces = AllReplaces.merge(HeaderSortingReplacements);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  std::vector<Range> FormatRanges = getRangesForFormating(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      *ChangedCode, Spec.Style.ColumnLimit, Spec.Format, AllReplaces);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  if (!FormatRanges.empty()) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    Replacements FormatReplacements =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        format::reformat(Spec.Style, *ChangedCode, FormatRanges, FilePath);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    ChangedCode = applyAllReplacements(*ChangedCode, FormatReplacements);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (!ChangedCode)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      return make_string_error(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          "Failed to apply replacements for formatting changed code: " +<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+          llvm::toString(ChangedCode.takeError()));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  return ChangedCode;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 } // end namespace tooling<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 } // end namespace clang<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
Modified: cfe/trunk/unittests/Tooling/RefactoringTest.cpp<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/RefactoringTest.cpp?rev=298913&r1=298912&r2=298913&view=diff" rel="noreferrer" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/RefactoringTest.cpp?rev=298913&r1=298912&r2=298913&view=diff</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
==============================================================================<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
--- cfe/trunk/unittests/Tooling/RefactoringTest.cpp (original)<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+++ cfe/trunk/unittests/Tooling/RefactoringTest.cpp Tue Mar 28 08:05:32 2017<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
@@ -1290,5 +1290,435 @@ TEST_F(AtomicChangeTest, InsertAfterWith<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
       Replacement(Context.Sources, SourceLocation(), 0, "b")));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+class ApplyAtomicChangesTest : public ::testing::Test {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+protected:<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ApplyAtomicChangesTest() : FilePath("<a href="http://file.cc" class="gmail_msg" target="_blank">file.cc</a>") {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    Spec.Cleanup = true;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    Spec.Format = ApplyChangesSpec::kAll;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    Spec.Style = format::getLLVMStyle();<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ~ApplyAtomicChangesTest() override {}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  void setInput(llvm::StringRef Input) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    Code = Input;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    FID = Context.createInMemoryFile(FilePath, Code);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  SourceLocation getLoc(unsigned Offset) const {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return Context.Sources.getLocForStartOfFile(FID).getLocWithOffset(Offset);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  AtomicChange replacementToAtomicChange(llvm::StringRef Key, unsigned Offset,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                         unsigned Length,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                         llvm::StringRef Text) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    AtomicChange Change(FilePath, Key);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    llvm::Error Err =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        Change.replace(Context.Sources, getLoc(Offset), Length, Text);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    EXPECT_FALSE(Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return Change;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  std::string rewrite(bool FailureExpected = false) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    llvm::Expected<std::string> ChangedCode =<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+        applyAtomicChanges(FilePath, Code, Changes, Spec);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    EXPECT_EQ(FailureExpected, !ChangedCode);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    if (!ChangedCode) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      llvm::errs() << "Failed to apply changes: "<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                   << llvm::toString(ChangedCode.takeError()) << "\n";<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      return "";<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+    return *ChangedCode;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  }<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  RewriterTestContext Context;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  FileID FID;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ApplyChangesSpec Spec;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  std::string Code;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  std::string FilePath;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  llvm::SmallVector<AtomicChange, 8> Changes;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+};<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, BasicRefactoring) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  AtomicChange Change(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 4, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int b;", rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, SeveralRefactorings) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int b;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 3, "float"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 4, 1, "f"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key3", 11, 1, "g"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key4", 7, 3, "float"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("float f;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "float g;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, IgnorePathsInRefactorings) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int b;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 4, 1, "aa"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  FileID ID = Context.createInMemoryFile("AnotherFile", "12345678912345");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back("AnotherFile", "key2");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto Err = Changes.back().replace(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      Context.Sources,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      Context.Sources.getLocForStartOfFile(ID).getLocWithOffset(11), 1, "bb");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int aa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int bb;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, AppliesDuplicateInsertions) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 5, 0, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 5, 0, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int abb;", rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, BailsOnOverlappingRefactorings) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 5, "float f"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 4, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("", rewrite(/*FailureExpected=*/true));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, BasicReformatting) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 5, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int b;", rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, OnlyFormatWhenViolateColumnLimits) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Format = ApplyChangesSpec::kViolations;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Style.ColumnLimit = 8;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int    a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  aaaaaaaa;\n");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 5, 1, "x"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 15, 1, "x"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key3", 23, 8, "xx"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int  x;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int x;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  xx;\n",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, LastLineViolateColumnLimits) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Format = ApplyChangesSpec::kViolations;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Style.ColumnLimit = 8;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int    a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 1, "i"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 15, 2, "y;"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int y;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, LastLineWithNewlineViolateColumnLimits) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Format = ApplyChangesSpec::kViolations;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Style.ColumnLimit = 8;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int   a;\n");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 1, "i"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 14, 3, "y;\n"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int   y;\n",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, Longer) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 5, 1, "bbb"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int bbb;", rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, Shorter) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  aaa;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 5, 3, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int b;", rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, OnlyFormatChangedLines) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int a = b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  bbb;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 14, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int  aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int b = b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  bbb;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, DisableFormatting) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Format = ApplyChangesSpec::kNone;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int  aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int a   = b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  bbb;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 14, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int  aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int b   = b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  bbb;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, AdaptsToLocalPointerStyle) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int *aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int *bbb;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 0, "int* ccc;\n"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int *ccc;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int *aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int *bbb;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, AcceptsSurroundingFormatting) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("   int  aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "   int a = b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "   int  bbb;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 20, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("   int  aaa;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "   int b = b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "   int  bbb;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, BailsOutOnConflictingChanges) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int c;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int f;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  // Insertions at the same offset are only allowed in the same AtomicChange.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 0, "int a;\n"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key2", 0, 0, "int b;\n"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("", rewrite(/*FailureExpected=*/true));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, InsertsNewIncludesInRightOrder) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("b");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("c");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key2");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("a");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("#include \"a\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"b\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"c\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int a;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, RemoveAndSortIncludes) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput(R"(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "a"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "b"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "c"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+int a;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      )");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().removeHeader("b");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ(R"(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "a"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "c"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+int a;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      )",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, InsertsSystemIncludes) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("#include <asys>\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "#include <csys>\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "#include \"a\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "#include \"c\"\n");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("<asys>"); // Already exists.<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("<b>");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("<d>");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("\"b-already-escaped\"");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("#include <asys>\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include <b>\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include <csys>\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include <d>\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"a\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"b-already-escaped\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"c\"\n",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, RemoveSystemIncludes) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput(R"(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include <a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include <b><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "c"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+int a;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      )");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().removeHeader("<a>");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ(R"(<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include <b><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+#include "c"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+int a;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+      )",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest,<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+       DoNotFormatFollowingLinesIfSeparatedWithNewline) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("#ifndef __H__\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "#define __H__\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "#include \"b\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "#endif // __H__\n");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                              llvm::StringRef("#ifndef __H__\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                              "#define __H__\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                              "\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                              "#include \"b\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                              "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                              "int  ")<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                                  .size(),<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+                                              1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().addHeader("a");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("#ifndef __H__\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#define __H__\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"a\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#include \"b\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "#endif // __H__\n",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, FormatsCorrectLineWhenHeaderIsRemoved) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("#include \"a\"\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int  a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 27, 1, "b"));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.back().removeHeader("a");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int  a;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, CleansUpCtorInitializers) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("A::A() : a(), b() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "A::A() : a(), b() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "A::A() : a(), b() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "A::A() : a()/**/, b() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "A::A() : a()  ,// \n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "   /**/    b()    {}");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto Err = Changes.back().replace(Context.Sources, getLoc(9), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(35), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(51), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(56), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(72), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(97), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(118), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("A::A() : b() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "A::A() : a() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "A::A() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "A::A() : b() {}\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "A::A() {}",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, CleansUpParameterLists) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("void f(int i, float f, string s);\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "f(1, 2.0f, \"a\");\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "g(1, 1);");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto Err = Changes.back().replace(Context.Sources, getLoc(7), 5, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(23), 8, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(36), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(45), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(53), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(56), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("void f(float f);\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "f(2.0f);\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "g();",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, DisableCleanup) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Spec.Cleanup = false;<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("void f(int i, float f, string s);\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "f(1, 2.0f, \"a\");\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "g(1, 1);");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto Err = Changes.back().replace(Context.Sources, getLoc(7), 5, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(23), 8, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(36), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(45), 3, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(53), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(56), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("void f(, float f, );\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "f(, 2.0f, );\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "g(, );",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, EverythingDeleted) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.push_back(replacementToAtomicChange("key1", 0, 6, ""));<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("", rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+TEST_F(ApplyAtomicChangesTest, DoesNotDeleteInserts) {<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  setInput("int a;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+           "int b;");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Changes.emplace_back(FilePath, "key1");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  auto Err = Changes.back().replace(Context.Sources, getLoc(4), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(4), 0, "b");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(11), 0, "a");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  Err = Changes.back().replace(Context.Sources, getLoc(11), 1, "");<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  ASSERT_TRUE(!Err);<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+  EXPECT_EQ("int b;\n"<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            "int a;",<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+            rewrite());<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+}<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
+<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 } // end namespace tooling<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
 } // end namespace clang<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
_______________________________________________<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
cfe-commits mailing list<br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<a href="mailto:cfe-commits@lists.llvm.org" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg">
</blockquote></div><br class="m_-1291460072575138510m_-8004688797525035726gmail_msg gmail_msg"></div>
</blockquote></div>
</div></div></blockquote></div><br class="gmail_msg"></div>
</div></blockquote></div><br class="gmail_msg"></div></div></blockquote></div>