diff options
| author | Owen Pan <owenpiano@gmail.com> | 2019-04-23 20:29:46 +0000 |
|---|---|---|
| committer | Owen Pan <owenpiano@gmail.com> | 2019-04-23 20:29:46 +0000 |
| commit | 108cbbc262ff99c406fb3dfefdf822445c295c0d (patch) | |
| tree | ed41aeb18ba07f5c843d29adab4651e7ac4f31e9 | |
| parent | acbf0058e93d3a8f95ea3ace586f99320ce1c425 (diff) | |
| download | bcm5719-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.cpp | 7 | ||||
| -rw-r--r-- | clang/lib/Format/BreakableToken.h | 2 | ||||
| -rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Format/WhitespaceManager.h | 2 | ||||
| -rw-r--r-- | clang/unittests/Format/FormatTest.cpp | 6 |
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) { |

