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#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
60#include "clang/Basic/TransformTypeTraits.def"
61 case tok::annot_typename:
63 case tok::kw_char16_t:
64 case tok::kw_char32_t:
66 case tok::kw_decltype:
84 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
99 if (!State.NextToken || !State.NextToken->Previous)
102 if (Formats.size() == 1)
107 State.NextToken->Previous->getPreviousNonComment();
108 if (!LBrace || !LBrace->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
110 LBrace->
Next->
is(TT_DesignatedInitializerPeriod)) {
116 unsigned RemainingCodePoints =
120 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
129 unsigned Penalty = 0;
134 unsigned ExtraSpaces = 0;
137 if (Item < Commas.size() && State.NextToken->Previous == Commas[Item]) {
138 if (!State.NextToken->isTrailingComment()) {
139 ExtraSpaces += Format->ColumnSizes[Column] - ItemLengths[Item];
145 if (Column == Format->Columns || State.NextToken->MustBreakBefore) {
151 Penalty +=
Indenter->addTokenToState(State,
NewLine, DryRun, ExtraSpaces);
161 if (Formats.size() == 1 || HasNestedBracedList)
162 State.Stack.back().AvoidBinPacking =
true;
170 assert(End->TotalLength >=
Begin->TotalLength);
171 return End->TotalLength -
Begin->TotalLength +
Begin->ColumnWidth;
176 if (!
Token->MatchingParen ||
177 !
Token->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare)) {
185 Commas.size() < 19) {
192 if (
Token->
is(TT_ArrayInitializerLSquare) && Commas.size() < 19)
201 ItemBegin = ItemBegin->
Next;
207 MustBreakBeforeItem.reserve(Commas.size() + 1);
208 EndOfLineItemLength.reserve(Commas.size() + 1);
209 ItemLengths.reserve(Commas.size() + 1);
211 bool HasSeparatingComment =
false;
212 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
216 ItemBegin = ItemBegin->
Next;
217 HasSeparatingComment = i > 0;
221 if (ItemBegin->
is(tok::l_brace))
222 HasNestedBracedList =
true;
224 if (i == Commas.size()) {
225 ItemEnd =
Token->MatchingParen;
233 ItemEnd = ItemEnd->
Next;
236 ItemEnd =
Token->MatchingParen->Previous;
246 ItemEnd = ItemEnd->
Next;
254 ItemBegin = ItemEnd->
Next;
259 if (Commas.size() < 5 || HasSeparatingComment)
262 if (
Token->NestingLevel != 0 &&
Token->
is(tok::l_brace) && Commas.size() < 19)
269 MinSizeInColumn.reserve(MaxItems);
270 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
272 Format.Columns = Columns;
273 Format.ColumnSizes.resize(Columns);
274 MinSizeInColumn.assign(Columns,
UINT_MAX);
275 Format.LineCount = 1;
276 bool HasRowWithSufficientColumns =
false;
278 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
279 assert(i < MustBreakBeforeItem.size());
280 if (MustBreakBeforeItem[i] || Column == Columns) {
284 if (Column == Columns - 1)
285 HasRowWithSufficientColumns =
true;
287 (Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
288 Format.ColumnSizes[Column] = std::max(Format.ColumnSizes[Column], Length);
289 MinSizeInColumn[Column] = std::min(MinSizeInColumn[Column], Length);
294 if (!HasRowWithSufficientColumns)
296 Format.TotalWidth = Columns - 1;
298 for (
unsigned i = 0; i < Columns; ++i)
299 Format.TotalWidth += Format.ColumnSizes[i];
304 for (
unsigned i = 0; i < Columns - 1; ++i)
305 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
316 Formats.push_back(Format);
320const CommaSeparatedList::ColumnFormat *
321CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
322 const ColumnFormat *BestFormat =
nullptr;
323 for (
const ColumnFormat &Format : llvm::reverse(Formats)) {
324 if (Format.TotalWidth <= RemainingCharacters || Format.Columns == 1) {
325 if (BestFormat && Format.LineCount > BestFormat->LineCount)
327 BestFormat = &Format;
This file implements an indenter that manages the indentation of continuations.
static const char *const TokNames[]
Token - This structure provides full information about a lexed token.
bool is(tok::TokenKind K) const
is/isNot - Predicates to check if this token is a specific kind, as in "if (Tok.is(tok::l_brace)) {....
tok::TokenKind getKind() const
bool isOneOf(tok::TokenKind K1, tok::TokenKind K2) const
The base class of the type hierarchy.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(T -> getSizeExpr()))