diff options
author | Owen Pan <owenpiano@gmail.com> | 2019-05-03 23:15:40 +0000 |
---|---|---|
committer | Owen Pan <owenpiano@gmail.com> | 2019-05-03 23:15:40 +0000 |
commit | 3dcb892d2d6fb2809f57cbf80984f7f5603e2ace (patch) | |
tree | a128bc8b77f4f0986920751a41cf79a800643f4a /clang/lib/Format | |
parent | 3f796f974d75e11fbc7267020aa15d5e0f556a74 (diff) | |
download | bcm5719-llvm-3dcb892d2d6fb2809f57cbf80984f7f5603e2ace.tar.gz bcm5719-llvm-3dcb892d2d6fb2809f57cbf80984f7f5603e2ace.zip |
[clang-format] Fix bug in block comment reflow that joins * and /
Fixes PR41213
Differential Revision: https://reviews.llvm.org/D61276
llvm-svn: 359943
Diffstat (limited to 'clang/lib/Format')
-rw-r--r-- | clang/lib/Format/BreakableToken.cpp | 20 | ||||
-rw-r--r-- | clang/lib/Format/BreakableToken.h | 3 |
2 files changed, 21 insertions, 2 deletions
diff --git a/clang/lib/Format/BreakableToken.cpp b/clang/lib/Format/BreakableToken.cpp index 5172c97f8af..72886ed0073 100644 --- a/clang/lib/Format/BreakableToken.cpp +++ b/clang/lib/Format/BreakableToken.cpp @@ -65,7 +65,8 @@ static StringRef getLineCommentIndentPrefix(StringRef Comment, static BreakableToken::Split getCommentSplit(StringRef Text, unsigned ContentStartColumn, unsigned ColumnLimit, unsigned TabWidth, - encoding::Encoding Encoding, const FormatStyle &Style) { + encoding::Encoding Encoding, const FormatStyle &Style, + bool DecorationEndsWithStar = false) { LLVM_DEBUG(llvm::dbgs() << "Comment split: \"" << Text << "\", Column limit: " << ColumnLimit << ", Content start: " << ContentStartColumn << "\n"); @@ -123,7 +124,10 @@ getCommentSplit(StringRef Text, unsigned ContentStartColumn, if (SpaceOffset == 1 && Text[SpaceOffset - 1] == '*') return BreakableToken::Split(StringRef::npos, 0); StringRef BeforeCut = Text.substr(0, SpaceOffset).rtrim(Blanks); - StringRef AfterCut = Text.substr(SpaceOffset).ltrim(Blanks); + StringRef AfterCut = Text.substr(SpaceOffset); + // Don't trim the leading blanks if it would create a */ after the break. + if (!DecorationEndsWithStar || AfterCut.size() <= 1 || AfterCut[1] != '/') + AfterCut = AfterCut.ltrim(Blanks); return BreakableToken::Split(BeforeCut.size(), AfterCut.begin() - BeforeCut.end()); } @@ -452,6 +456,18 @@ BreakableBlockComment::BreakableBlockComment( }); } +BreakableToken::Split +BreakableBlockComment::getSplit(unsigned LineIndex, unsigned TailOffset, + unsigned ColumnLimit, unsigned ContentStartColumn, + llvm::Regex &CommentPragmasRegex) const { + // Don't break lines matching the comment pragmas regex. + if (CommentPragmasRegex.match(Content[LineIndex])) + return Split(StringRef::npos, 0); + return getCommentSplit(Content[LineIndex].substr(TailOffset), + ContentStartColumn, ColumnLimit, Style.TabWidth, + Encoding, Style, Decoration.endswith("*")); +} + void BreakableBlockComment::adjustWhitespace(unsigned LineIndex, int IndentDelta) { // When in a preprocessor directive, the trailing backslash in a block comment diff --git a/clang/lib/Format/BreakableToken.h b/clang/lib/Format/BreakableToken.h index dba763c6ad1..72852d59f9c 100644 --- a/clang/lib/Format/BreakableToken.h +++ b/clang/lib/Format/BreakableToken.h @@ -361,6 +361,9 @@ public: bool InPPDirective, encoding::Encoding Encoding, const FormatStyle &Style, bool UseCRLF); + Split getSplit(unsigned LineIndex, unsigned TailOffset, unsigned ColumnLimit, + unsigned ContentStartColumn, + llvm::Regex &CommentPragmasRegex) const override; unsigned getRangeLength(unsigned LineIndex, unsigned Offset, StringRef::size_type Length, unsigned StartColumn) const override; |