19 #include "llvm/ADT/SmallVector.h"
20 #include "llvm/Support/Debug.h"
27 static const char *
const TokNames[] = {
35 return TokNames[Type];
36 llvm_unreachable(
"unknown TokenType");
47 case tok::kw___int128:
49 case tok::kw_unsigned:
58 case tok::kw___underlying_type:
59 case tok::annot_typename:
60 case tok::kw_char16_t:
61 case tok::kw_char32_t:
63 case tok::kw_decltype:
84 LBrace->
Type == TT_DictLiteral ||
85 LBrace->
Next->
Type == TT_DesignatedInitializerPeriod)
90 unsigned RemainingCodePoints =
94 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
102 unsigned Penalty = 0;
107 unsigned ExtraSpaces = 0;
112 ExtraSpaces += Format->ColumnSizes[
Column] - ItemLengths[Item];
124 Penalty += Indenter->
addTokenToState(State, NewLine, DryRun, ExtraSpaces);
132 if (HasNestedBracedList)
133 State.
Stack.back().AvoidBinPacking =
true;
163 ItemBegin = ItemBegin->
Next;
170 bool HasSeparatingComment =
false;
171 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
174 ItemBegin = ItemBegin->
Next;
175 HasSeparatingComment = i > 0;
179 if (ItemBegin->
is(tok::l_brace))
180 HasNestedBracedList =
true;
182 if (i == Commas.size()) {
190 ItemEnd = ItemEnd->
Next;
203 ItemEnd = ItemEnd->
Next;
210 ItemBegin = ItemEnd->
Next;
215 if (Token->
NestingLevel != 0 || Commas.size() < 5 || HasSeparatingComment)
221 std::vector<unsigned> MinSizeInColumn;
222 MinSizeInColumn.reserve(MaxItems);
223 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
225 Format.Columns = Columns;
226 Format.ColumnSizes.resize(Columns);
227 MinSizeInColumn.assign(Columns,
UINT_MAX);
228 Format.LineCount = 1;
229 bool HasRowWithSufficientColumns =
false;
231 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
232 assert(i < MustBreakBeforeItem.size());
233 if (MustBreakBeforeItem[i] || Column == Columns) {
237 if (Column == Columns - 1)
238 HasRowWithSufficientColumns =
true;
240 (Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
241 Format.ColumnSizes[
Column] = std::max(Format.ColumnSizes[Column], Length);
242 MinSizeInColumn[
Column] = std::min(MinSizeInColumn[Column], Length);
247 if (!HasRowWithSufficientColumns)
249 Format.TotalWidth = Columns - 1;
251 for (
unsigned i = 0; i < Columns; ++i)
252 Format.TotalWidth += Format.ColumnSizes[i];
257 for (
unsigned i = 0; i < Columns - 1; ++i)
258 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
268 Formats.push_back(Format);
272 const CommaSeparatedList::ColumnFormat *
273 CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
274 const ColumnFormat *BestFormat =
nullptr;
276 I = Formats.rbegin(),
279 if (I->TotalWidth <= RemainingCharacters) {
280 if (BestFormat && I->LineCount > BestFormat->LineCount)
static const char *const TokNames[]
tok::TokenKind getKind() const
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T-> getSizeExpr()))
for(auto typeArg:T->getTypeArgsAsWritten())
This file implements an indenter that manages the indentation of continuations.