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:
56 case tok::kw___float128:
59 case tok::kw___underlying_type:
60 case tok::annot_typename:
61 case tok::kw_char16_t:
62 case tok::kw_char32_t:
64 case tok::kw_decltype:
84 if (!LBrace || !LBrace->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
86 LBrace->
Next->
Type == TT_DesignatedInitializerPeriod)
91 unsigned RemainingCodePoints =
95 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
103 unsigned Penalty = 0;
108 unsigned ExtraSpaces = 0;
113 ExtraSpaces += Format->ColumnSizes[Column] - ItemLengths[Item];
125 Penalty += Indenter->
addTokenToState(State, NewLine, DryRun, ExtraSpaces);
133 if (HasNestedBracedList)
134 State.
Stack.back().AvoidBinPacking =
true;
149 !Token->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare))
162 if (Token->
is(TT_ArrayInitializerLSquare) && Commas.size() < 19)
171 ItemBegin = ItemBegin->
Next;
178 bool HasSeparatingComment =
false;
179 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
182 ItemBegin = ItemBegin->
Next;
183 HasSeparatingComment = i > 0;
187 if (ItemBegin->
is(tok::l_brace))
188 HasNestedBracedList =
true;
190 if (i == Commas.size()) {
199 ItemEnd = ItemEnd->
Next;
212 ItemEnd = ItemEnd->
Next;
219 ItemBegin = ItemEnd->
Next;
224 if (Commas.size() < 5 || HasSeparatingComment)
227 if (Token->
NestingLevel != 0 && Token->
is(tok::l_brace) && Commas.size() < 19)
233 std::vector<unsigned> MinSizeInColumn;
234 MinSizeInColumn.reserve(MaxItems);
235 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
237 Format.Columns = Columns;
238 Format.ColumnSizes.resize(Columns);
239 MinSizeInColumn.assign(Columns,
UINT_MAX);
240 Format.LineCount = 1;
241 bool HasRowWithSufficientColumns =
false;
243 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
244 assert(i < MustBreakBeforeItem.size());
245 if (MustBreakBeforeItem[i] || Column == Columns) {
249 if (Column == Columns - 1)
250 HasRowWithSufficientColumns =
true;
252 (Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
253 Format.ColumnSizes[Column] =
std::max(Format.ColumnSizes[Column], Length);
254 MinSizeInColumn[Column] =
std::min(MinSizeInColumn[Column], Length);
259 if (!HasRowWithSufficientColumns)
261 Format.TotalWidth = Columns - 1;
263 for (
unsigned i = 0; i < Columns; ++i)
264 Format.TotalWidth += Format.ColumnSizes[i];
269 for (
unsigned i = 0; i < Columns - 1; ++i)
270 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
280 Formats.push_back(Format);
284 const CommaSeparatedList::ColumnFormat *
285 CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
286 const ColumnFormat *BestFormat =
nullptr;
288 I = Formats.rbegin(),
291 if (
I->TotalWidth <= RemainingCharacters) {
292 if (BestFormat &&
I->LineCount > BestFormat->LineCount)
The base class of the type hierarchy.
static const char *const TokNames[]
Token - This structure provides full information about a lexed token.
tok::TokenKind getKind() const
detail::InMemoryDirectory::const_iterator I
char __ovld __cnfn min(char x, char y)
Returns y if y < x, otherwise it returns x.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T-> getSizeExpr()))
detail::InMemoryDirectory::const_iterator E
for(auto typeArg:T->getTypeArgsAsWritten())
char __ovld __cnfn max(char x, char y)
Returns y if x < y, otherwise it returns x.
This file implements an indenter that manages the indentation of continuations.