summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Pan <owenpiano@gmail.com>2019-04-23 20:29:46 +0000
committerOwen Pan <owenpiano@gmail.com>2019-04-23 20:29:46 +0000
commit108cbbc262ff99c406fb3dfefdf822445c295c0d (patch)
treeed41aeb18ba07f5c843d29adab4651e7ac4f31e9
parentacbf0058e93d3a8f95ea3ace586f99320ce1c425 (diff)
downloadbcm5719-llvm-108cbbc262ff99c406fb3dfefdf822445c295c0d.tar.gz
bcm5719-llvm-108cbbc262ff99c406fb3dfefdf822445c295c0d.zip
[clang-format] Fix bug in reflow of block comments containing CR/LF
Fix PR36119 Differential Revision: https://reviews.llvm.org/D60996 llvm-svn: 359029
-rw-r--r--clang/lib/Format/BreakableToken.cpp7
-rw-r--r--clang/lib/Format/BreakableToken.h2
-rw-r--r--clang/lib/Format/ContinuationIndenter.cpp2
-rw-r--r--clang/lib/Format/WhitespaceManager.h2
-rw-r--r--clang/unittests/Format/FormatTest.cpp6
5 files changed, 14 insertions, 5 deletions
diff --git a/clang/lib/Format/BreakableToken.cpp b/clang/lib/Format/BreakableToken.cpp
index ec197aa541a..5172c97f8af 100644
--- a/clang/lib/Format/BreakableToken.cpp
+++ b/clang/lib/Format/BreakableToken.cpp
@@ -329,7 +329,7 @@ static bool mayReflowContent(StringRef Content) {
BreakableBlockComment::BreakableBlockComment(
const FormatToken &Token, unsigned StartColumn,
unsigned OriginalStartColumn, bool FirstInLine, bool InPPDirective,
- encoding::Encoding Encoding, const FormatStyle &Style)
+ encoding::Encoding Encoding, const FormatStyle &Style, bool UseCRLF)
: BreakableComment(Token, StartColumn, InPPDirective, Encoding, Style),
DelimitersOnNewline(false),
UnbreakableTailLength(Token.UnbreakableTailLength) {
@@ -338,7 +338,8 @@ BreakableBlockComment::BreakableBlockComment(
StringRef TokenText(Tok.TokenText);
assert(TokenText.startswith("/*") && TokenText.endswith("*/"));
- TokenText.substr(2, TokenText.size() - 4).split(Lines, "\n");
+ TokenText.substr(2, TokenText.size() - 4).split(Lines,
+ UseCRLF ? "\r\n" : "\n");
int IndentDelta = StartColumn - OriginalStartColumn;
Content.resize(Lines.size());
@@ -472,7 +473,7 @@ void BreakableBlockComment::adjustWhitespace(unsigned LineIndex,
// Calculate the start of the non-whitespace text in the current line.
size_t StartOfLine = Lines[LineIndex].find_first_not_of(Blanks);
if (StartOfLine == StringRef::npos)
- StartOfLine = Lines[LineIndex].rtrim("\r\n").size();
+ StartOfLine = Lines[LineIndex].size();
StringRef Whitespace = Lines[LineIndex].substr(0, StartOfLine);
// Adjust Lines to only contain relevant text.
diff --git a/clang/lib/Format/BreakableToken.h b/clang/lib/Format/BreakableToken.h
index 5fab3f2f114..dba763c6ad1 100644
--- a/clang/lib/Format/BreakableToken.h
+++ b/clang/lib/Format/BreakableToken.h
@@ -359,7 +359,7 @@ public:
BreakableBlockComment(const FormatToken &Token, unsigned StartColumn,
unsigned OriginalStartColumn, bool FirstInLine,
bool InPPDirective, encoding::Encoding Encoding,
- const FormatStyle &Style);
+ const FormatStyle &Style, bool UseCRLF);
unsigned getRangeLength(unsigned LineIndex, unsigned Offset,
StringRef::size_type Length,
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp
index 01665cd5de3..b04ede6fa93 100644
--- a/clang/lib/Format/ContinuationIndenter.cpp
+++ b/clang/lib/Format/ContinuationIndenter.cpp
@@ -1810,7 +1810,7 @@ ContinuationIndenter::createBreakableToken(const FormatToken &Current,
}
return llvm::make_unique<BreakableBlockComment>(
Current, StartColumn, Current.OriginalColumn, !Current.Previous,
- State.Line->InPPDirective, Encoding, Style);
+ State.Line->InPPDirective, Encoding, Style, Whitespaces.useCRLF());
} else if (Current.is(TT_LineComment) &&
(Current.Previous == nullptr ||
Current.Previous->isNot(TT_ImplicitStringLiteral))) {
diff --git a/clang/lib/Format/WhitespaceManager.h b/clang/lib/Format/WhitespaceManager.h
index f08e71495cc..e19b2a5ab9f 100644
--- a/clang/lib/Format/WhitespaceManager.h
+++ b/clang/lib/Format/WhitespaceManager.h
@@ -40,6 +40,8 @@ public:
bool UseCRLF)
: SourceMgr(SourceMgr), Style(Style), UseCRLF(UseCRLF) {}
+ bool useCRLF() const { return UseCRLF; }
+
/// Replaces the whitespace in front of \p Tok. Only call once for
/// each \c AnnotatedToken.
///
diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp
index be8566c7545..d269aab02ed 100644
--- a/clang/unittests/Format/FormatTest.cpp
+++ b/clang/unittests/Format/FormatTest.cpp
@@ -12857,6 +12857,12 @@ TEST_F(FormatTest, SupportsCRLF) {
"should not introduce\r\n"
"an extra carriage return\r\n"
"*/\r\n"));
+ EXPECT_EQ("/*\r\n"
+ "\r\n"
+ "*/",
+ format("/*\r\n"
+ " \r\r\r\n"
+ "*/"));
}
TEST_F(FormatTest, MunchSemicolonAfterBlocks) {
OpenPOWER on IntegriCloud