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