Author: krasimir Date: Tue Aug 7 03:23:24 2018 New Revision: 339123 URL: http://llvm.org/viewvc/llvm-project?rev=339123&view=rev Log: [clang-format] comment reflow: add last line's penalty when ending broken
Summary: This fixes a bug in clang-format where the last line's penalty is not taken into account when its ending is broken. Usually the last line's penalty is handled by addNextStateToQueue, but in cases where the trailing `*/` is put on a newline, the contents of the last line have to be considered for penalizing. Reviewers: mprobst Reviewed By: mprobst Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D50378 Modified: cfe/trunk/lib/Format/ContinuationIndenter.cpp cfe/trunk/unittests/Format/FormatTestJS.cpp Modified: cfe/trunk/lib/Format/ContinuationIndenter.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/ContinuationIndenter.cpp?rev=339123&r1=339122&r2=339123&view=diff ============================================================================== --- cfe/trunk/lib/Format/ContinuationIndenter.cpp (original) +++ cfe/trunk/lib/Format/ContinuationIndenter.cpp Tue Aug 7 03:23:24 2018 @@ -1840,7 +1840,8 @@ ContinuationIndenter::breakProtrudingTok // No break opportunity - update the penalty and continue with the next // logical line. if (LineIndex < EndIndex - 1) - // The last line's penalty is handled in addNextStateToQueue(). + // The last line's penalty is handled in addNextStateToQueue() or when + // calling replaceWhitespaceAfterLastLine below. Penalty += Style.PenaltyExcessCharacter * (ContentStartColumn + RemainingTokenColumns - ColumnLimit); LLVM_DEBUG(llvm::dbgs() << " No break opportunity.\n"); @@ -2095,6 +2096,12 @@ ContinuationIndenter::breakProtrudingTok Token->getSplitAfterLastLine(TailOffset); if (SplitAfterLastLine.first != StringRef::npos) { LLVM_DEBUG(llvm::dbgs() << "Replacing whitespace after last line.\n"); + + // We add the last line's penalty here, since that line is going to be split + // now. + Penalty += Style.PenaltyExcessCharacter * + (ContentStartColumn + RemainingTokenColumns - ColumnLimit); + if (!DryRun) Token->replaceWhitespaceAfterLastLine(TailOffset, SplitAfterLastLine, Whitespaces); Modified: cfe/trunk/unittests/Format/FormatTestJS.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTestJS.cpp?rev=339123&r1=339122&r2=339123&view=diff ============================================================================== --- cfe/trunk/unittests/Format/FormatTestJS.cpp (original) +++ cfe/trunk/unittests/Format/FormatTestJS.cpp Tue Aug 7 03:23:24 2018 @@ -2284,5 +2284,25 @@ TEST_F(FormatTestJS, BackslashesInCommen "formatMe( );\n"); } +TEST_F(FormatTestJS, AddsLastLinePenaltyIfEndingIsBroken) { + EXPECT_EQ( + "a = function() {\n" + " b = function() {\n" + " this.aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa] = aaaa.aaaaaa ?\n" + " aaaa.aaaaaa : /** @type " + "{aaaa.aaaa.aaaaaaaaa.aaaaaaaaaaaaaaaaaaa} */\n" + " (aaaa.aaaa.aaaaaaaaa.aaaaaaaaaaaaa.aaaaaaaaaaaaaaaaa);\n" + " };\n" + "};", + format("a = function() {\n" + " b = function() {\n" + " this.aaaaaaaaaaaaaaaaaaa[aaaaaaaaaaa] = aaaa.aaaaaa ? " + "aaaa.aaaaaa : /** @type " + "{aaaa.aaaa.aaaaaaaaa.aaaaaaaaaaaaaaaaaaa} */\n" + " (aaaa.aaaa.aaaaaaaaa.aaaaaaaaaaaaa.aaaaaaaaaaaaaaaaa);\n" + " };\n" + "};")); +} + } // end namespace tooling } // end namespace clang _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits