Handle zero-width and double-width characters in string literals and comments.
Summary:
Count column width instead of the number of code points. This also
includes correct handling of tabs inside string literals and comments (with an
exception of multiline string literals/comments, where tabs are present before
the first escaped newline).
Reviewers: djasper, klimek
Reviewed By: klimek
CC: cfe-commits, klimek
Differential Revision: http://llvm-reviews.chandlerc.com/D1601
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@190052 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Format/ContinuationIndenter.cpp b/lib/Format/ContinuationIndenter.cpp
index c894a4b..9e84ea7 100644
--- a/lib/Format/ContinuationIndenter.cpp
+++ b/lib/Format/ContinuationIndenter.cpp
@@ -623,10 +623,10 @@
State.Stack[i].BreakBeforeParameter = true;
unsigned ColumnsUsed =
- State.Column - Current.CodePointCount + Current.CodePointsInFirstLine;
+ State.Column - Current.CodePointCount + Current.FirstLineColumnWidth;
// We can only affect layout of the first and the last line, so the penalty
// for all other lines is constant, and we ignore it.
- State.Column = Current.CodePointsInLastLine;
+ State.Column = Current.LastLineColumnWidth;
if (ColumnsUsed > getColumnLimit(State))
return Style.PenaltyExcessCharacter * (ColumnsUsed - getColumnLimit(State));
@@ -659,14 +659,14 @@
return 0;
Token.reset(new BreakableStringLiteral(
- Current, StartColumn, State.Line->InPPDirective, Encoding));
+ Current, StartColumn, State.Line->InPPDirective, Encoding, Style));
} else if (Current.Type == TT_BlockComment && Current.isTrailingComment()) {
unsigned OriginalStartColumn =
SourceMgr.getSpellingColumnNumber(Current.getStartOfNonWhitespace()) -
1;
Token.reset(new BreakableBlockComment(
- Style, Current, StartColumn, OriginalStartColumn, !Current.Previous,
- State.Line->InPPDirective, Encoding));
+ Current, StartColumn, OriginalStartColumn, !Current.Previous,
+ State.Line->InPPDirective, Encoding, Style));
} else if (Current.Type == TT_LineComment &&
(Current.Previous == NULL ||
Current.Previous->Type != TT_ImplicitStringLiteral)) {
@@ -678,12 +678,12 @@
// leading whitespace in consecutive lines when changing indentation of
// the first line similar to what we do with block comments.
if (Current.isMultiline()) {
- State.Column = StartColumn + Current.CodePointsInFirstLine;
+ State.Column = StartColumn + Current.FirstLineColumnWidth;
return 0;
}
- Token.reset(new BreakableLineComment(Current, StartColumn,
- State.Line->InPPDirective, Encoding));
+ Token.reset(new BreakableLineComment(
+ Current, StartColumn, State.Line->InPPDirective, Encoding, Style));
} else {
return 0;
}