diff options
-rw-r--r-- | clang/lib/Format/ContinuationIndenter.cpp | 9 | ||||
-rw-r--r-- | clang/unittests/Format/FormatTestJS.cpp | 20 |
2 files changed, 28 insertions, 1 deletions
diff --git a/clang/lib/Format/ContinuationIndenter.cpp b/clang/lib/Format/ContinuationIndenter.cpp index 7ca588a675b..0c202565051 100644 --- a/clang/lib/Format/ContinuationIndenter.cpp +++ b/clang/lib/Format/ContinuationIndenter.cpp @@ -1840,7 +1840,8 @@ ContinuationIndenter::breakProtrudingToken(const FormatToken &Current, // 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::breakProtrudingToken(const FormatToken &Current, 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); diff --git a/clang/unittests/Format/FormatTestJS.cpp b/clang/unittests/Format/FormatTestJS.cpp index 58a900352a2..83467837389 100644 --- a/clang/unittests/Format/FormatTestJS.cpp +++ b/clang/unittests/Format/FormatTestJS.cpp @@ -2284,5 +2284,25 @@ TEST_F(FormatTestJS, BackslashesInComments) { "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 |