[clang-format] Fix bug in reflow of block comments containing CR/LF
Fix PR36119 Differential Revision: https://reviews.llvm.org/D60996 llvm-svn: 359029
This commit is contained in:
parent
acbf0058e9
commit
108cbbc262
|
@ -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.
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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))) {
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue