diff options
-rw-r--r-- | lib/Format/Format.cpp | 43 | ||||
-rw-r--r-- | unittests/Format/FormatTest.cpp | 7 |
2 files changed, 36 insertions, 14 deletions
diff --git a/lib/Format/Format.cpp b/lib/Format/Format.cpp index 01813ef6c8..5fd49157bd 100644 --- a/lib/Format/Format.cpp +++ b/lib/Format/Format.cpp @@ -116,20 +116,30 @@ public: // Align line comments if they are trailing or if they continue other // trailing comments. - if (isTrailingComment(Tok) && (Tok.Parent != NULL || !Comments.empty())) { - if (Style.ColumnLimit >= - Spaces + WhitespaceStartColumn + Tok.FormatTok.TokenLength) { - Comments.push_back(StoredComment()); - Comments.back().Tok = Tok.FormatTok; - Comments.back().Spaces = Spaces; - Comments.back().NewLines = NewLines; - if (NewLines == 0) - Comments.back().MinColumn = WhitespaceStartColumn + Spaces; - else - Comments.back().MinColumn = Spaces; - Comments.back().MaxColumn = - Style.ColumnLimit - Tok.FormatTok.TokenLength; - return; + if (isTrailingComment(Tok)) { + // Remove the comment's trailing whitespace. + if (Tok.FormatTok.Tok.getLength() != Tok.FormatTok.TokenLength) + Replaces.insert(tooling::Replacement( + SourceMgr, Tok.FormatTok.Tok.getLocation().getLocWithOffset( + Tok.FormatTok.TokenLength), + Tok.FormatTok.Tok.getLength() - Tok.FormatTok.TokenLength, "")); + + // Align comment with other comments. + if (Tok.Parent != NULL || !Comments.empty()) { + if (Style.ColumnLimit >= + Spaces + WhitespaceStartColumn + Tok.FormatTok.TokenLength) { + Comments.push_back(StoredComment()); + Comments.back().Tok = Tok.FormatTok; + Comments.back().Spaces = Spaces; + Comments.back().NewLines = NewLines; + if (NewLines == 0) + Comments.back().MinColumn = WhitespaceStartColumn + Spaces; + else + Comments.back().MinColumn = Spaces; + Comments.back().MaxColumn = + Style.ColumnLimit - Tok.FormatTok.TokenLength; + return; + } } } @@ -1017,6 +1027,11 @@ public: GreaterStashed = true; } + // If we reformat comments, we remove trailing whitespace. Update the length + // accordingly. + if (FormatTok.Tok.is(tok::comment)) + FormatTok.TokenLength = Text.rtrim().size(); + return FormatTok; } diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 8b1f69a76e..052c852a63 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -537,6 +537,13 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) { " aaaaaaaaaaaaaaaaaaaaaa); // 81 cols with this comment"); } +TEST_F(FormatTest, RemovesTrailingWhitespaceOfComments) { + EXPECT_EQ("// comment", format("// comment ")); + EXPECT_EQ("int aaaaaaa, bbbbbbb; // comment", + format("int aaaaaaa, bbbbbbb; // comment ", + getLLVMStyleWithColumns(33))); +} + TEST_F(FormatTest, UnderstandsMultiLineComments) { verifyFormat("f(/*test=*/ true);"); EXPECT_EQ( |