17#include "llvm/ADT/SmallVector.h"
24 static const char *
const TokNames[] = {
32 llvm_unreachable(
"unknown TokenType");
37 "BINDABLE",
"CONSTANT",
"DESIGNABLE",
"FINAL",
"MEMBER",
"NOTIFY",
38 "OVERRIDE",
"READ",
"REQUIRED",
"RESET",
"REVISION",
"SCRIPTABLE",
39 "STORED",
"USER",
"VIRTUAL",
"WRITE",
42bool FormatToken::isQtProperty()
const {
49 "clock_t",
"int16_t",
"int32_t",
"int64_t",
"int8_t",
50 "intptr_t",
"ptrdiff_t",
"size_t",
"time_t",
"uint16_t",
51 "uint32_t",
"uint64_t",
"uint8_t",
"uintptr_t",
54bool FormatToken::isTypeName(
const LangOptions &LangOpts)
const {
55 if (
is(TT_TypeName) ||
Tok.isSimpleTypeSpecifier(LangOpts))
58 return (LangOpts.CXXOperatorNames || LangOpts.C11) &&
is(tok::identifier) &&
62bool FormatToken::isTypeOrIdentifier(
const LangOptions &LangOpts)
const {
63 return isTypeName(LangOpts) ||
isOneOf(tok::kw_auto, tok::identifier);
66bool FormatToken::isBlockIndentedInitRBrace(
const FormatStyle &Style)
const {
67 assert(
is(tok::r_brace));
71 !Style.BreakBeforeCloseBracketBracedList) {
77 if (LBrace->Previous && LBrace->Previous->is(tok::equal))
82bool FormatToken::mustBreakAfterAttributes(
const FormatStyle &Style)
const {
83 switch (Style.BreakAfterAttributes) {
93bool FormatToken::opensBlockOrBlockTypeList(
const FormatStyle &Style)
const {
97 if (
is(TT_TemplateString) && opensScope())
99 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
104 (
is(tok::less) && Style.isProto());
112 ContinuationIndenter *Indenter,
114 if (!State.NextToken || !State.NextToken->Previous)
117 if (Formats.size() <= 1)
122 State.NextToken->Previous->getPreviousNonComment();
123 if (!LBrace || LBrace->isNoneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
124 LBrace->is(
BK_Block) || LBrace->is(TT_DictLiteral) ||
125 LBrace->Next->is(TT_DesignatedInitializerPeriod)) {
131 unsigned RemainingCodePoints =
132 Style.ColumnLimit - State.Column + State.NextToken->Previous->ColumnWidth;
135 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
144 unsigned Penalty = 0;
147 while (State.NextToken != LBrace->MatchingParen) {
148 bool NewLine =
false;
149 unsigned ExtraSpaces = 0;
152 if (Item < Commas.size() && State.NextToken->Previous == Commas[Item]) {
153 if (!State.NextToken->isTrailingComment()) {
154 ExtraSpaces += Format->ColumnSizes[
Column] - ItemLengths[Item];
160 if (
Column == Format->Columns || State.NextToken->MustBreakBefore) {
166 Penalty += Indenter->addTokenToState(State, NewLine, DryRun, ExtraSpaces);
172 ContinuationIndenter *Indenter,
176 if (Formats.size() == 1 || HasNestedBracedList)
177 State.Stack.back().AvoidBinPacking =
true;
191 if (!
Token->MatchingParen ||
201 (Commas.size() < 19 || !
Style.BinPackLongBracedList)) {
208 if (
Token->
is(TT_ArrayInitializerLSquare) && Commas.size() < 19)
212 if (!
Style.AlignAfterOpenBracket)
216 while (ItemBegin->isTrailingComment())
217 ItemBegin = ItemBegin->Next;
223 MustBreakBeforeItem.reserve(Commas.size() + 1);
224 EndOfLineItemLength.reserve(Commas.size() + 1);
225 ItemLengths.reserve(Commas.size() + 1);
227 bool HasSeparatingComment =
false;
228 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
231 while (ItemBegin->HasUnescapedNewline && ItemBegin->isTrailingComment()) {
232 ItemBegin = ItemBegin->Next;
233 HasSeparatingComment = i > 0;
236 MustBreakBeforeItem.push_back(ItemBegin->MustBreakBefore);
237 if (ItemBegin->is(tok::l_brace))
238 HasNestedBracedList =
true;
240 if (i == Commas.size()) {
241 ItemEnd =
Token->MatchingParen;
242 const FormatToken *NonCommentEnd = ItemEnd->getPreviousNonComment();
245 !ItemEnd->Previous->isTrailingComment()) {
248 while (ItemEnd->Next && !ItemEnd->Next->CanBreakBefore)
249 ItemEnd = ItemEnd->Next;
252 ItemEnd =
Token->MatchingParen->Previous;
260 if (ItemEnd->Next && !ItemEnd->Next->HasUnescapedNewline &&
261 ItemEnd->Next->isTrailingComment()) {
262 ItemEnd = ItemEnd->Next;
268 if (ItemEnd->getNextNonComment() ==
Token->MatchingParen)
270 ItemBegin = ItemEnd->Next;
275 if (Commas.size() < 5 || HasSeparatingComment)
278 if (
Token->NestingLevel != 0 &&
Token->
is(tok::l_brace) && Commas.size() < 19)
283 unsigned MaxItems =
Style.ColumnLimit / 3;
285 MinSizeInColumn.reserve(MaxItems);
286 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
288 Format.Columns = Columns;
289 Format.ColumnSizes.resize(Columns);
290 MinSizeInColumn.assign(Columns,
UINT_MAX);
291 Format.LineCount = 1;
292 bool HasRowWithSufficientColumns =
false;
294 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
295 assert(i < MustBreakBeforeItem.size());
296 if (MustBreakBeforeItem[i] ||
Column == Columns) {
300 if (
Column == Columns - 1)
301 HasRowWithSufficientColumns =
true;
303 (
Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
304 Format.ColumnSizes[
Column] = std::max(Format.ColumnSizes[
Column], Length);
305 MinSizeInColumn[
Column] = std::min(MinSizeInColumn[
Column], Length);
310 if (!HasRowWithSufficientColumns)
312 Format.TotalWidth = Columns - 1;
314 for (
unsigned i = 0; i < Columns; ++i)
315 Format.TotalWidth += Format.ColumnSizes[i];
320 for (
unsigned i = 0; i < Columns - 1; ++i)
321 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
329 if (Format.TotalWidth >
Style.ColumnLimit && Columns > 1)
332 Formats.push_back(Format);
336const CommaSeparatedList::ColumnFormat *
337CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
338 const ColumnFormat *BestFormat =
nullptr;
339 for (
const ColumnFormat &Format : llvm::reverse(Formats)) {
340 if (Format.TotalWidth <= RemainingCharacters || Format.Columns == 1) {
341 if (BestFormat && Format.LineCount > BestFormat->LineCount)
343 BestFormat = &Format;
352 if (Current.
is(TT_CtorInitializerComma) &&
358 if (Current.
is(TT_QtProperty))
360 return Previous.is(tok::comma) && !Current.isTrailingComment() &&
361 ((
Previous.isNot(TT_CtorInitializerComma) ||
362 Style.BreakConstructorInitializers !=
364 (
Previous.isNot(TT_InheritanceComma) ||
This file implements an indenter that manages the indentation of continuations.
static constexpr bool isOneOf()
static const char *const TokNames[]
unsigned formatFromToken(LineState &State, ContinuationIndenter *Indenter, bool DryRun) override
Apply the special formatting that the given role demands.
unsigned formatAfterToken(LineState &State, ContinuationIndenter *Indenter, bool DryRun) override
Same as formatFromToken, but assumes that the first token has already been set thereby deciding on th...
void precomputeFormattingInfos(const FormatToken *Token) override
After the TokenAnnotator has finished annotating all the tokens, this function precomputes required i...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
virtual void precomputeFormattingInfos(const FormatToken *Token)
After the TokenAnnotator has finished annotating all the tokens, this function precomputes required i...
const FormatStyle & Style
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 isNoneOf(Ts... Ks) const
The base class of the type hierarchy.
Top level wrappers for InstallAPI frontend operations.