17 #include "llvm/ADT/SmallVector.h"
18 #include "llvm/Support/Debug.h"
25 static const char *
const TokNames[] = {
33 llvm_unreachable(
"unknown TokenType");
44 case tok::kw___int128:
46 case tok::kw_unsigned:
54 case tok::kw__Float16:
55 case tok::kw___float128:
56 case tok::kw___ibm128:
59 case tok::kw___underlying_type:
60 case tok::annot_typename:
62 case tok::kw_char16_t:
63 case tok::kw_char32_t:
65 case tok::kw_decltype:
83 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
98 if (
State.NextToken ==
nullptr || !
State.NextToken->Previous)
101 if (Formats.size() == 1)
106 State.NextToken->Previous->getPreviousNonComment();
107 if (!LBrace || !LBrace->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
109 LBrace->
Next->
is(TT_DesignatedInitializerPeriod))
114 unsigned RemainingCodePoints =
118 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
127 unsigned Penalty = 0;
132 unsigned ExtraSpaces = 0;
135 if (Item < Commas.size() &&
State.NextToken->Previous == Commas[Item]) {
136 if (!
State.NextToken->isTrailingComment()) {
137 ExtraSpaces += Format->ColumnSizes[Column] - ItemLengths[Item];
143 if (Column == Format->Columns ||
State.NextToken->MustBreakBefore) {
159 if (Formats.size() == 1 || HasNestedBracedList)
160 State.Stack.back().AvoidBinPacking =
true;
168 assert(
End->TotalLength >=
Begin->TotalLength);
169 return End->TotalLength -
Begin->TotalLength +
Begin->ColumnWidth;
174 if (!
Token->MatchingParen ||
175 !
Token->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare))
188 if (
Token->
is(TT_ArrayInitializerLSquare) && Commas.size() < 19)
197 ItemBegin = ItemBegin->
Next;
203 MustBreakBeforeItem.reserve(Commas.size() + 1);
204 EndOfLineItemLength.reserve(Commas.size() + 1);
205 ItemLengths.reserve(Commas.size() + 1);
207 bool HasSeparatingComment =
false;
208 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
212 ItemBegin = ItemBegin->
Next;
213 HasSeparatingComment = i > 0;
217 if (ItemBegin->
is(tok::l_brace))
218 HasNestedBracedList =
true;
220 if (i == Commas.size()) {
221 ItemEnd =
Token->MatchingParen;
229 ItemEnd = ItemEnd->
Next;
232 ItemEnd =
Token->MatchingParen->Previous;
242 ItemEnd = ItemEnd->
Next;
249 ItemBegin = ItemEnd->
Next;
254 if (Commas.size() < 5 || HasSeparatingComment)
257 if (
Token->NestingLevel != 0 &&
Token->
is(tok::l_brace) && Commas.size() < 19)
263 std::vector<unsigned> MinSizeInColumn;
264 MinSizeInColumn.reserve(MaxItems);
265 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
267 Format.Columns = Columns;
268 Format.ColumnSizes.resize(Columns);
269 MinSizeInColumn.assign(Columns,
UINT_MAX);
270 Format.LineCount = 1;
271 bool HasRowWithSufficientColumns =
false;
273 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
274 assert(i < MustBreakBeforeItem.size());
275 if (MustBreakBeforeItem[i] || Column == Columns) {
279 if (Column == Columns - 1)
280 HasRowWithSufficientColumns =
true;
282 (Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
283 Format.ColumnSizes[Column] =
std::max(Format.ColumnSizes[Column], Length);
284 MinSizeInColumn[Column] =
std::min(MinSizeInColumn[Column], Length);
289 if (!HasRowWithSufficientColumns)
291 Format.TotalWidth = Columns - 1;
293 for (
unsigned i = 0; i < Columns; ++i)
294 Format.TotalWidth += Format.ColumnSizes[i];
299 for (
unsigned i = 0; i < Columns - 1; ++i)
300 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
310 Formats.push_back(Format);
314 const CommaSeparatedList::ColumnFormat *
315 CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
316 const ColumnFormat *BestFormat =
nullptr;
317 for (
const ColumnFormat &Format : llvm::reverse(Formats)) {
318 if (Format.TotalWidth <= RemainingCharacters || Format.Columns == 1) {
319 if (BestFormat && Format.LineCount > BestFormat->LineCount)
321 BestFormat = &Format;