summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Format/ContinuationIndenter.cpp9
-rw-r--r--clang/unittests/Format/FormatTestJS.cpp20
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
OpenPOWER on IntegriCloud