aboutsummaryrefslogtreecommitdiff
path: root/lib/Format/Format.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Format/Format.cpp')
-rw-r--r--lib/Format/Format.cpp22
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp
index 60b2f56745..8ea95c4862 100644
--- a/lib/Format/Format.cpp
+++ b/lib/Format/Format.cpp
@@ -434,9 +434,21 @@ private:
/// each \c FormatToken.
void replaceWhitespace(const FormatToken &Tok, unsigned NewLines,
unsigned Spaces) {
+ std::string NewLineText;
+ if (!Line.InPPDirective) {
+ NewLineText = std::string(NewLines, '\n');
+ } else if (NewLines > 0) {
+ unsigned Offset =
+ SourceMgr.getSpellingColumnNumber(Tok.WhiteSpaceStart) - 1;
+ for (unsigned i = 0; i < NewLines; ++i) {
+ NewLineText += std::string(Style.ColumnLimit - Offset - 1, ' ');
+ NewLineText += "\\\n";
+ Offset = 0;
+ }
+ }
Replaces.insert(tooling::Replacement(
SourceMgr, Tok.WhiteSpaceStart, Tok.WhiteSpaceLength,
- std::string(NewLines, '\n') + std::string(Spaces, ' ')));
+ NewLineText + std::string(Spaces, ' ')));
}
/// \brief Add a new line and the required indent before the first Token
@@ -634,6 +646,9 @@ public:
next();
if (Index >= Tokens.size())
return;
+ // It is the responsibility of the UnwrappedLineParser to make sure
+ // this sequence is not produced inside an unwrapped line.
+ assert(Tokens[Index].Tok.getIdentifierInfo() != NULL);
switch (Tokens[Index].Tok.getIdentifierInfo()->getPPKeywordID()) {
case tok::pp_include:
case tok::pp_import:
@@ -969,7 +984,10 @@ public:
// Consume and record whitespace until we find a significant token.
while (FormatTok.Tok.is(tok::unknown)) {
- FormatTok.NewlinesBefore += tokenText(FormatTok.Tok).count('\n');
+ StringRef Text = tokenText(FormatTok.Tok);
+ FormatTok.NewlinesBefore += Text.count('\n');
+ FormatTok.HasUnescapedNewline =
+ Text.count("\\\n") != FormatTok.NewlinesBefore;
FormatTok.WhiteSpaceLength += FormatTok.Tok.getLength();
if (FormatTok.Tok.is(tok::eof))