17#include "llvm/ADT/SmallVector.h"
24 static const char *
const TokNames[] = {
32 llvm_unreachable(
"unknown TokenType");
38 "clock_t",
"int16_t",
"int32_t",
"int64_t",
"int8_t",
39 "intptr_t",
"ptrdiff_t",
"size_t",
"time_t",
"uint16_t",
40 "uint32_t",
"uint64_t",
"uint8_t",
"uintptr_t",
46 return (LangOpts.CXXOperatorNames || LangOpts.C11) &&
is(tok::identifier) &&
55 assert(
is(tok::r_brace));
56 if (!Style.Cpp11BracedListStyle ||
61 assert(LBrace && LBrace->is(tok::l_brace));
64 if (LBrace->Previous && LBrace->Previous->is(tok::equal))
75 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
79 (
is(tok::less) && Style.isProto());
89 if (!State.NextToken || !State.NextToken->Previous)
92 if (Formats.size() <= 1)
97 State.NextToken->Previous->getPreviousNonComment();
98 if (!LBrace || !LBrace->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
100 LBrace->
Next->
is(TT_DesignatedInitializerPeriod)) {
106 unsigned RemainingCodePoints =
110 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
119 unsigned Penalty = 0;
124 unsigned ExtraSpaces = 0;
127 if (Item < Commas.size() && State.NextToken->Previous == Commas[Item]) {
128 if (!State.NextToken->isTrailingComment()) {
129 ExtraSpaces += Format->ColumnSizes[
Column] - ItemLengths[Item];
135 if (
Column == Format->Columns || State.NextToken->MustBreakBefore) {
141 Penalty +=
Indenter->addTokenToState(State,
NewLine, DryRun, ExtraSpaces);
151 if (Formats.size() == 1 || HasNestedBracedList)
152 State.Stack.back().AvoidBinPacking =
true;
160 assert(End->TotalLength >=
Begin->TotalLength);
161 return End->TotalLength -
Begin->TotalLength +
Begin->ColumnWidth;
166 if (!
Token->MatchingParen ||
167 !
Token->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare)) {
182 if (
Token->
is(TT_ArrayInitializerLSquare) && Commas.size() < 19)
191 ItemBegin = ItemBegin->
Next;
197 MustBreakBeforeItem.reserve(Commas.size() + 1);
198 EndOfLineItemLength.reserve(Commas.size() + 1);
199 ItemLengths.reserve(Commas.size() + 1);
201 bool HasSeparatingComment =
false;
202 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
206 ItemBegin = ItemBegin->
Next;
207 HasSeparatingComment = i > 0;
211 if (ItemBegin->
is(tok::l_brace))
212 HasNestedBracedList =
true;
214 if (i == Commas.size()) {
215 ItemEnd =
Token->MatchingParen;
223 ItemEnd = ItemEnd->
Next;
226 ItemEnd =
Token->MatchingParen->Previous;
236 ItemEnd = ItemEnd->
Next;
244 ItemBegin = ItemEnd->
Next;
249 if (Commas.size() < 5 || HasSeparatingComment)
252 if (
Token->NestingLevel != 0 &&
Token->
is(tok::l_brace) && Commas.size() < 19)
259 MinSizeInColumn.reserve(MaxItems);
260 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
262 Format.Columns = Columns;
263 Format.ColumnSizes.resize(Columns);
264 MinSizeInColumn.assign(Columns,
UINT_MAX);
265 Format.LineCount = 1;
266 bool HasRowWithSufficientColumns =
false;
268 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
269 assert(i < MustBreakBeforeItem.size());
270 if (MustBreakBeforeItem[i] ||
Column == Columns) {
274 if (
Column == Columns - 1)
275 HasRowWithSufficientColumns =
true;
277 (
Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
278 Format.ColumnSizes[
Column] = std::max(Format.ColumnSizes[
Column], Length);
279 MinSizeInColumn[
Column] = std::min(MinSizeInColumn[
Column], Length);
284 if (!HasRowWithSufficientColumns)
286 Format.TotalWidth = Columns - 1;
288 for (
unsigned i = 0; i < Columns; ++i)
289 Format.TotalWidth += Format.ColumnSizes[i];
294 for (
unsigned i = 0; i < Columns - 1; ++i)
295 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
306 Formats.push_back(Format);
310const CommaSeparatedList::ColumnFormat *
311CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
312 const ColumnFormat *BestFormat =
nullptr;
313 for (
const ColumnFormat &Format : llvm::reverse(Formats)) {
314 if (Format.TotalWidth <= RemainingCharacters || Format.Columns == 1) {
315 if (BestFormat && Format.LineCount > BestFormat->LineCount)
317 BestFormat = &Format;
326 if (Current.
is(TT_CtorInitializerComma) &&
333 ((
Previous.isNot(TT_CtorInitializerComma) ||
336 (
Previous.isNot(TT_InheritanceComma) ||
This file implements an indenter that manages the indentation of continuations.
static constexpr bool isOneOf()
static const char *const TokNames[]
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
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)) {....
bool isOneOf(Ts... Ks) const
bool isSimpleTypeSpecifier(const LangOptions &LangOpts) const
Determine whether the token kind starts a simple-type-specifier.
The base class of the type hierarchy.
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))