From aa620e187e33b0cf358382ece026d052ac217bf4 Mon Sep 17 00:00:00 2001 From: Alexander Kornienko Date: Mon, 1 Jul 2013 13:42:42 +0000 Subject: Avoid column limit violation in block comments in certain cases. Summary: Add penalty when an excessively long line in a block comment can not be broken on a leading whitespace. Lack of this addition can lead to severe column width violations when they can be easily avoided. Reviewers: djasper Reviewed By: djasper CC: cfe-commits, klimek Differential Revision: http://llvm-reviews.chandlerc.com/D1071 llvm-svn: 185337 --- clang/lib/Format/Format.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'clang/lib/Format/Format.cpp') diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 7b9950a43b0..9cfb04162e8 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -806,9 +806,10 @@ private: /// /// \returns An extra penalty if a token was broken, otherwise 0. /// - /// Note that the penalty of the token protruding the allowed line length is - /// already handled in \c addNextStateToQueue; the returned penalty will only - /// cover the cost of the additional line breaks. + /// The returned penalty will cover the cost of the additional line breaks and + /// column limit violation in all lines except for the last one. The penalty + /// for the column limit violation in the last line (and in single line + /// tokens) is handled in \c addNextStateToQueue. unsigned breakProtrudingToken(const FormatToken &Current, LineState &State, bool DryRun) { llvm::OwningPtr Token; @@ -854,8 +855,13 @@ private: while (RemainingTokenColumns > RemainingSpace) { BreakableToken::Split Split = Token->getSplit(LineIndex, TailOffset, getColumnLimit()); - if (Split.first == StringRef::npos) + if (Split.first == StringRef::npos) { + // The last line's penalty is handled in addNextStateToQueue(). + if (LineIndex < EndIndex - 1) + Penalty += Style.PenaltyExcessCharacter * + (RemainingTokenColumns - RemainingSpace); break; + } assert(Split.first != 0); unsigned NewRemainingTokenColumns = Token->getLineLengthAfterSplit( LineIndex, TailOffset + Split.first + Split.second, -- cgit v1.2.3