17#include "llvm/ADT/SmallVector.h"
24 static const char *
const TokNames[] = {
32 llvm_unreachable(
"unknown TokenType");
37 "BINDABLE",
"CONSTANT",
"DESIGNABLE",
"FINAL",
"MEMBER",
38 "NOTIFY",
"READ",
"REQUIRED",
"RESET",
"REVISION",
39 "SCRIPTABLE",
"STORED",
"USER",
"WRITE",
42bool FormatToken::isQtProperty()
const {
50 "clock_t",
"int16_t",
"int32_t",
"int64_t",
"int8_t",
51 "intptr_t",
"ptrdiff_t",
"size_t",
"time_t",
"uint16_t",
52 "uint32_t",
"uint64_t",
"uint8_t",
"uintptr_t",
55bool FormatToken::isTypeName(
const LangOptions &LangOpts)
const {
56 if (
is(TT_TypeName) ||
Tok.isSimpleTypeSpecifier(LangOpts))
59 return (LangOpts.CXXOperatorNames || LangOpts.C11) &&
is(tok::identifier) &&
63bool FormatToken::isTypeOrIdentifier(
const LangOptions &LangOpts)
const {
64 return isTypeName(LangOpts) ||
isOneOf(tok::kw_auto, tok::identifier);
67bool FormatToken::isBlockIndentedInitRBrace(
const FormatStyle &Style)
const {
68 assert(
is(tok::r_brace));
69 if (!Style.Cpp11BracedListStyle ||
70 Style.AlignAfterOpenBracket != FormatStyle::BAS_BlockIndent) {
74 assert(LBrace && LBrace->is(tok::l_brace));
77 if (LBrace->Previous && LBrace->Previous->is(tok::equal))
82bool FormatToken::opensBlockOrBlockTypeList(
const FormatStyle &Style)
const {
86 if (
is(TT_TemplateString) && opensScope())
88 return is(TT_ArrayInitializerLSquare) ||
is(TT_ProtoExtensionLSquare) ||
92 (
is(tok::less) && Style.isProto());
100 ContinuationIndenter *Indenter,
102 if (!State.NextToken || !State.NextToken->Previous)
105 if (Formats.size() <= 1)
110 State.NextToken->Previous->getPreviousNonComment();
111 if (!LBrace || !LBrace->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
112 LBrace->is(
BK_Block) || LBrace->is(TT_DictLiteral) ||
113 LBrace->Next->is(TT_DesignatedInitializerPeriod)) {
119 unsigned RemainingCodePoints =
120 Style.ColumnLimit - State.Column + State.NextToken->Previous->ColumnWidth;
123 const ColumnFormat *Format = getColumnFormat(RemainingCodePoints);
132 unsigned Penalty = 0;
135 while (State.NextToken != LBrace->MatchingParen) {
136 bool NewLine =
false;
137 unsigned ExtraSpaces = 0;
140 if (Item < Commas.size() && State.NextToken->Previous == Commas[Item]) {
141 if (!State.NextToken->isTrailingComment()) {
142 ExtraSpaces += Format->ColumnSizes[
Column] - ItemLengths[Item];
148 if (
Column == Format->Columns || State.NextToken->MustBreakBefore) {
154 Penalty += Indenter->addTokenToState(State, NewLine, DryRun, ExtraSpaces);
160 ContinuationIndenter *Indenter,
164 if (Formats.size() == 1 || HasNestedBracedList)
165 State.Stack.back().AvoidBinPacking =
true;
179 if (!
Token->MatchingParen ||
180 !
Token->
isOneOf(tok::l_brace, TT_ArrayInitializerLSquare)) {
187 if (
Style.Cpp11BracedListStyle && !
Style.BinPackArguments &&
188 (Commas.size() < 19 || !
Style.BinPackLongBracedList)) {
195 if (
Token->
is(TT_ArrayInitializerLSquare) && Commas.size() < 19)
199 if (
Style.AlignAfterOpenBracket == FormatStyle::BAS_DontAlign)
203 while (ItemBegin->isTrailingComment())
204 ItemBegin = ItemBegin->Next;
210 MustBreakBeforeItem.reserve(Commas.size() + 1);
211 EndOfLineItemLength.reserve(Commas.size() + 1);
212 ItemLengths.reserve(Commas.size() + 1);
214 bool HasSeparatingComment =
false;
215 for (
unsigned i = 0, e = Commas.size() + 1; i != e; ++i) {
218 while (ItemBegin->HasUnescapedNewline && ItemBegin->isTrailingComment()) {
219 ItemBegin = ItemBegin->Next;
220 HasSeparatingComment = i > 0;
223 MustBreakBeforeItem.push_back(ItemBegin->MustBreakBefore);
224 if (ItemBegin->is(tok::l_brace))
225 HasNestedBracedList =
true;
227 if (i == Commas.size()) {
228 ItemEnd =
Token->MatchingParen;
229 const FormatToken *NonCommentEnd = ItemEnd->getPreviousNonComment();
231 if (
Style.Cpp11BracedListStyle &&
232 !ItemEnd->Previous->isTrailingComment()) {
235 while (ItemEnd->Next && !ItemEnd->Next->CanBreakBefore)
236 ItemEnd = ItemEnd->Next;
239 ItemEnd =
Token->MatchingParen->Previous;
247 if (ItemEnd->Next && !ItemEnd->Next->HasUnescapedNewline &&
248 ItemEnd->Next->isTrailingComment()) {
249 ItemEnd = ItemEnd->Next;
255 if (ItemEnd->getNextNonComment() ==
Token->MatchingParen)
257 ItemBegin = ItemEnd->Next;
262 if (Commas.size() < 5 || HasSeparatingComment)
265 if (
Token->NestingLevel != 0 &&
Token->
is(tok::l_brace) && Commas.size() < 19)
270 unsigned MaxItems =
Style.ColumnLimit / 3;
272 MinSizeInColumn.reserve(MaxItems);
273 for (
unsigned Columns = 1; Columns <= MaxItems; ++Columns) {
275 Format.Columns = Columns;
276 Format.ColumnSizes.resize(Columns);
277 MinSizeInColumn.assign(Columns,
UINT_MAX);
278 Format.LineCount = 1;
279 bool HasRowWithSufficientColumns =
false;
281 for (
unsigned i = 0, e = ItemLengths.size(); i != e; ++i) {
282 assert(i < MustBreakBeforeItem.size());
283 if (MustBreakBeforeItem[i] ||
Column == Columns) {
287 if (
Column == Columns - 1)
288 HasRowWithSufficientColumns =
true;
290 (
Column == Columns - 1) ? EndOfLineItemLength[i] : ItemLengths[i];
291 Format.ColumnSizes[
Column] = std::max(Format.ColumnSizes[
Column], Length);
292 MinSizeInColumn[
Column] = std::min(MinSizeInColumn[
Column], Length);
297 if (!HasRowWithSufficientColumns)
299 Format.TotalWidth = Columns - 1;
301 for (
unsigned i = 0; i < Columns; ++i)
302 Format.TotalWidth += Format.ColumnSizes[i];
307 for (
unsigned i = 0; i < Columns - 1; ++i)
308 if (Format.ColumnSizes[i] - MinSizeInColumn[i] > 10)
316 if (Format.TotalWidth >
Style.ColumnLimit && Columns > 1)
319 Formats.push_back(Format);
323const CommaSeparatedList::ColumnFormat *
324CommaSeparatedList::getColumnFormat(
unsigned RemainingCharacters)
const {
325 const ColumnFormat *BestFormat =
nullptr;
326 for (
const ColumnFormat &Format : llvm::reverse(Formats)) {
327 if (Format.TotalWidth <= RemainingCharacters || Format.Columns == 1) {
328 if (BestFormat && Format.LineCount > BestFormat->LineCount)
330 BestFormat = &Format;
339 if (Current.
is(TT_CtorInitializerComma) &&
340 Style.BreakConstructorInitializers == FormatStyle::BCIS_BeforeComma) {
343 if (Style.Language == FormatStyle::LK_Proto && Current.
is(TT_SelectorName))
345 if (Current.
is(TT_QtProperty))
347 return Previous.is(tok::comma) && !Current.isTrailingComment() &&
348 ((
Previous.isNot(TT_CtorInitializerComma) ||
349 Style.BreakConstructorInitializers !=
350 FormatStyle::BCIS_BeforeComma) &&
351 (
Previous.isNot(TT_InheritanceComma) ||
352 Style.BreakInheritanceList != FormatStyle::BILS_BeforeComma));
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 isOneOf(Ts... Ks) const
The base class of the type hierarchy.
The JSON file list parser is used to communicate input to InstallAPI.