From 0ce1c9ade71a2ed56dafddcd5d95e4e75fd91255 Mon Sep 17 00:00:00 2001 From: Daniel Jasper Date: Fri, 8 Nov 2013 23:31:14 +0000 Subject: [PATCH] clang-format: Improve clang-format's detection about comment binding. Before, existing code in the form of: int a; // this is a. // This is // b. int b; Got turned into: int a; // this is a. // This is // b. int b; git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@194294 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Format/WhitespaceManager.cpp | 28 +++++++++++++++------------- unittests/Format/FormatTest.cpp | 20 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/lib/Format/WhitespaceManager.cpp b/lib/Format/WhitespaceManager.cpp index c24ccdfee4..26a8d41e87 100644 --- a/lib/Format/WhitespaceManager.cpp +++ b/lib/Format/WhitespaceManager.cpp @@ -141,19 +141,21 @@ void WhitespaceManager::alignTrailingComments() { bool FollowsRBraceInColumn0 = i > 0 && Changes[i].NewlinesBefore == 0 && Changes[i - 1].Kind == tok::r_brace && Changes[i - 1].StartOfTokenColumn == 0; - bool WasAlignedWithStartOfNextLine = - // A comment on its own line. - Changes[i].NewlinesBefore == 1 && - // Not the last line. - i + 1 != e && - // The start of the next token was previously aligned with - // the start of this comment. - (SourceMgr.getSpellingColumnNumber( - Changes[i].OriginalWhitespaceRange.getEnd()) == - SourceMgr.getSpellingColumnNumber( - Changes[i + 1].OriginalWhitespaceRange.getEnd())) && - // Which is not a comment itself. - Changes[i + 1].Kind != tok::comment; + bool WasAlignedWithStartOfNextLine = false; + if (Changes[i].NewlinesBefore == 1) { // A comment on its own line. + for (unsigned j = i + 1; j != e; ++j) { + if (Changes[j].Kind != tok::comment) { // Skip over comments. + // The start of the next token was previously aligned with the + // start of this comment. + WasAlignedWithStartOfNextLine = + (SourceMgr.getSpellingColumnNumber( + Changes[i].OriginalWhitespaceRange.getEnd()) == + SourceMgr.getSpellingColumnNumber( + Changes[j].OriginalWhitespaceRange.getEnd())); + break; + } + } + } if (!Style.AlignTrailingComments || FollowsRBraceInColumn0) { alignTrailingComments(StartOfSequence, i, MinColumn); MinColumn = ChangeMinColumn; diff --git a/unittests/Format/FormatTest.cpp b/unittests/Format/FormatTest.cpp index 794fb1a64b..e37f0cd4eb 100644 --- a/unittests/Format/FormatTest.cpp +++ b/unittests/Format/FormatTest.cpp @@ -787,6 +787,26 @@ TEST_F(FormatTest, UnderstandsSingleLineComments) { "// first\n" " // at start\n" "otherLine(); // comment")); + verifyFormat("f(); // comment\n" + "// first\n" + "// at start\n" + "otherLine();"); + EXPECT_EQ("f(); // comment\n" + "// first\n" + "// at start\n" + "otherLine();", + format("f(); // comment\n" + "// first\n" + " // at start\n" + "otherLine();")); + EXPECT_EQ("f(); // comment\n" + " // first\n" + "// at start\n" + "otherLine();", + format("f(); // comment\n" + " // first\n" + "// at start\n" + "otherLine();")); } TEST_F(FormatTest, CanFormatCommentsLocally) { -- 2.40.0