clang 23.0.0git
ContinuationIndenter.cpp
Go to the documentation of this file.
1//===--- ContinuationIndenter.cpp - Format C++ code -----------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file implements the continuation indenter.
11///
12//===----------------------------------------------------------------------===//
13
15#include "BreakableToken.h"
16#include "FormatInternal.h"
17#include "FormatToken.h"
18#include "WhitespaceManager.h"
22#include "clang/Format/Format.h"
23#include "llvm/ADT/StringSet.h"
24#include "llvm/Support/Debug.h"
25#include <optional>
26
27#define DEBUG_TYPE "format-indenter"
28
29namespace clang {
30namespace format {
31
32// Returns true if a TT_SelectorName should be indented when wrapped,
33// false otherwise.
34static bool shouldIndentWrappedSelectorName(const FormatStyle &Style,
36 return Style.IndentWrappedFunctionNames || LineType == LT_ObjCMethodDecl;
37}
38
39// Returns true if a binary operator following \p Tok should be unindented when
40// the style permits it.
42 const FormatToken *Previous = Tok.getPreviousNonComment();
43 return Previous && (Previous->getPrecedence() == prec::Assignment ||
44 Previous->isOneOf(tok::kw_return, TT_RequiresClause));
45}
46
47// Returns the length of everything up to the first possible line break after
48// the ), ], } or > matching \c Tok.
51 // Normally whether or not a break before T is possible is calculated and
52 // stored in T.CanBreakBefore. Braces, array initializers and text proto
53 // messages like `key: < ... >` are an exception: a break is possible
54 // before a closing brace R if a break was inserted after the corresponding
55 // opening brace. The information about whether or not a break is needed
56 // before a closing brace R is stored in the ParenState field
57 // S.BreakBeforeClosingBrace where S is the state that R closes.
58 //
59 // In order to decide whether there can be a break before encountered right
60 // braces, this implementation iterates over the sequence of tokens and over
61 // the paren stack in lockstep, keeping track of the stack level which visited
62 // right braces correspond to in MatchingStackIndex.
63 //
64 // For example, consider:
65 // L. <- line number
66 // 1. {
67 // 2. {1},
68 // 3. {2},
69 // 4. {{3}}}
70 // ^ where we call this method with this token.
71 // The paren stack at this point contains 3 brace levels:
72 // 0. { at line 1, BreakBeforeClosingBrace: true
73 // 1. first { at line 4, BreakBeforeClosingBrace: false
74 // 2. second { at line 4, BreakBeforeClosingBrace: false,
75 // where there might be fake parens levels in-between these levels.
76 // The algorithm will start at the first } on line 4, which is the matching
77 // brace of the initial left brace and at level 2 of the stack. Then,
78 // examining BreakBeforeClosingBrace: false at level 2, it will continue to
79 // the second } on line 4, and will traverse the stack downwards until it
80 // finds the matching { on level 1. Then, examining BreakBeforeClosingBrace:
81 // false at level 1, it will continue to the third } on line 4 and will
82 // traverse the stack downwards until it finds the matching { on level 0.
83 // Then, examining BreakBeforeClosingBrace: true at level 0, the algorithm
84 // will stop and will use the second } on line 4 to determine the length to
85 // return, as in this example the range will include the tokens: {3}}
86 //
87 // The algorithm will only traverse the stack if it encounters braces, array
88 // initializer squares or text proto angle brackets.
89 if (!Tok.MatchingParen)
90 return 0;
91 FormatToken *End = Tok.MatchingParen;
92 // Maintains a stack level corresponding to the current End token.
93 int MatchingStackIndex = Stack.size() - 1;
94 // Traverses the stack downwards, looking for the level to which LBrace
95 // corresponds. Returns either a pointer to the matching level or nullptr if
96 // LParen is not found in the initial portion of the stack up to
97 // MatchingStackIndex.
98 auto FindParenState = [&](const FormatToken *LBrace) -> const ParenState * {
99 while (MatchingStackIndex >= 0 && Stack[MatchingStackIndex].Tok != LBrace)
100 --MatchingStackIndex;
101 return MatchingStackIndex >= 0 ? &Stack[MatchingStackIndex] : nullptr;
102 };
103 for (; End->Next; End = End->Next) {
104 if (End->Next->CanBreakBefore)
105 break;
106 if (!End->Next->closesScope())
107 continue;
108 if (End->Next->MatchingParen &&
110 tok::l_brace, TT_ArrayInitializerLSquare, tok::less)) {
111 const ParenState *State = FindParenState(End->Next->MatchingParen);
112 if (State && State->BreakBeforeClosingBrace)
113 break;
114 }
115 }
116 return End->TotalLength - Tok.TotalLength + 1;
117}
118
119static unsigned getLengthToNextOperator(const FormatToken &Tok) {
120 if (!Tok.NextOperator)
121 return 0;
122 return Tok.NextOperator->TotalLength - Tok.TotalLength;
123}
124
125// Returns \c true if \c Tok is the "." or "->" of a call and starts the next
126// segment of a builder type call.
128 return Tok.isMemberAccess() && Tok.Previous && Tok.Previous->closesScope();
129}
130
131// Returns \c true if \c Token in an alignable binary operator
133 // No need to align binary operators that only have two operands.
134 bool HasTwoOperands = Token.OperatorIndex == 0 && !Token.NextOperator;
135 return Token.is(TT_BinaryOperator) && !HasTwoOperands &&
136 Token.getPrecedence() > prec::Conditional &&
137 Token.getPrecedence() < prec::PointerToMember;
138}
139
140// Returns \c true if \c Current starts the next operand in a binary operation.
141static bool startsNextOperand(const FormatToken &Current) {
142 assert(Current.Previous);
143 const auto &Previous = *Current.Previous;
144 return isAlignableBinaryOperator(Previous) && !Current.isTrailingComment();
145}
146
147// Returns the number of operands in the chain containing \c Op.
148// For example, `a && b && c` has 3 operands (and 2 operators).
149static unsigned getChainLength(const FormatToken &Op) {
150 const FormatToken *Last = &Op;
151 while (Last->NextOperator)
152 Last = Last->NextOperator;
153 return Last->OperatorIndex + 2;
154}
155
156// Returns \c true if \c Current is a binary operation that must break.
157static bool mustBreakBinaryOperation(const FormatToken &Current,
158 const FormatStyle &Style) {
159 if (!Current.CanBreakBefore)
160 return false;
161
162 // Determine the operator token: when breaking after the operator,
163 // it is Current.Previous; when breaking before, it is Current itself.
164 bool BreakBefore = Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None;
165 const FormatToken *OpToken = BreakBefore ? &Current : Current.Previous;
166
167 if (!OpToken)
168 return false;
169
170 // Check that this is an alignable binary operator.
171 if (BreakBefore) {
172 if (!isAlignableBinaryOperator(Current))
173 return false;
174 } else if (!startsNextOperand(Current)) {
175 return false;
176 }
177
178 // Look up per-operator rule or fall back to Default.
179 const auto OperatorBreakStyle =
180 Style.BreakBinaryOperations.getStyleForOperator(OpToken->Tok.getKind());
181 if (OperatorBreakStyle == FormatStyle::BBO_Never)
182 return false;
183
184 // Check MinChainLength: if the chain is too short, don't force a break.
185 const unsigned MinChain =
186 Style.BreakBinaryOperations.getMinChainLengthForOperator(
187 OpToken->Tok.getKind());
188 return MinChain == 0 || getChainLength(*OpToken) >= MinChain;
189}
190
191static bool opensProtoMessageField(const FormatToken &LessTok,
192 const FormatStyle &Style) {
193 if (LessTok.isNot(tok::less))
194 return false;
195 return Style.isTextProto() ||
196 (Style.Language == FormatStyle::LK_Proto &&
197 (LessTok.NestingLevel > 0 ||
198 (LessTok.Previous && LessTok.Previous->is(tok::equal))));
199}
200
201// Returns the delimiter of a raw string literal, or std::nullopt if TokenText
202// is not the text of a raw string literal. The delimiter could be the empty
203// string. For example, the delimiter of R"deli(cont)deli" is deli.
204static std::optional<StringRef> getRawStringDelimiter(StringRef TokenText) {
205 if (TokenText.size() < 5 // The smallest raw string possible is 'R"()"'.
206 || !TokenText.starts_with("R\"") || !TokenText.ends_with("\"")) {
207 return std::nullopt;
208 }
209
210 // A raw string starts with 'R"<delimiter>(' and delimiter is ascii and has
211 // size at most 16 by the standard, so the first '(' must be among the first
212 // 19 bytes.
213 size_t LParenPos = TokenText.substr(0, 19).find_first_of('(');
214 if (LParenPos == StringRef::npos)
215 return std::nullopt;
216 StringRef Delimiter = TokenText.substr(2, LParenPos - 2);
217
218 // Check that the string ends in ')Delimiter"'.
219 size_t RParenPos = TokenText.size() - Delimiter.size() - 2;
220 if (TokenText[RParenPos] != ')')
221 return std::nullopt;
222 if (!TokenText.substr(RParenPos + 1).starts_with(Delimiter))
223 return std::nullopt;
224 return Delimiter;
225}
226
227// Returns the canonical delimiter for \p Language, or the empty string if no
228// canonical delimiter is specified.
229static StringRef
230getCanonicalRawStringDelimiter(const FormatStyle &Style,
231 FormatStyle::LanguageKind Language) {
232 for (const auto &Format : Style.RawStringFormats)
233 if (Format.Language == Language)
234 return StringRef(Format.CanonicalDelimiter);
235 return "";
236}
237
239 const FormatStyle &CodeStyle) {
240 for (const auto &RawStringFormat : CodeStyle.RawStringFormats) {
241 std::optional<FormatStyle> LanguageStyle =
242 CodeStyle.GetLanguageStyle(RawStringFormat.Language);
243 if (!LanguageStyle) {
244 FormatStyle PredefinedStyle;
246 RawStringFormat.Language, &PredefinedStyle)) {
247 PredefinedStyle = getLLVMStyle();
248 PredefinedStyle.Language = RawStringFormat.Language;
249 }
250 LanguageStyle = PredefinedStyle;
251 }
252 LanguageStyle->ColumnLimit = CodeStyle.ColumnLimit;
253 for (StringRef Delimiter : RawStringFormat.Delimiters)
254 DelimiterStyle.insert({Delimiter, *LanguageStyle});
255 for (StringRef EnclosingFunction : RawStringFormat.EnclosingFunctions)
256 EnclosingFunctionStyle.insert({EnclosingFunction, *LanguageStyle});
257 }
258}
259
260std::optional<FormatStyle>
262 auto It = DelimiterStyle.find(Delimiter);
263 if (It == DelimiterStyle.end())
264 return std::nullopt;
265 return It->second;
266}
267
268std::optional<FormatStyle>
270 StringRef EnclosingFunction) const {
271 auto It = EnclosingFunctionStyle.find(EnclosingFunction);
272 if (It == EnclosingFunctionStyle.end())
273 return std::nullopt;
274 return It->second;
275}
276
280}
281
284 return IndentationAndAlignment(Total + Spaces, Total);
285}
286
289 return IndentationAndAlignment(Total - Spaces, Total);
290}
291
293 *this = *this + Spaces;
294 return *this;
295}
296
300
302 : Total(Spaces), IndentedFrom(Spaces) {}
303
305 const IndentationAndAlignment &Other) const {
306 if (Total != Other.Total)
307 return Total < Other.Total;
308 // The sign to use here was decided arbitrarily. This operator is mostly used
309 // when a line's indentation should be the max of 2 things. Using this sign
310 // here makes the program prefer alignment over continuation indentation. That
311 // is, it makes the alignment step that follows prefer to move the line when
312 // aligning the previous line.
313 return IndentedFrom > Other.IndentedFrom;
314}
315
317 const AdditionalKeywords &Keywords,
318 const SourceManager &SourceMgr,
319 WhitespaceManager &Whitespaces,
320 encoding::Encoding Encoding,
321 bool BinPackInconclusiveFunctions)
322 : Style(Style), Keywords(Keywords), SourceMgr(SourceMgr),
323 Whitespaces(Whitespaces), Encoding(Encoding),
324 BinPackInconclusiveFunctions(BinPackInconclusiveFunctions),
325 CommentPragmasRegex(Style.CommentPragmas), RawStringFormats(Style) {}
326
328 unsigned FirstStartColumn,
329 const AnnotatedLine *Line,
330 bool DryRun) {
331 LineState State;
332 State.FirstIndent = FirstIndent;
333 if (FirstStartColumn && Line->First->NewlinesBefore == 0)
334 State.Column = FirstStartColumn;
335 else
336 State.Column = FirstIndent;
337 // With preprocessor directive indentation, the line starts on column 0
338 // since it's indented after the hash, but FirstIndent is set to the
339 // preprocessor indent.
340 if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash &&
341 (Line->Type == LT_PreprocessorDirective ||
342 Line->Type == LT_ImportStatement)) {
343 State.Column = 0;
344 }
345 State.Line = Line;
346 State.NextToken = Line->First;
347 State.Stack.push_back(ParenState(/*Tok=*/nullptr, FirstIndent, FirstIndent,
348 /*AvoidBinPacking=*/false,
349 /*NoLineBreak=*/false));
350 State.NoContinuation = false;
351 State.StartOfStringLiteral = 0;
352 State.NoLineBreak = false;
353 State.StartOfLineLevel = 0;
354 State.LowestLevelOnLine = 0;
355 State.IgnoreStackForComparison = false;
356
357 if (Style.isTextProto()) {
358 // We need this in order to deal with the bin packing of text fields at
359 // global scope.
360 auto &CurrentState = State.Stack.back();
361 CurrentState.AvoidBinPacking = true;
362 CurrentState.BreakBeforeParameter = true;
363 CurrentState.AlignColons = false;
364 }
365
366 // The first token has already been indented and thus consumed.
367 moveStateToNextToken(State, DryRun, /*Newline=*/false);
368 return State;
369}
370
372 const FormatToken &Current = *State.NextToken;
373 const FormatToken &Previous = *Current.Previous;
374 const auto &CurrentState = State.Stack.back();
375 assert(&Previous == Current.Previous);
376 if (!Current.CanBreakBefore && !(CurrentState.BreakBeforeClosingBrace &&
377 Current.closesBlockOrBlockTypeList(Style))) {
378 return false;
379 }
380 // The opening "{" of a braced list has to be on the same line as the first
381 // element if it is nested in another braced init list or function call.
382 if (!Current.MustBreakBefore && Previous.is(tok::l_brace) &&
383 Previous.isNot(TT_DictLiteral) && Previous.is(BK_BracedInit) &&
384 Previous.Previous &&
385 Previous.Previous->isOneOf(tok::l_brace, tok::l_paren, tok::comma)) {
386 return false;
387 }
388 // This prevents breaks like:
389 // ...
390 // SomeParameter, OtherParameter).DoSomething(
391 // ...
392 // As they hide "DoSomething" and are generally bad for readability.
393 if (Previous.opensScope() && Previous.isNot(tok::l_brace) &&
394 State.LowestLevelOnLine < State.StartOfLineLevel &&
395 State.LowestLevelOnLine < Current.NestingLevel) {
396 return false;
397 }
398 if (Current.isMemberAccess() && CurrentState.ContainsUnwrappedBuilder)
399 return false;
400
401 // Don't create a 'hanging' indent if there are multiple blocks in a single
402 // statement and we are aligning lambda blocks to their signatures.
403 if (Previous.is(tok::l_brace) && State.Stack.size() > 1 &&
404 State.Stack[State.Stack.size() - 2].NestedBlockInlined &&
405 State.Stack[State.Stack.size() - 2].HasMultipleNestedBlocks) {
406 return Style.isCpp() &&
407 Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope;
408 }
409
410 // Don't break after very short return types (e.g. "void") as that is often
411 // unexpected.
412 if (Current.is(TT_FunctionDeclarationName)) {
413 if (Style.BreakAfterReturnType == FormatStyle::RTBS_None &&
414 State.Column < 6) {
415 return false;
416 }
417
418 if (Style.BreakAfterReturnType == FormatStyle::RTBS_ExceptShortType) {
419 assert(State.Column >= State.FirstIndent);
420 if (State.Column - State.FirstIndent < 6)
421 return false;
422 }
423 }
424
425 // Don't allow breaking before a closing brace of a block-indented braced list
426 // initializer if there isn't already a break.
427 if (Current.is(tok::r_brace) && Current.MatchingParen &&
428 Current.isBlockIndentedInitRBrace(Style)) {
429 return CurrentState.BreakBeforeClosingBrace;
430 }
431
432 // Check need to break before the right parens if there was a break after
433 // the left parens, which is tracked by BreakBeforeClosingParen.
434 if ((Style.BreakBeforeCloseBracketFunction ||
435 Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop ||
436 Style.BreakBeforeCloseBracketSwitch) &&
437 Current.is(tok::r_paren)) {
438 return CurrentState.BreakBeforeClosingParen;
439 }
440
441 if (Style.BreakBeforeTemplateCloser && Current.is(TT_TemplateCloser))
442 return CurrentState.BreakBeforeClosingAngle;
443
444 // If binary operators are moved to the next line (including commas for some
445 // styles of constructor initializers), that's always ok.
446 if (Current.isNoneOf(TT_BinaryOperator, tok::comma) &&
447 // Allow breaking opening brace of lambdas (when passed as function
448 // arguments) to a new line when BeforeLambdaBody brace wrapping is
449 // enabled.
450 (!Style.BraceWrapping.BeforeLambdaBody ||
451 Current.isNot(TT_LambdaLBrace)) &&
452 CurrentState.NoLineBreakInOperand) {
453 return false;
454 }
455
456 if (Previous.is(tok::l_square) && Previous.is(TT_ObjCMethodExpr))
457 return false;
458
459 if (Current.is(TT_ConditionalExpr) && Previous.is(tok::r_paren) &&
460 Previous.MatchingParen && Previous.MatchingParen->Previous &&
461 Previous.MatchingParen->Previous->MatchingParen &&
462 Previous.MatchingParen->Previous->MatchingParen->is(TT_LambdaLBrace)) {
463 // We have a lambda within a conditional expression, allow breaking here.
464 assert(Previous.MatchingParen->Previous->is(tok::r_brace));
465 return true;
466 }
467
468 return !State.NoLineBreak && !CurrentState.NoLineBreak;
469}
470
472 const FormatToken &Current = *State.NextToken;
473 const FormatToken &Previous = *Current.Previous;
474 const auto &CurrentState = State.Stack.back();
475 if (Style.BraceWrapping.BeforeLambdaBody && Current.CanBreakBefore &&
476 Current.is(TT_LambdaLBrace) && Previous.isNot(TT_LineComment)) {
477 auto LambdaBodyLength = getLengthToMatchingParen(Current, State.Stack);
478 return LambdaBodyLength > getColumnLimit(State);
479 }
480 if (Current.MustBreakBefore ||
481 (Current.is(TT_InlineASMColon) &&
482 (Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_Always ||
483 (Style.BreakBeforeInlineASMColon == FormatStyle::BBIAS_OnlyMultiline &&
484 Style.ColumnLimit > 0)))) {
485 return true;
486 }
487 if (CurrentState.BreakBeforeClosingBrace &&
488 (Current.closesBlockOrBlockTypeList(Style) ||
489 (Current.is(tok::r_brace) && Current.MatchingParen &&
490 Current.isBlockIndentedInitRBrace(Style)))) {
491 return true;
492 }
493 if (CurrentState.BreakBeforeClosingParen && Current.is(tok::r_paren))
494 return true;
495 if (CurrentState.BreakBeforeClosingAngle && Current.is(TT_TemplateCloser))
496 return true;
497 if (Style.Language == FormatStyle::LK_ObjC &&
498 Style.ObjCBreakBeforeNestedBlockParam &&
499 Current.ObjCSelectorNameParts > 1 &&
500 Current.startsSequence(TT_SelectorName, tok::colon, tok::caret)) {
501 return true;
502 }
503 // Avoid producing inconsistent states by requiring breaks where they are not
504 // permitted for C# generic type constraints.
505 if (CurrentState.IsCSharpGenericTypeConstraint &&
506 Previous.isNot(TT_CSharpGenericTypeConstraintComma)) {
507 return false;
508 }
509 if ((startsNextParameter(Current, Style) || Previous.is(tok::semi) ||
510 (Previous.is(TT_TemplateCloser) && Current.is(TT_StartOfName) &&
511 State.Line->First->isNot(TT_AttributeLSquare) && Style.isCpp() &&
512 // FIXME: This is a temporary workaround for the case where clang-format
513 // sets BreakBeforeParameter to avoid bin packing and this creates a
514 // completely unnecessary line break after a template type that isn't
515 // line-wrapped.
516 (Previous.NestingLevel == 1 ||
517 Style.BinPackParameters == FormatStyle::BPPS_BinPack)) ||
518 (Style.BreakBeforeTernaryOperators && Current.is(TT_ConditionalExpr) &&
519 Previous.isNot(tok::question)) ||
520 (!Style.BreakBeforeTernaryOperators &&
521 Previous.is(TT_ConditionalExpr))) &&
522 CurrentState.BreakBeforeParameter && !Current.isTrailingComment() &&
523 Current.isNoneOf(tok::r_paren, tok::r_brace)) {
524 return true;
525 }
526 if (CurrentState.IsChainedConditional &&
527 ((Style.BreakBeforeTernaryOperators && Current.is(TT_ConditionalExpr) &&
528 Current.is(tok::colon)) ||
529 (!Style.BreakBeforeTernaryOperators && Previous.is(TT_ConditionalExpr) &&
530 Previous.is(tok::colon)))) {
531 return true;
532 }
533 if (((Previous.is(TT_DictLiteral) && Previous.is(tok::l_brace)) ||
534 (Previous.is(TT_ArrayInitializerLSquare) &&
535 Previous.ParameterCount > 1) ||
537 Style.ColumnLimit > 0 &&
538 getLengthToMatchingParen(Previous, State.Stack) + State.Column - 1 >
539 getColumnLimit(State)) {
540 return true;
541 }
542
543 const FormatToken &BreakConstructorInitializersToken =
544 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon
545 ? Previous
546 : Current;
547 if (Style.BreakConstructorInitializers != FormatStyle::BCIS_AfterComma &&
548 BreakConstructorInitializersToken.is(TT_CtorInitializerColon) &&
549 (State.Column + State.Line->Last->TotalLength - Previous.TotalLength >
550 getColumnLimit(State) ||
551 CurrentState.BreakBeforeParameter) &&
552 ((!Current.isTrailingComment() && Style.ColumnLimit > 0) ||
553 Current.NewlinesBefore > 0)) {
554 return true;
555 }
556
557 if (Current.is(TT_ObjCMethodExpr) && Previous.isNot(TT_SelectorName) &&
558 State.Line->startsWith(TT_ObjCMethodSpecifier)) {
559 return true;
560 }
561 if (Current.is(TT_SelectorName) && Previous.isNot(tok::at) &&
562 CurrentState.ObjCSelectorNameFound && CurrentState.BreakBeforeParameter &&
563 (Style.ObjCBreakBeforeNestedBlockParam ||
564 !Current.startsSequence(TT_SelectorName, tok::colon, tok::caret))) {
565 return true;
566 }
567
568 unsigned NewLineColumn = getNewLineColumn(State).Total;
569 if (Current.isMemberAccess() && Style.ColumnLimit != 0 &&
570 State.Column + getLengthToNextOperator(Current) > Style.ColumnLimit &&
571 (State.Column > NewLineColumn ||
572 Current.NestingLevel < State.StartOfLineLevel)) {
573 return true;
574 }
575
576 if (startsSegmentOfBuilderTypeCall(Current) &&
577 (CurrentState.CallContinuation != 0 ||
578 CurrentState.BreakBeforeParameter) &&
579 // JavaScript is treated different here as there is a frequent pattern:
580 // SomeFunction(function() {
581 // ...
582 // }.bind(...));
583 // FIXME: We should find a more generic solution to this problem.
584 !(State.Column <= NewLineColumn && Style.isJavaScript()) &&
585 !(Previous.closesScopeAfterBlock() && State.Column <= NewLineColumn)) {
586 return true;
587 }
588
589 // If the template declaration spans multiple lines, force wrap before the
590 // function/class declaration.
591 if (Previous.ClosesTemplateDeclaration && CurrentState.BreakBeforeParameter &&
592 Current.CanBreakBefore) {
593 return true;
594 }
595
596 if (State.Line->First->isNot(tok::kw_enum) && State.Column <= NewLineColumn)
597 return false;
598
599 if (Style.AlwaysBreakBeforeMultilineStrings &&
600 (NewLineColumn == State.FirstIndent + Style.ContinuationIndentWidth ||
601 Previous.is(tok::comma) || Current.NestingLevel < 2) &&
602 Previous.isNoneOf(tok::kw_return, tok::lessless, tok::at,
603 Keywords.kw_dollar) &&
604 Previous.isNoneOf(TT_InlineASMColon, TT_ConditionalExpr) &&
605 nextIsMultilineString(State)) {
606 return true;
607 }
608
609 // Using CanBreakBefore here and below takes care of the decision whether the
610 // current style uses wrapping before or after operators for the given
611 // operator.
612 if (Previous.is(TT_BinaryOperator) && Current.CanBreakBefore) {
613 const auto PreviousPrecedence = Previous.getPrecedence();
614 if (PreviousPrecedence != prec::Assignment &&
615 CurrentState.BreakBeforeParameter && !Current.isTrailingComment()) {
616 const bool LHSIsBinaryExpr =
617 Previous.Previous && Previous.Previous->EndsBinaryExpression;
618 if (LHSIsBinaryExpr)
619 return true;
620 // If we need to break somewhere inside the LHS of a binary expression, we
621 // should also break after the operator. Otherwise, the formatting would
622 // hide the operator precedence, e.g. in:
623 // if (aaaaaaaaaaaaaa ==
624 // bbbbbbbbbbbbbb && c) {..
625 // For comparisons, we only apply this rule, if the LHS is a binary
626 // expression itself as otherwise, the line breaks seem superfluous.
627 // We need special cases for ">>" which we have split into two ">" while
628 // lexing in order to make template parsing easier.
629 const bool IsComparison =
630 (PreviousPrecedence == prec::Relational ||
631 PreviousPrecedence == prec::Equality ||
632 PreviousPrecedence == prec::Spaceship) &&
633 Previous.Previous &&
634 Previous.Previous->isNot(TT_BinaryOperator); // For >>.
635 if (!IsComparison)
636 return true;
637 }
638 } else if (Current.is(TT_BinaryOperator) && Current.CanBreakBefore &&
639 Current.getPrecedence() != prec::Assignment &&
640 CurrentState.BreakBeforeParameter) {
641 return true;
642 }
643
644 // Same as above, but for the first "<<" operator.
645 if (Current.is(tok::lessless) && Current.isNot(TT_OverloadedOperator) &&
646 CurrentState.BreakBeforeParameter && CurrentState.FirstLessLess == 0) {
647 return true;
648 }
649
650 if (Current.NestingLevel == 0 && !Current.isTrailingComment()) {
651 // Always break after "template <...>"(*) and leading annotations. This is
652 // only for cases where the entire line does not fit on a single line as a
653 // different LineFormatter would be used otherwise.
654 // *: Except when another option interferes with that, like concepts.
655 if (Previous.ClosesTemplateDeclaration) {
656 if (Current.is(tok::kw_concept)) {
657 switch (Style.BreakBeforeConceptDeclarations) {
658 case FormatStyle::BBCDS_Allowed:
659 break;
660 case FormatStyle::BBCDS_Always:
661 return true;
662 case FormatStyle::BBCDS_Never:
663 return false;
664 }
665 }
666 if (Current.is(TT_RequiresClause)) {
667 switch (Style.RequiresClausePosition) {
668 case FormatStyle::RCPS_SingleLine:
669 case FormatStyle::RCPS_WithPreceding:
670 return false;
671 default:
672 return true;
673 }
674 }
675 return Style.BreakTemplateDeclarations != FormatStyle::BTDS_No &&
676 (Style.BreakTemplateDeclarations != FormatStyle::BTDS_Leave ||
677 Current.NewlinesBefore > 0);
678 }
679 if (Previous.is(TT_FunctionAnnotationRParen) &&
680 State.Line->Type != LT_PreprocessorDirective) {
681 return true;
682 }
683 if (Previous.is(TT_LeadingJavaAnnotation) && Current.isNot(tok::l_paren) &&
684 Current.isNot(TT_LeadingJavaAnnotation)) {
685 return true;
686 }
687 }
688
689 if (Style.isJavaScript() && Previous.is(tok::r_paren) &&
690 Previous.is(TT_JavaAnnotation)) {
691 // Break after the closing parenthesis of TypeScript decorators before
692 // functions, getters and setters.
693 static const llvm::StringSet<> BreakBeforeDecoratedTokens = {"get", "set",
694 "function"};
695 if (BreakBeforeDecoratedTokens.contains(Current.TokenText))
696 return true;
697 }
698
699 if (Current.is(TT_FunctionDeclarationName) &&
700 !State.Line->ReturnTypeWrapped &&
701 // Don't break before a C# function when no break after return type.
702 (!Style.isCSharp() ||
703 Style.BreakAfterReturnType > FormatStyle::RTBS_ExceptShortType) &&
704 // Don't always break between a JavaScript `function` and the function
705 // name.
706 !Style.isJavaScript() && Previous.isNot(tok::kw_template) &&
707 CurrentState.BreakBeforeParameter) {
708 for (const auto *Tok = &Previous; Tok; Tok = Tok->Previous) {
709 if (Tok->is(TT_LineComment))
710 return false;
711 if (Tok->is(TT_TemplateCloser)) {
712 Tok = Tok->MatchingParen;
713 if (!Tok)
714 return false;
715 }
716 if (Tok->FirstAfterPPLine)
717 return false;
718 }
719
720 return true;
721 }
722
723 // The following could be precomputed as they do not depend on the state.
724 // However, as they should take effect only if the UnwrappedLine does not fit
725 // into the ColumnLimit, they are checked here in the ContinuationIndenter.
726 if (Style.ColumnLimit != 0 && Previous.is(BK_Block) &&
727 Previous.is(tok::l_brace) &&
728 Current.isNoneOf(tok::r_brace, tok::comment)) {
729 return true;
730 }
731
732 if (Current.is(tok::lessless) &&
733 ((Previous.is(tok::identifier) && Previous.TokenText == "endl") ||
734 (Previous.Tok.isLiteral() && (Previous.TokenText.ends_with("\\n\"") ||
735 Previous.TokenText == "\'\\n\'")))) {
736 return true;
737 }
738
739 if (Previous.is(TT_BlockComment) && Previous.IsMultiline)
740 return true;
741
742 if (State.NoContinuation)
743 return true;
744
745 return false;
746}
747
749 bool DryRun,
750 unsigned ExtraSpaces) {
751 const FormatToken &Current = *State.NextToken;
752 assert(State.NextToken->Previous);
753 const FormatToken &Previous = *State.NextToken->Previous;
754
755 assert(!State.Stack.empty());
756 State.NoContinuation = false;
757
758 if (Current.is(TT_ImplicitStringLiteral) &&
759 (!Previous.Tok.getIdentifierInfo() ||
760 Previous.Tok.getIdentifierInfo()->getPPKeywordID() ==
761 tok::pp_not_keyword)) {
762 unsigned EndColumn =
763 SourceMgr.getSpellingColumnNumber(Current.WhitespaceRange.getEnd());
764 if (Current.LastNewlineOffset != 0) {
765 // If there is a newline within this token, the final column will solely
766 // determined by the current end column.
767 State.Column = EndColumn;
768 } else {
769 unsigned StartColumn =
770 SourceMgr.getSpellingColumnNumber(Current.WhitespaceRange.getBegin());
771 assert(EndColumn >= StartColumn);
772 State.Column += EndColumn - StartColumn;
773 }
774 moveStateToNextToken(State, DryRun, /*Newline=*/false);
775 return 0;
776 }
777
778 unsigned Penalty = 0;
779 if (Newline)
780 Penalty = addTokenOnNewLine(State, DryRun);
781 else
782 addTokenOnCurrentLine(State, DryRun, ExtraSpaces);
783
784 return moveStateToNextToken(State, DryRun, Newline) + Penalty;
785}
786
787void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
788 unsigned ExtraSpaces) {
789 FormatToken &Current = *State.NextToken;
790 assert(State.NextToken->Previous);
791 const FormatToken &Previous = *State.NextToken->Previous;
792 auto &CurrentState = State.Stack.back();
793
794 // Deal with lambda arguments in C++. The aim here is to ensure that we don't
795 // over-indent lambda function bodies when lambdas are passed as arguments to
796 // function calls. We do this by ensuring that either all arguments (including
797 // any lambdas) go on the same line as the function call, or we break before
798 // the first argument.
799 auto DisallowLineBreaks = [&] {
800 if (!Style.isCpp() ||
801 Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope) {
802 return false;
803 }
804
805 // For example, `/*Newline=*/false`.
806 if (Previous.is(TT_BlockComment) && Current.SpacesRequiredBefore == 0)
807 return false;
808
809 if (Current.isOneOf(tok::comment, tok::l_paren, TT_LambdaLSquare))
810 return false;
811
812 const auto *Prev = Current.getPreviousNonComment();
813 if (!Prev || Prev->isNot(tok::l_paren))
814 return false;
815
816 if (Prev->BlockParameterCount == 0)
817 return false;
818
819 // Multiple lambdas in the same function call.
820 if (Prev->BlockParameterCount > 1)
821 return true;
822
823 // A lambda followed by another arg.
824 if (!Prev->Role)
825 return false;
826
827 const auto *Comma = Prev->Role->lastComma();
828 if (!Comma)
829 return false;
830
831 const auto *Next = Comma->getNextNonComment();
832 return Next && Next->isNoneOf(TT_LambdaLSquare, tok::l_brace, tok::caret);
833 };
834
835 if (DisallowLineBreaks())
836 State.NoLineBreak = true;
837
838 if (Current.is(tok::equal) &&
839 (State.Line->First->is(tok::kw_for) || Current.NestingLevel == 0) &&
840 CurrentState.VariablePos == 0 &&
841 (!Previous.Previous ||
842 Previous.Previous->isNot(TT_DesignatedInitializerPeriod))) {
843 CurrentState.VariablePos = State.Column;
844 // Move over * and & if they are bound to the variable name.
845 const FormatToken *Tok = &Previous;
846 while (Tok && CurrentState.VariablePos >= Tok->ColumnWidth) {
847 CurrentState.VariablePos -= Tok->ColumnWidth;
848 if (Tok->SpacesRequiredBefore != 0)
849 break;
850 Tok = Tok->Previous;
851 }
852 if (Previous.PartOfMultiVariableDeclStmt)
853 CurrentState.LastSpace = CurrentState.VariablePos;
854 }
855
856 unsigned Spaces = Current.SpacesRequiredBefore + ExtraSpaces;
857
858 // Indent preprocessor directives after the hash if required.
859 int PPColumnCorrection = 0;
860 if (&Previous == State.Line->First && Previous.is(tok::hash) &&
862 State.Line->Type == LT_ImportStatement)) {
863 if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash) {
864 Spaces += State.FirstIndent;
865
866 // For preprocessor indent with tabs, State.Column will be 1 because of
867 // the hash. This causes second-level indents onward to have an extra
868 // space after the tabs. We avoid this misalignment by subtracting 1 from
869 // the column value passed to replaceWhitespace().
870 if (Style.UseTab != FormatStyle::UT_Never)
871 PPColumnCorrection = -1;
872 } else if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave) {
873 Spaces += Current.OriginalColumn - Previous.OriginalColumn - 1;
874 }
875 }
876
877 if (!DryRun) {
878 const bool ContinuePPDirective =
879 State.Line->InMacroBody && Current.isNot(TT_LineComment);
880 Whitespaces.replaceWhitespace(Current, /*Newlines=*/0, Spaces,
881 State.Column + Spaces + PPColumnCorrection,
882 /*IsAligned=*/false, ContinuePPDirective);
883 }
884
885 // If "BreakBeforeInheritanceComma" mode, don't break within the inheritance
886 // declaration unless there is multiple inheritance.
887 if (Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma &&
888 Current.is(TT_InheritanceColon)) {
889 CurrentState.NoLineBreak = true;
890 }
891 if (Style.BreakInheritanceList == FormatStyle::BILS_AfterColon &&
892 Previous.is(TT_InheritanceColon)) {
893 CurrentState.NoLineBreak = true;
894 }
895
896 if (Current.is(TT_SelectorName) && !CurrentState.ObjCSelectorNameFound) {
897 unsigned MinIndent =
898 std::max(State.FirstIndent + Style.ContinuationIndentWidth,
899 CurrentState.Indent.Total);
900 unsigned FirstColonPos = State.Column + Spaces + Current.ColumnWidth;
901 if (Current.LongestObjCSelectorName == 0)
902 CurrentState.AlignColons = false;
903 else if (MinIndent + Current.LongestObjCSelectorName > FirstColonPos)
904 CurrentState.ColonPos = MinIndent + Current.LongestObjCSelectorName;
905 else
906 CurrentState.ColonPos = FirstColonPos;
907 }
908
909 // In "AlwaysBreak" or "BlockIndent" mode, enforce wrapping directly after the
910 // parenthesis by disallowing any further line breaks if there is no line
911 // break after the opening parenthesis. Don't break if it doesn't conserve
912 // columns.
913 auto IsOpeningBracket = [&](const FormatToken &Tok) {
914 auto IsStartOfBracedList = [&]() {
915 return Tok.is(tok::l_brace) && Tok.isNot(BK_Block) &&
916 Style.Cpp11BracedListStyle != FormatStyle::BLS_Block;
917 };
918 if (IsStartOfBracedList())
919 return Style.BreakAfterOpenBracketBracedList;
920 if (Tok.isNoneOf(tok::l_paren, TT_TemplateOpener, tok::l_square))
921 return false;
922 if (!Tok.Previous)
923 return true;
924 if (Tok.Previous->isIf())
925 return Style.BreakAfterOpenBracketIf;
926 if (Tok.Previous->isLoop(Style))
927 return Style.BreakAfterOpenBracketLoop;
928 if (Tok.Previous->is(tok::kw_switch))
929 return Style.BreakAfterOpenBracketSwitch;
930 if (Style.BreakAfterOpenBracketFunction) {
931 return !Tok.Previous->is(TT_CastRParen) &&
932 !(Style.isJavaScript() && Tok.is(Keywords.kw_await));
933 }
934 return false;
935 };
936 auto IsFunctionCallParen = [](const FormatToken &Tok) {
937 return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&
938 Tok.Previous->is(tok::identifier);
939 };
940 auto IsInTemplateString = [this](const FormatToken &Tok, bool NestBlocks) {
941 if (!Style.isJavaScript())
942 return false;
943 for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) {
944 if (Prev->is(TT_TemplateString) && Prev->opensScope())
945 return true;
946 if (Prev->opensScope() && !NestBlocks)
947 return false;
948 if (Prev->is(TT_TemplateString) && Prev->closesScope())
949 return false;
950 }
951 return false;
952 };
953 // Identifies simple (no expression) one-argument function calls.
954 auto StartsSimpleOneArgList = [&](const FormatToken &TokAfterLParen) {
955 assert(TokAfterLParen.isNot(tok::comment) || TokAfterLParen.Next);
956 const auto &Tok =
957 TokAfterLParen.is(tok::comment) ? *TokAfterLParen.Next : TokAfterLParen;
958 if (!Tok.FakeLParens.empty() && Tok.FakeLParens.back() > prec::Unknown)
959 return false;
960 // Nested calls that involve `new` expressions also look like simple
961 // function calls, eg:
962 // - foo(new Bar())
963 // - foo(::new Bar())
964 if (Tok.is(tok::kw_new) || Tok.startsSequence(tok::coloncolon, tok::kw_new))
965 return true;
966 if (Tok.is(TT_UnaryOperator) ||
967 (Style.isJavaScript() &&
968 Tok.isOneOf(tok::ellipsis, Keywords.kw_await))) {
969 return true;
970 }
971 const auto *Previous = TokAfterLParen.Previous;
972 assert(Previous); // IsOpeningBracket(Previous)
973 if (Previous->Previous &&
974 (Previous->Previous->isIf() || Previous->Previous->isLoop(Style) ||
975 Previous->Previous->is(tok::kw_switch))) {
976 return false;
977 }
978 if (Previous->isNoneOf(TT_FunctionDeclarationLParen,
979 TT_LambdaDefinitionLParen) &&
980 !IsFunctionCallParen(*Previous)) {
981 return true;
982 }
983 if (IsOpeningBracket(Tok) || IsInTemplateString(Tok, true))
984 return true;
985 const auto *Next = Tok.Next;
986 return !Next || Next->isMemberAccess() ||
987 Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next);
988 };
989 if (IsOpeningBracket(Previous) &&
990 State.Column > getNewLineColumn(State).Total &&
991 // Don't do this for simple (no expressions) one-argument function calls
992 // as that feels like needlessly wasting whitespace, e.g.:
993 //
994 // caaaaaaaaaaaall(
995 // caaaaaaaaaaaall(
996 // caaaaaaaaaaaall(
997 // caaaaaaaaaaaaaaaaaaaaaaall(aaaaaaaaaaaaaa, aaaaaaaaa))));
998 // or
999 // caaaaaaaaaaaaaaaaaaaaal(
1000 // new SomethingElseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee());
1001 !StartsSimpleOneArgList(Current)) {
1002 CurrentState.NoLineBreak = true;
1003 }
1004
1005 if (Previous.is(TT_TemplateString) && Previous.opensScope())
1006 CurrentState.NoLineBreak = true;
1007
1008 // Align following lines within parentheses / brackets if configured.
1009 // Note: This doesn't apply to macro expansion lines, which are MACRO( , , )
1010 // with args as children of the '(' and ',' tokens. It does not make sense to
1011 // align the commas with the opening paren.
1012 if (Style.AlignAfterOpenBracket &&
1013 !CurrentState.IsCSharpGenericTypeConstraint && Previous.opensScope() &&
1014 Previous.isNoneOf(TT_ObjCMethodExpr, TT_RequiresClause,
1015 TT_TableGenDAGArgOpener,
1016 TT_TableGenDAGArgOpenerToBreak) &&
1017 !(Current.MacroParent && Previous.MacroParent) &&
1018 (Current.isNot(TT_LineComment) ||
1019 (Previous.is(BK_BracedInit) &&
1020 (Style.Cpp11BracedListStyle != FormatStyle::BLS_FunctionCall ||
1021 !Previous.Previous ||
1022 Previous.Previous->isNoneOf(tok::identifier, tok::l_paren,
1023 BK_BracedInit))) ||
1024 Previous.is(TT_VerilogMultiLineListLParen)) &&
1025 !IsInTemplateString(Current, false)) {
1026 CurrentState.Indent = State.Column + Spaces;
1027 CurrentState.IsAligned = true;
1028 }
1029 if (CurrentState.AvoidBinPacking && startsNextParameter(Current, Style))
1030 CurrentState.NoLineBreak = true;
1031 if (mustBreakBinaryOperation(Current, Style))
1032 CurrentState.NoLineBreak = true;
1033
1034 if (startsSegmentOfBuilderTypeCall(Current) &&
1035 State.Column > getNewLineColumn(State).Total) {
1036 CurrentState.ContainsUnwrappedBuilder = true;
1037 }
1038
1039 if (Current.is(TT_LambdaArrow) && Style.isJava())
1040 CurrentState.NoLineBreak = true;
1041 if (Current.isMemberAccess() && Previous.is(tok::r_paren) &&
1042 (Previous.MatchingParen &&
1043 (Previous.TotalLength - Previous.MatchingParen->TotalLength > 10))) {
1044 // If there is a function call with long parameters, break before trailing
1045 // calls. This prevents things like:
1046 // EXPECT_CALL(SomeLongParameter).Times(
1047 // 2);
1048 // We don't want to do this for short parameters as they can just be
1049 // indexes.
1050 CurrentState.NoLineBreak = true;
1051 }
1052
1053 // Don't allow the RHS of an operator to be split over multiple lines unless
1054 // there is a line-break right after the operator.
1055 // Exclude relational operators, as there, it is always more desirable to
1056 // have the LHS 'left' of the RHS.
1057 const FormatToken *P = Current.getPreviousNonComment();
1058 if (Current.isNot(tok::comment) && P &&
1059 (P->isOneOf(TT_BinaryOperator, tok::comma) ||
1060 (P->is(TT_ConditionalExpr) && P->is(tok::colon))) &&
1061 P->isNoneOf(TT_OverloadedOperator, TT_CtorInitializerComma) &&
1062 P->getPrecedence() != prec::Assignment &&
1063 P->getPrecedence() != prec::Relational &&
1064 P->getPrecedence() != prec::Spaceship) {
1065 bool BreakBeforeOperator =
1066 P->MustBreakBefore || P->is(tok::lessless) ||
1067 (P->is(TT_BinaryOperator) &&
1068 Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None) ||
1069 (P->is(TT_ConditionalExpr) && Style.BreakBeforeTernaryOperators);
1070 // Don't do this if there are only two operands. In these cases, there is
1071 // always a nice vertical separation between them and the extra line break
1072 // does not help.
1073 bool HasTwoOperands = P->OperatorIndex == 0 && !P->NextOperator &&
1074 P->isNot(TT_ConditionalExpr);
1075 if ((!BreakBeforeOperator &&
1076 !(HasTwoOperands &&
1077 Style.AlignOperands != FormatStyle::OAS_DontAlign)) ||
1078 (!CurrentState.LastOperatorWrapped && BreakBeforeOperator)) {
1079 CurrentState.NoLineBreakInOperand = true;
1080 }
1081 }
1082
1083 State.Column += Spaces;
1084 if (Current.isNot(tok::comment) && Previous.is(tok::l_paren) &&
1085 Previous.Previous &&
1086 (Previous.Previous->is(tok::kw_for) || Previous.Previous->isIf())) {
1087 // Treat the condition inside an if as if it was a second function
1088 // parameter, i.e. let nested calls have a continuation indent.
1089 CurrentState.LastSpace = State.Column;
1090 CurrentState.NestedBlockIndent = State.Column;
1091 } else if (Current.isNoneOf(tok::comment, tok::caret) &&
1092 ((Previous.is(tok::comma) &&
1093 Previous.isNot(TT_OverloadedOperator)) ||
1094 (Previous.is(tok::colon) && Previous.is(TT_ObjCMethodExpr)))) {
1095 CurrentState.LastSpace = State.Column;
1096 } else if (Previous.is(TT_CtorInitializerColon) &&
1097 (!Current.isTrailingComment() || Current.NewlinesBefore > 0) &&
1098 Style.BreakConstructorInitializers ==
1099 FormatStyle::BCIS_AfterColon) {
1100 CurrentState.Indent = State.Column;
1101 CurrentState.LastSpace = State.Column;
1102 } else if (Previous.isOneOf(TT_ConditionalExpr, TT_CtorInitializerColon)) {
1103 CurrentState.LastSpace = State.Column;
1104 } else if (Previous.is(TT_BinaryOperator) &&
1105 ((Previous.getPrecedence() != prec::Assignment &&
1106 (Previous.isNot(tok::lessless) || Previous.OperatorIndex != 0 ||
1107 Previous.NextOperator)) ||
1108 Current.StartsBinaryExpression)) {
1109 // Indent relative to the RHS of the expression unless this is a simple
1110 // assignment without binary expression on the RHS.
1111 if (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None)
1112 CurrentState.LastSpace = State.Column;
1113 } else if (Previous.is(TT_InheritanceColon)) {
1114 CurrentState.Indent = State.Column;
1115 CurrentState.LastSpace = State.Column;
1116 } else if (Current.is(TT_CSharpGenericTypeConstraintColon)) {
1117 CurrentState.ColonPos = State.Column;
1118 } else if (Previous.opensScope()) {
1119 // If a function has a trailing call, indent all parameters from the
1120 // opening parenthesis. This avoids confusing indents like:
1121 // OuterFunction(InnerFunctionCall( // break
1122 // ParameterToInnerFunction)) // break
1123 // .SecondInnerFunctionCall();
1124 if (Previous.MatchingParen) {
1125 const FormatToken *Next = Previous.MatchingParen->getNextNonComment();
1126 if (Next && Next->isMemberAccess() && State.Stack.size() > 1 &&
1127 State.Stack[State.Stack.size() - 2].CallContinuation == 0) {
1128 CurrentState.LastSpace = State.Column;
1129 }
1130 }
1131 }
1132}
1133
1134unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
1135 bool DryRun) {
1136 FormatToken &Current = *State.NextToken;
1137 assert(State.NextToken->Previous);
1138 const FormatToken &Previous = *State.NextToken->Previous;
1139 auto &CurrentState = State.Stack.back();
1140
1141 // Extra penalty that needs to be added because of the way certain line
1142 // breaks are chosen.
1143 unsigned Penalty = 0;
1144
1145 const FormatToken *PreviousNonComment = Current.getPreviousNonComment();
1146 const FormatToken *NextNonComment = Previous.getNextNonComment();
1147 if (!NextNonComment)
1148 NextNonComment = &Current;
1149 // The first line break on any NestingLevel causes an extra penalty in order
1150 // prefer similar line breaks.
1151 if (!CurrentState.ContainsLineBreak)
1152 Penalty += 15;
1153 CurrentState.ContainsLineBreak = true;
1154
1155 Penalty += State.NextToken->SplitPenalty;
1156
1157 // Breaking before the first "<<" is generally not desirable if the LHS is
1158 // short. Also always add the penalty if the LHS is split over multiple lines
1159 // to avoid unnecessary line breaks that just work around this penalty.
1160 if (NextNonComment->is(tok::lessless) && CurrentState.FirstLessLess == 0 &&
1161 (State.Column <= Style.ColumnLimit / 3 ||
1162 CurrentState.BreakBeforeParameter)) {
1163 Penalty += Style.PenaltyBreakFirstLessLess;
1164 }
1165
1166 const auto [TotalColumn, IndentedFromColumn] = getNewLineColumn(State);
1167 State.Column = TotalColumn;
1168
1169 // Add Penalty proportional to amount of whitespace away from FirstColumn
1170 // This tends to penalize several lines that are far-right indented,
1171 // and prefers a line-break prior to such a block, e.g:
1172 //
1173 // Constructor() :
1174 // member(value), looooooooooooooooong_member(
1175 // looooooooooong_call(param_1, param_2, param_3))
1176 // would then become
1177 // Constructor() :
1178 // member(value),
1179 // looooooooooooooooong_member(
1180 // looooooooooong_call(param_1, param_2, param_3))
1181 if (State.Column > State.FirstIndent) {
1182 Penalty +=
1183 Style.PenaltyIndentedWhitespace * (State.Column - State.FirstIndent);
1184 }
1185
1186 // Indent nested blocks relative to this column, unless in a very specific
1187 // JavaScript special case where:
1188 //
1189 // var loooooong_name =
1190 // function() {
1191 // // code
1192 // }
1193 //
1194 // is common and should be formatted like a free-standing function. The same
1195 // goes for wrapping before the lambda return type arrow.
1196 if (Current.isNot(TT_LambdaArrow) &&
1197 (!Style.isJavaScript() || Current.NestingLevel != 0 ||
1198 !PreviousNonComment || PreviousNonComment->isNot(tok::equal) ||
1199 Current.isNoneOf(Keywords.kw_async, Keywords.kw_function))) {
1200 CurrentState.NestedBlockIndent = State.Column;
1201 }
1202
1203 if (NextNonComment->isMemberAccess()) {
1204 if (CurrentState.CallContinuation == 0)
1205 CurrentState.CallContinuation = State.Column;
1206 } else if (NextNonComment->is(TT_SelectorName)) {
1207 if (!CurrentState.ObjCSelectorNameFound) {
1208 if (NextNonComment->LongestObjCSelectorName == 0) {
1209 CurrentState.AlignColons = false;
1210 } else {
1211 CurrentState.ColonPos =
1212 (shouldIndentWrappedSelectorName(Style, State.Line->Type)
1213 ? std::max(CurrentState.Indent.Total,
1214 State.FirstIndent + Style.ContinuationIndentWidth)
1215 : CurrentState.Indent.Total) +
1216 std::max(NextNonComment->LongestObjCSelectorName,
1217 NextNonComment->ColumnWidth);
1218 }
1219 } else if (CurrentState.AlignColons &&
1220 CurrentState.ColonPos <= NextNonComment->ColumnWidth) {
1221 CurrentState.ColonPos = State.Column + NextNonComment->ColumnWidth;
1222 }
1223 } else if (PreviousNonComment && PreviousNonComment->is(tok::colon) &&
1224 PreviousNonComment->isOneOf(TT_ObjCMethodExpr, TT_DictLiteral)) {
1225 // FIXME: This is hacky, find a better way. The problem is that in an ObjC
1226 // method expression, the block should be aligned to the line starting it,
1227 // e.g.:
1228 // [aaaaaaaaaaaaaaa aaaaaaaaa: \\ break for some reason
1229 // ^(int *i) {
1230 // // ...
1231 // }];
1232 // Thus, we set LastSpace of the next higher NestingLevel, to which we move
1233 // when we consume all of the "}"'s FakeRParens at the "{".
1234 if (State.Stack.size() > 1) {
1235 State.Stack[State.Stack.size() - 2].LastSpace =
1236 std::max(CurrentState.LastSpace, CurrentState.Indent.Total) +
1237 Style.ContinuationIndentWidth;
1238 }
1239 }
1240
1241 switch (Style.BreakInheritanceList) {
1242 case FormatStyle::BILS_BeforeColon:
1243 case FormatStyle::BILS_AfterComma:
1244 CurrentState.IsAligned = CurrentState.IsAligned ||
1245 Current.is(TT_InheritanceColon) ||
1246 Previous.is(TT_InheritanceComma);
1247 break;
1248 case FormatStyle::BILS_BeforeComma:
1249 CurrentState.IsAligned =
1250 CurrentState.IsAligned ||
1251 Current.isOneOf(TT_InheritanceColon, TT_InheritanceComma);
1252 break;
1253 case FormatStyle::BILS_AfterColon:
1254 CurrentState.IsAligned =
1255 CurrentState.IsAligned ||
1256 Previous.isOneOf(TT_InheritanceColon, TT_InheritanceComma);
1257 break;
1258 }
1259
1260 if ((PreviousNonComment &&
1261 PreviousNonComment->isOneOf(tok::comma, tok::semi) &&
1262 !CurrentState.AvoidBinPacking) ||
1263 Previous.is(TT_BinaryOperator)) {
1264 CurrentState.BreakBeforeParameter = false;
1265 }
1266 if (PreviousNonComment &&
1267 (PreviousNonComment->isOneOf(TT_TemplateCloser, TT_JavaAnnotation) ||
1268 PreviousNonComment->ClosesRequiresClause) &&
1269 Current.NestingLevel == 0) {
1270 CurrentState.BreakBeforeParameter = false;
1271 }
1272 if (NextNonComment->is(tok::question) ||
1273 (PreviousNonComment && PreviousNonComment->is(tok::question))) {
1274 CurrentState.BreakBeforeParameter = true;
1275 }
1276 if (Current.is(TT_BinaryOperator) && Current.CanBreakBefore) {
1277 CurrentState.BreakBeforeParameter = false;
1278 CurrentState.IsAligned = true;
1279 }
1280
1281 if (!DryRun) {
1282 unsigned MaxEmptyLinesToKeep = Style.MaxEmptyLinesToKeep + 1;
1283 if (Current.is(tok::r_brace) && Current.MatchingParen &&
1284 // Only strip trailing empty lines for l_braces that have children, i.e.
1285 // for function expressions (lambdas, arrows, etc).
1286 !Current.MatchingParen->Children.empty()) {
1287 // lambdas and arrow functions are expressions, thus their r_brace is not
1288 // on its own line, and thus not covered by UnwrappedLineFormatter's logic
1289 // about removing empty lines on closing blocks. Special case them here.
1291 }
1292 const unsigned Newlines =
1293 std::max(1u, std::min(Current.NewlinesBefore, MaxEmptyLinesToKeep));
1294 const bool ContinuePPDirective = State.Line->InPPDirective &&
1295 State.Line->Type != LT_ImportStatement &&
1296 Current.isNot(TT_LineComment);
1297 Whitespaces.replaceWhitespace(Current, Newlines, State.Column, State.Column,
1298 CurrentState.IsAligned, ContinuePPDirective,
1299 IndentedFromColumn);
1300 }
1301
1302 if (!Current.isTrailingComment())
1303 CurrentState.LastSpace = State.Column;
1304 if (Current.is(tok::lessless)) {
1305 // If we are breaking before a "<<", we always want to indent relative to
1306 // RHS. This is necessary only for "<<", as we special-case it and don't
1307 // always indent relative to the RHS.
1308 CurrentState.LastSpace += 3; // 3 -> width of "<< ".
1309 }
1310
1311 State.StartOfLineLevel = Current.NestingLevel;
1312 State.LowestLevelOnLine = Current.NestingLevel;
1313
1314 // Any break on this level means that the parent level has been broken
1315 // and we need to avoid bin packing there.
1316 bool NestedBlockSpecialCase =
1317 (!Style.isCpp() && Current.is(tok::r_brace) && State.Stack.size() > 1 &&
1318 State.Stack[State.Stack.size() - 2].NestedBlockInlined) ||
1319 (Style.Language == FormatStyle::LK_ObjC && Current.is(tok::r_brace) &&
1320 State.Stack.size() > 1 && !Style.ObjCBreakBeforeNestedBlockParam);
1321 // Do not force parameter break for statements with requires expressions.
1322 NestedBlockSpecialCase =
1323 NestedBlockSpecialCase ||
1324 (Current.MatchingParen &&
1325 Current.MatchingParen->is(TT_RequiresExpressionLBrace));
1326 if (!NestedBlockSpecialCase) {
1327 auto ParentLevelIt = std::next(State.Stack.rbegin());
1328 if (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope &&
1329 Current.MatchingParen && Current.MatchingParen->is(TT_LambdaLBrace)) {
1330 // If the first character on the new line is a lambda's closing brace, the
1331 // stack still contains that lambda's parenthesis. As such, we need to
1332 // recurse further down the stack than usual to find the parenthesis level
1333 // containing the lambda, which is where we want to set
1334 // BreakBeforeParameter.
1335 //
1336 // We specifically special case "OuterScope"-formatted lambdas here
1337 // because, when using that setting, breaking before the parameter
1338 // directly following the lambda is particularly unsightly. However, when
1339 // "OuterScope" is not set, the logic to find the parent parenthesis level
1340 // still appears to be sometimes incorrect. It has not been fixed yet
1341 // because it would lead to significant changes in existing behaviour.
1342 //
1343 // TODO: fix the non-"OuterScope" case too.
1344 auto FindCurrentLevel = [&](const auto &It) {
1345 return std::find_if(It, State.Stack.rend(), [](const auto &PState) {
1346 return PState.Tok != nullptr; // Ignore fake parens.
1347 });
1348 };
1349 auto MaybeIncrement = [&](const auto &It) {
1350 return It != State.Stack.rend() ? std::next(It) : It;
1351 };
1352 auto LambdaLevelIt = FindCurrentLevel(State.Stack.rbegin());
1353 auto LevelContainingLambdaIt =
1354 FindCurrentLevel(MaybeIncrement(LambdaLevelIt));
1355 ParentLevelIt = MaybeIncrement(LevelContainingLambdaIt);
1356 }
1357 for (auto I = ParentLevelIt, E = State.Stack.rend(); I != E; ++I)
1358 I->BreakBeforeParameter = true;
1359 }
1360
1361 if (PreviousNonComment &&
1362 PreviousNonComment->isNoneOf(tok::comma, tok::colon, tok::semi) &&
1363 ((PreviousNonComment->isNot(TT_TemplateCloser) &&
1364 !PreviousNonComment->ClosesRequiresClause) ||
1365 Current.NestingLevel != 0) &&
1366 PreviousNonComment->isNoneOf(
1367 TT_BinaryOperator, TT_FunctionAnnotationRParen, TT_JavaAnnotation,
1368 TT_LeadingJavaAnnotation) &&
1369 Current.isNot(TT_BinaryOperator) && !PreviousNonComment->opensScope() &&
1370 // We don't want to enforce line breaks for subsequent arguments just
1371 // because we have been forced to break before a lambda body.
1372 (!Style.BraceWrapping.BeforeLambdaBody ||
1373 Current.isNot(TT_LambdaLBrace))) {
1374 CurrentState.BreakBeforeParameter = true;
1375 }
1376
1377 // If we break after { or the [ of an array initializer, we should also break
1378 // before the corresponding } or ].
1379 if (PreviousNonComment &&
1380 (PreviousNonComment->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
1381 opensProtoMessageField(*PreviousNonComment, Style))) {
1382 CurrentState.BreakBeforeClosingBrace = true;
1383 }
1384
1385 if (PreviousNonComment && PreviousNonComment->is(tok::l_paren)) {
1386 if (auto Previous = PreviousNonComment->Previous) {
1387 if (Previous->isIf()) {
1388 CurrentState.BreakBeforeClosingParen = Style.BreakBeforeCloseBracketIf;
1389 } else if (Previous->isLoop(Style)) {
1390 CurrentState.BreakBeforeClosingParen =
1391 Style.BreakBeforeCloseBracketLoop;
1392 } else if (Previous->is(tok::kw_switch)) {
1393 CurrentState.BreakBeforeClosingParen =
1394 Style.BreakBeforeCloseBracketSwitch;
1395 } else {
1396 CurrentState.BreakBeforeClosingParen =
1397 Style.BreakBeforeCloseBracketFunction;
1398 }
1399 }
1400 }
1401
1402 if (PreviousNonComment && PreviousNonComment->is(TT_TemplateOpener))
1403 CurrentState.BreakBeforeClosingAngle = Style.BreakBeforeTemplateCloser;
1404
1405 if (CurrentState.AvoidBinPacking) {
1406 // If we are breaking after '(', '{', '<', or this is the break after a ':'
1407 // to start a member initializer list in a constructor, this should not
1408 // be considered bin packing unless the relevant AllowAll option is false or
1409 // this is a dict/object literal.
1410 bool PreviousIsBreakingCtorInitializerColon =
1411 PreviousNonComment && PreviousNonComment->is(TT_CtorInitializerColon) &&
1412 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon;
1413 bool AllowAllConstructorInitializersOnNextLine =
1414 Style.PackConstructorInitializers == FormatStyle::PCIS_NextLine ||
1415 Style.PackConstructorInitializers == FormatStyle::PCIS_NextLineOnly;
1416 if ((Previous.isNoneOf(tok::l_paren, tok::l_brace, TT_BinaryOperator) &&
1417 !PreviousIsBreakingCtorInitializerColon) ||
1418 (!Style.AllowAllParametersOfDeclarationOnNextLine &&
1419 State.Line->MustBeDeclaration) ||
1420 (!Style.AllowAllArgumentsOnNextLine &&
1421 !State.Line->MustBeDeclaration) ||
1422 (!AllowAllConstructorInitializersOnNextLine &&
1423 PreviousIsBreakingCtorInitializerColon) ||
1424 Previous.is(TT_DictLiteral)) {
1425 CurrentState.BreakBeforeParameter = true;
1426 }
1427
1428 // If we are breaking after a ':' to start a member initializer list,
1429 // and we allow all arguments on the next line, we should not break
1430 // before the next parameter.
1431 if (PreviousIsBreakingCtorInitializerColon &&
1432 AllowAllConstructorInitializersOnNextLine) {
1433 CurrentState.BreakBeforeParameter = false;
1434 }
1435 }
1436
1437 if (mustBreakBinaryOperation(Current, Style))
1438 CurrentState.BreakBeforeParameter = true;
1439
1440 return Penalty;
1441}
1442
1444ContinuationIndenter::getNewLineColumn(const LineState &State) {
1445 if (!State.NextToken || !State.NextToken->Previous)
1446 return 0;
1447
1448 FormatToken &Current = *State.NextToken;
1449 const auto &CurrentState = State.Stack.back();
1450
1451 if (CurrentState.IsCSharpGenericTypeConstraint &&
1452 Current.isNot(TT_CSharpGenericTypeConstraint)) {
1453 return CurrentState.ColonPos + 2;
1454 }
1455
1456 const FormatToken &Previous = *Current.Previous;
1457 // If we are continuing an expression, we want to use the continuation indent.
1458 const auto ContinuationIndent =
1459 std::max(IndentationAndAlignment(CurrentState.LastSpace),
1460 CurrentState.Indent) +
1461 Style.ContinuationIndentWidth;
1462 const FormatToken *PreviousNonComment = Current.getPreviousNonComment();
1463 const FormatToken *NextNonComment = Previous.getNextNonComment();
1464 if (!NextNonComment)
1465 NextNonComment = &Current;
1466
1467 // Java specific bits.
1468 if (Style.isJava() &&
1469 Current.isOneOf(Keywords.kw_implements, Keywords.kw_extends)) {
1470 return std::max(IndentationAndAlignment(CurrentState.LastSpace),
1471 CurrentState.Indent + Style.ContinuationIndentWidth);
1472 }
1473
1474 // Indentation of the statement following a Verilog case label is taken care
1475 // of in moveStateToNextToken.
1476 if (Style.isVerilog() && PreviousNonComment &&
1477 Keywords.isVerilogEndOfLabel(*PreviousNonComment)) {
1478 return State.FirstIndent;
1479 }
1480
1481 if (Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths &&
1482 State.Line->First->is(tok::kw_enum)) {
1483 return IndentationAndAlignment(Style.IndentWidth *
1484 State.Line->First->IndentLevel) +
1485 Style.IndentWidth;
1486 }
1487
1488 if (Style.BraceWrapping.BeforeLambdaBody &&
1489 Style.BraceWrapping.IndentBraces && Current.is(TT_LambdaLBrace)) {
1490 const auto From = Style.LambdaBodyIndentation == FormatStyle::LBI_Signature
1491 ? CurrentState.Indent
1492 : State.FirstIndent;
1493 return From + Style.IndentWidth;
1494 }
1495
1496 if ((NextNonComment->is(tok::l_brace) && NextNonComment->is(BK_Block)) ||
1497 (Style.isVerilog() && Keywords.isVerilogBegin(*NextNonComment))) {
1498 if (Current.NestingLevel == 0 ||
1499 (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope &&
1500 State.NextToken->is(TT_LambdaLBrace))) {
1501 return State.FirstIndent;
1502 }
1503 return CurrentState.Indent;
1504 }
1505 if (Current.is(TT_LambdaArrow) &&
1506 Previous.isOneOf(tok::kw_noexcept, tok::kw_mutable, tok::kw_constexpr,
1507 tok::kw_consteval, tok::kw_static,
1508 TT_AttributeRSquare)) {
1509 return ContinuationIndent;
1510 }
1511 if ((Current.isOneOf(tok::r_brace, tok::r_square) ||
1512 (Current.is(tok::greater) && (Style.isProto() || Style.isTableGen()))) &&
1513 State.Stack.size() > 1) {
1514 if (Current.closesBlockOrBlockTypeList(Style))
1515 return State.Stack[State.Stack.size() - 2].NestedBlockIndent;
1516 if (Current.MatchingParen && Current.MatchingParen->is(BK_BracedInit))
1517 return State.Stack[State.Stack.size() - 2].LastSpace;
1518 return State.FirstIndent;
1519 }
1520 // Indent a closing parenthesis at the previous level if followed by a semi,
1521 // const, or opening brace. This allows indentations such as:
1522 // foo(
1523 // a,
1524 // );
1525 // int Foo::getter(
1526 // //
1527 // ) const {
1528 // return foo;
1529 // }
1530 // function foo(
1531 // a,
1532 // ) {
1533 // code(); //
1534 // }
1535 if (Current.is(tok::r_paren) && State.Stack.size() > 1 &&
1536 (!Current.Next ||
1537 Current.Next->isOneOf(tok::semi, tok::kw_const, tok::l_brace))) {
1538 return State.Stack[State.Stack.size() - 2].LastSpace;
1539 }
1540 // When DAGArg closer exists top of line, it should be aligned in the similar
1541 // way as function call above.
1542 if (Style.isTableGen() && Current.is(TT_TableGenDAGArgCloser) &&
1543 State.Stack.size() > 1) {
1544 return State.Stack[State.Stack.size() - 2].LastSpace;
1545 }
1546 if (Style.BreakBeforeCloseBracketBracedList && Current.is(tok::r_brace) &&
1547 Current.MatchingParen && Current.MatchingParen->is(BK_BracedInit) &&
1548 State.Stack.size() > 1) {
1549 return State.Stack[State.Stack.size() - 2].LastSpace;
1550 }
1551 if ((Style.BreakBeforeCloseBracketFunction ||
1552 Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop ||
1553 Style.BreakBeforeCloseBracketSwitch) &&
1554 Current.is(tok::r_paren) && State.Stack.size() > 1) {
1555 return State.Stack[State.Stack.size() - 2].LastSpace;
1556 }
1557 if (Style.BreakBeforeTemplateCloser && Current.is(TT_TemplateCloser) &&
1558 State.Stack.size() > 1) {
1559 return State.Stack[State.Stack.size() - 2].LastSpace;
1560 }
1561 if (NextNonComment->is(TT_TemplateString) && NextNonComment->closesScope())
1562 return State.Stack[State.Stack.size() - 2].LastSpace;
1563 // Field labels in a nested type should be aligned to the brace. For example
1564 // in ProtoBuf:
1565 // optional int32 b = 2 [(foo_options) = {aaaaaaaaaaaaaaaaaaa: 123,
1566 // bbbbbbbbbbbbbbbbbbbbbbbb:"baz"}];
1567 // For Verilog, a quote following a brace is treated as an identifier. And
1568 // Both braces and colons get annotated as TT_DictLiteral. So we have to
1569 // check.
1570 if (Current.is(tok::identifier) && Current.Next &&
1571 (!Style.isVerilog() || Current.Next->is(tok::colon)) &&
1572 (Current.Next->is(TT_DictLiteral) ||
1573 (Style.isProto() && Current.Next->isOneOf(tok::less, tok::l_brace)))) {
1574 return CurrentState.Indent;
1575 }
1576 if (NextNonComment->is(TT_ObjCStringLiteral) &&
1577 State.StartOfStringLiteral != 0) {
1578 return State.StartOfStringLiteral - 1;
1579 }
1580 if (NextNonComment->isStringLiteral() && State.StartOfStringLiteral != 0)
1581 return State.StartOfStringLiteral;
1582 if (NextNonComment->is(tok::lessless) && CurrentState.FirstLessLess != 0)
1583 return CurrentState.FirstLessLess;
1584 if (NextNonComment->isMemberAccess()) {
1585 if (CurrentState.CallContinuation == 0)
1586 return ContinuationIndent;
1587 return CurrentState.CallContinuation;
1588 }
1589 if (CurrentState.QuestionColumn != 0 &&
1590 ((NextNonComment->is(tok::colon) &&
1591 NextNonComment->is(TT_ConditionalExpr)) ||
1592 Previous.is(TT_ConditionalExpr))) {
1593 if (((NextNonComment->is(tok::colon) && NextNonComment->Next &&
1594 !NextNonComment->Next->FakeLParens.empty() &&
1595 NextNonComment->Next->FakeLParens.back() == prec::Conditional) ||
1596 (Previous.is(tok::colon) && !Current.FakeLParens.empty() &&
1597 Current.FakeLParens.back() == prec::Conditional)) &&
1598 !CurrentState.IsWrappedConditional) {
1599 // NOTE: we may tweak this slightly:
1600 // * not remove the 'lead' ContinuationIndentWidth
1601 // * always un-indent by the operator when
1602 // BreakBeforeTernaryOperators=true
1603 unsigned Indent = CurrentState.Indent.Total;
1604 if (Style.AlignOperands != FormatStyle::OAS_DontAlign)
1605 Indent -= Style.ContinuationIndentWidth;
1606 if (Style.BreakBeforeTernaryOperators && CurrentState.UnindentOperator)
1607 Indent -= 2;
1608 return Indent;
1609 }
1610 return CurrentState.QuestionColumn;
1611 }
1612 if (Previous.is(tok::comma) && CurrentState.VariablePos != 0)
1613 return CurrentState.VariablePos;
1614 if (Current.is(TT_RequiresClause)) {
1615 if (Style.IndentRequiresClause)
1616 return CurrentState.Indent + Style.IndentWidth;
1617 switch (Style.RequiresClausePosition) {
1618 case FormatStyle::RCPS_OwnLine:
1619 case FormatStyle::RCPS_WithFollowing:
1620 case FormatStyle::RCPS_OwnLineWithBrace:
1621 return CurrentState.Indent;
1622 default:
1623 break;
1624 }
1625 }
1626 if (NextNonComment->isOneOf(TT_CtorInitializerColon, TT_InheritanceColon,
1627 TT_InheritanceComma)) {
1628 return State.FirstIndent + Style.ConstructorInitializerIndentWidth;
1629 }
1630 if ((PreviousNonComment &&
1631 (PreviousNonComment->ClosesTemplateDeclaration ||
1632 PreviousNonComment->ClosesRequiresClause ||
1633 (PreviousNonComment->is(TT_AttributeMacro) &&
1634 Current.isNot(tok::l_paren) &&
1635 !Current.endsSequence(TT_StartOfName, TT_AttributeMacro,
1636 TT_PointerOrReference)) ||
1637 PreviousNonComment->isOneOf(TT_AttributeRParen, TT_AttributeRSquare,
1638 TT_FunctionAnnotationRParen,
1639 TT_JavaAnnotation,
1640 TT_LeadingJavaAnnotation))) ||
1641 (!Style.IndentWrappedFunctionNames &&
1642 NextNonComment->isOneOf(tok::kw_operator, TT_FunctionDeclarationName))) {
1643 return std::max(IndentationAndAlignment(CurrentState.LastSpace),
1644 CurrentState.Indent);
1645 }
1646 if (NextNonComment->is(TT_SelectorName)) {
1647 if (!CurrentState.ObjCSelectorNameFound) {
1648 auto MinIndent = CurrentState.Indent;
1649 if (shouldIndentWrappedSelectorName(Style, State.Line->Type)) {
1650 MinIndent =
1651 std::max(MinIndent, IndentationAndAlignment(State.FirstIndent) +
1652 Style.ContinuationIndentWidth);
1653 }
1654 // If LongestObjCSelectorName is 0, we are indenting the first
1655 // part of an ObjC selector (or a selector component which is
1656 // not colon-aligned due to block formatting).
1657 //
1658 // Otherwise, we are indenting a subsequent part of an ObjC
1659 // selector which should be colon-aligned to the longest
1660 // component of the ObjC selector.
1661 //
1662 // In either case, we want to respect Style.IndentWrappedFunctionNames.
1663 return MinIndent.addPadding(
1664 std::max(NextNonComment->LongestObjCSelectorName,
1665 NextNonComment->ColumnWidth) -
1666 NextNonComment->ColumnWidth);
1667 }
1668 if (!CurrentState.AlignColons)
1669 return CurrentState.Indent;
1670 if (CurrentState.ColonPos > NextNonComment->ColumnWidth)
1671 return CurrentState.ColonPos - NextNonComment->ColumnWidth;
1672 return CurrentState.Indent;
1673 }
1674 if (NextNonComment->is(tok::colon) && NextNonComment->is(TT_ObjCMethodExpr))
1675 return CurrentState.ColonPos;
1676 if (NextNonComment->is(TT_ArraySubscriptLSquare)) {
1677 if (CurrentState.StartOfArraySubscripts != 0) {
1678 return CurrentState.StartOfArraySubscripts;
1679 } else if (Style.isCSharp()) { // C# allows `["key"] = value` inside object
1680 // initializers.
1681 return CurrentState.Indent;
1682 }
1683 return ContinuationIndent;
1684 }
1685
1686 // OpenMP clauses want to get additional indentation when they are pushed onto
1687 // the next line.
1688 if (State.Line->InPragmaDirective) {
1689 FormatToken *PragmaType = State.Line->First->Next->Next;
1690 if (PragmaType && PragmaType->TokenText == "omp")
1691 return CurrentState.Indent + Style.ContinuationIndentWidth;
1692 }
1693
1694 // This ensure that we correctly format ObjC methods calls without inputs,
1695 // i.e. where the last element isn't selector like: [callee method];
1696 if (NextNonComment->is(tok::identifier) && NextNonComment->FakeRParens == 0 &&
1697 NextNonComment->Next && NextNonComment->Next->is(TT_ObjCMethodExpr)) {
1698 return CurrentState.Indent;
1699 }
1700
1701 if (NextNonComment->isOneOf(TT_StartOfName, TT_PointerOrReference) ||
1702 Previous.isOneOf(tok::coloncolon, tok::equal, TT_JsTypeColon)) {
1703 return ContinuationIndent;
1704 }
1705 if (PreviousNonComment && PreviousNonComment->is(tok::colon) &&
1706 PreviousNonComment->isOneOf(TT_ObjCMethodExpr, TT_DictLiteral)) {
1707 return ContinuationIndent;
1708 }
1709 if (NextNonComment->is(TT_CtorInitializerComma))
1710 return CurrentState.Indent;
1711 if (PreviousNonComment && PreviousNonComment->is(TT_CtorInitializerColon) &&
1712 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon) {
1713 return CurrentState.Indent;
1714 }
1715 if (PreviousNonComment && PreviousNonComment->is(TT_InheritanceColon) &&
1716 Style.BreakInheritanceList == FormatStyle::BILS_AfterColon) {
1717 return CurrentState.Indent;
1718 }
1719 if (Previous.is(tok::r_paren) &&
1720 Previous.isNot(TT_TableGenDAGArgOperatorToBreak) &&
1721 !Current.isBinaryOperator() &&
1722 Current.isNoneOf(tok::colon, tok::comment)) {
1723 return ContinuationIndent;
1724 }
1725 if (Current.is(TT_ProtoExtensionLSquare))
1726 return CurrentState.Indent;
1727 if (Current.isBinaryOperator() && CurrentState.UnindentOperator) {
1728 return CurrentState.Indent - Current.Tok.getLength() -
1729 Current.SpacesRequiredBefore;
1730 }
1731 if (Current.is(tok::comment) && NextNonComment->isBinaryOperator() &&
1732 CurrentState.UnindentOperator) {
1733 return CurrentState.Indent - NextNonComment->Tok.getLength() -
1734 NextNonComment->SpacesRequiredBefore;
1735 }
1736 if (CurrentState.Indent.Total == State.FirstIndent && PreviousNonComment &&
1737 PreviousNonComment->isNoneOf(tok::r_brace, TT_CtorInitializerComma)) {
1738 // Ensure that we fall back to the continuation indent width instead of
1739 // just flushing continuations left.
1740 return CurrentState.Indent + Style.ContinuationIndentWidth;
1741 }
1742 return CurrentState.Indent;
1743}
1744
1746 const FormatToken &Current,
1747 const FormatStyle &Style) {
1748 if (Previous->isNot(tok::l_paren))
1749 return true;
1750 if (Previous->ParameterCount > 1)
1751 return true;
1752
1753 // Also a nested block if contains a lambda inside function with 1 parameter.
1754 return Style.BraceWrapping.BeforeLambdaBody && Current.is(TT_LambdaLSquare);
1755}
1756
1757unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
1758 bool DryRun, bool Newline) {
1759 assert(State.Stack.size());
1760 const FormatToken &Current = *State.NextToken;
1761 auto &CurrentState = State.Stack.back();
1762
1763 if (Current.is(TT_CSharpGenericTypeConstraint))
1764 CurrentState.IsCSharpGenericTypeConstraint = true;
1765 if (Current.isOneOf(tok::comma, TT_BinaryOperator))
1766 CurrentState.NoLineBreakInOperand = false;
1767 if (Current.isOneOf(TT_InheritanceColon, TT_CSharpGenericTypeConstraintColon))
1768 CurrentState.AvoidBinPacking = true;
1769 if (Current.is(tok::lessless) && Current.isNot(TT_OverloadedOperator)) {
1770 if (CurrentState.FirstLessLess == 0)
1771 CurrentState.FirstLessLess = State.Column;
1772 else
1773 CurrentState.LastOperatorWrapped = Newline;
1774 }
1775 if (Current.is(TT_BinaryOperator) && Current.isNot(tok::lessless))
1776 CurrentState.LastOperatorWrapped = Newline;
1777 if (Current.is(TT_ConditionalExpr) && Current.Previous &&
1778 Current.Previous->isNot(TT_ConditionalExpr)) {
1779 CurrentState.LastOperatorWrapped = Newline;
1780 }
1781 if (Current.is(TT_ArraySubscriptLSquare) &&
1782 CurrentState.StartOfArraySubscripts == 0) {
1783 CurrentState.StartOfArraySubscripts = State.Column;
1784 }
1785
1786 auto IsWrappedConditional = [](const FormatToken &Tok) {
1787 if (!(Tok.is(TT_ConditionalExpr) && Tok.is(tok::question)))
1788 return false;
1789 if (Tok.MustBreakBefore)
1790 return true;
1791
1792 const FormatToken *Next = Tok.getNextNonComment();
1793 return Next && Next->MustBreakBefore;
1794 };
1795 if (IsWrappedConditional(Current))
1796 CurrentState.IsWrappedConditional = true;
1797 if (Style.BreakBeforeTernaryOperators && Current.is(tok::question))
1798 CurrentState.QuestionColumn = State.Column;
1799 if (!Style.BreakBeforeTernaryOperators && Current.isNot(tok::colon)) {
1800 const FormatToken *Previous = Current.Previous;
1801 while (Previous && Previous->isTrailingComment())
1802 Previous = Previous->Previous;
1803 if (Previous && Previous->is(tok::question))
1804 CurrentState.QuestionColumn = State.Column;
1805 }
1806 if (!Current.opensScope() && !Current.closesScope() &&
1807 Current.isNot(TT_PointerOrReference)) {
1808 State.LowestLevelOnLine =
1809 std::min(State.LowestLevelOnLine, Current.NestingLevel);
1810 }
1811 if (Current.isMemberAccess())
1812 CurrentState.StartOfFunctionCall = !Current.NextOperator ? 0 : State.Column;
1813 if (Current.is(TT_SelectorName))
1814 CurrentState.ObjCSelectorNameFound = true;
1815 if (Current.is(TT_CtorInitializerColon) &&
1816 Style.BreakConstructorInitializers != FormatStyle::BCIS_AfterColon) {
1817 // Indent 2 from the column, so:
1818 // SomeClass::SomeClass()
1819 // : First(...), ...
1820 // Next(...)
1821 // ^ line up here.
1822 CurrentState.Indent = State.Column + (Style.BreakConstructorInitializers ==
1823 FormatStyle::BCIS_BeforeComma
1824 ? 0
1825 : 2);
1826 CurrentState.NestedBlockIndent = CurrentState.Indent.Total;
1827 if (Style.PackConstructorInitializers > FormatStyle::PCIS_BinPack) {
1828 CurrentState.AvoidBinPacking = true;
1829 CurrentState.BreakBeforeParameter =
1830 Style.ColumnLimit > 0 &&
1831 Style.PackConstructorInitializers != FormatStyle::PCIS_NextLine &&
1832 Style.PackConstructorInitializers != FormatStyle::PCIS_NextLineOnly;
1833 } else {
1834 CurrentState.BreakBeforeParameter = false;
1835 }
1836 }
1837 if (Current.is(TT_CtorInitializerColon) &&
1838 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon) {
1839 CurrentState.Indent =
1840 State.FirstIndent + Style.ConstructorInitializerIndentWidth;
1841 CurrentState.NestedBlockIndent = CurrentState.Indent.Total;
1842 if (Style.PackConstructorInitializers > FormatStyle::PCIS_BinPack)
1843 CurrentState.AvoidBinPacking = true;
1844 else
1845 CurrentState.BreakBeforeParameter = false;
1846 }
1847 if (Current.is(TT_InheritanceColon)) {
1848 CurrentState.Indent =
1849 State.FirstIndent + Style.ConstructorInitializerIndentWidth;
1850 }
1851 if (Current.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) && Newline)
1852 CurrentState.NestedBlockIndent = State.Column + Current.ColumnWidth + 1;
1853 if (Current.isOneOf(TT_LambdaLSquare, TT_LambdaArrow))
1854 CurrentState.LastSpace = State.Column;
1855 if (Current.is(TT_RequiresExpression) &&
1856 Style.RequiresExpressionIndentation == FormatStyle::REI_Keyword) {
1857 CurrentState.NestedBlockIndent = State.Column;
1858 }
1859
1860 // Insert scopes created by fake parenthesis.
1861 const FormatToken *Previous = Current.getPreviousNonComment();
1862
1863 // Add special behavior to support a format commonly used for JavaScript
1864 // closures:
1865 // SomeFunction(function() {
1866 // foo();
1867 // bar();
1868 // }, a, b, c);
1869 if (Current.isNot(tok::comment) && !Current.ClosesRequiresClause &&
1870 Previous && Previous->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) &&
1871 Previous->isNot(TT_DictLiteral) && State.Stack.size() > 1 &&
1872 !CurrentState.HasMultipleNestedBlocks) {
1873 if (State.Stack[State.Stack.size() - 2].NestedBlockInlined && Newline)
1874 for (ParenState &PState : llvm::drop_end(State.Stack))
1875 PState.NoLineBreak = true;
1876 State.Stack[State.Stack.size() - 2].NestedBlockInlined = false;
1877 }
1878 if (Previous && (Previous->isOneOf(TT_BinaryOperator, TT_ConditionalExpr) ||
1879 (Previous->isOneOf(tok::l_paren, tok::comma, tok::colon) &&
1880 Previous->isNoneOf(TT_DictLiteral, TT_ObjCMethodExpr,
1881 TT_CtorInitializerColon)))) {
1882 CurrentState.NestedBlockInlined =
1883 !Newline && hasNestedBlockInlined(Previous, Current, Style);
1884 }
1885
1886 moveStatePastFakeLParens(State, Newline);
1887 moveStatePastScopeCloser(State);
1888 // Do not use CurrentState here, since the two functions before may change the
1889 // Stack.
1890 bool AllowBreak = !State.Stack.back().NoLineBreak &&
1891 !State.Stack.back().NoLineBreakInOperand;
1892 moveStatePastScopeOpener(State, Newline);
1893 moveStatePastFakeRParens(State);
1894
1895 if (Current.is(TT_ObjCStringLiteral) && State.StartOfStringLiteral == 0)
1896 State.StartOfStringLiteral = State.Column + 1;
1897 if (Current.is(TT_CSharpStringLiteral) && State.StartOfStringLiteral == 0) {
1898 State.StartOfStringLiteral = State.Column + 1;
1899 } else if (Current.is(TT_TableGenMultiLineString) &&
1900 State.StartOfStringLiteral == 0) {
1901 State.StartOfStringLiteral = State.Column + 1;
1902 } else if (Current.isStringLiteral() && State.StartOfStringLiteral == 0) {
1903 State.StartOfStringLiteral = State.Column;
1904 } else if (Current.isNoneOf(tok::comment, tok::identifier, tok::hash) &&
1905 !Current.isStringLiteral()) {
1906 State.StartOfStringLiteral = 0;
1907 }
1908
1909 State.Column += Current.ColumnWidth;
1910 State.NextToken = State.NextToken->Next;
1911 // Verilog case labels are on the same unwrapped lines as the statements that
1912 // follow. TokenAnnotator identifies them and sets MustBreakBefore.
1913 // Indentation is taken care of here. A case label can only have 1 statement
1914 // in Verilog, so we don't have to worry about lines that follow.
1915 if (Style.isVerilog() && State.NextToken &&
1916 State.NextToken->MustBreakBefore &&
1917 Keywords.isVerilogEndOfLabel(Current)) {
1918 State.FirstIndent += Style.IndentWidth;
1919 CurrentState.Indent = State.FirstIndent;
1920 }
1921
1922 unsigned Penalty =
1923 handleEndOfLine(Current, State, DryRun, AllowBreak, Newline);
1924
1925 if (Current.Role)
1926 Current.Role->formatFromToken(State, this, DryRun);
1927 // If the previous has a special role, let it consume tokens as appropriate.
1928 // It is necessary to start at the previous token for the only implemented
1929 // role (comma separated list). That way, the decision whether or not to break
1930 // after the "{" is already done and both options are tried and evaluated.
1931 // FIXME: This is ugly, find a better way.
1932 if (Previous && Previous->Role)
1933 Penalty += Previous->Role->formatAfterToken(State, this, DryRun);
1934
1935 return Penalty;
1936}
1937
1938void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,
1939 bool Newline) {
1940 const FormatToken &Current = *State.NextToken;
1941 if (Current.FakeLParens.empty())
1942 return;
1943
1944 const FormatToken *Previous = Current.getPreviousNonComment();
1945
1946 // Don't add extra indentation for the first fake parenthesis after
1947 // 'return', assignments, opening <({[, or requires clauses. The indentation
1948 // for these cases is special cased.
1949 bool SkipFirstExtraIndent =
1950 Previous &&
1951 (Previous->opensScope() ||
1952 Previous->isOneOf(tok::semi, tok::kw_return, TT_RequiresClause) ||
1953 (Previous->getPrecedence() == prec::Assignment &&
1954 Style.AlignOperands != FormatStyle::OAS_DontAlign) ||
1955 Previous->is(TT_ObjCMethodExpr));
1956 for (const auto &PrecedenceLevel : llvm::reverse(Current.FakeLParens)) {
1957 const auto &CurrentState = State.Stack.back();
1958 ParenState NewParenState = CurrentState;
1959 NewParenState.Tok = nullptr;
1960 NewParenState.ContainsLineBreak = false;
1961 NewParenState.LastOperatorWrapped = true;
1962 NewParenState.IsChainedConditional = false;
1963 NewParenState.IsWrappedConditional = false;
1964 NewParenState.UnindentOperator = false;
1965 NewParenState.NoLineBreak =
1966 NewParenState.NoLineBreak || CurrentState.NoLineBreakInOperand;
1967
1968 // Don't propagate AvoidBinPacking into subexpressions of arg/param lists.
1969 if (PrecedenceLevel > prec::Comma)
1970 NewParenState.AvoidBinPacking = false;
1971
1972 // Indent from 'LastSpace' unless these are fake parentheses encapsulating
1973 // a builder type call after 'return' or, if the alignment after opening
1974 // brackets is disabled.
1975 if (!Current.isTrailingComment() &&
1976 (Style.AlignOperands != FormatStyle::OAS_DontAlign ||
1977 PrecedenceLevel < prec::Assignment) &&
1978 (!Previous || Previous->isNot(tok::kw_return) ||
1979 (!Style.isJava() && PrecedenceLevel > 0)) &&
1980 (Style.AlignAfterOpenBracket || PrecedenceLevel > prec::Comma ||
1981 Current.NestingLevel == 0) &&
1982 (!Style.isTableGen() ||
1983 (Previous && Previous->isOneOf(TT_TableGenDAGArgListComma,
1984 TT_TableGenDAGArgListCommaToBreak)))) {
1985 NewParenState.Indent =
1986 std::max({IndentationAndAlignment(State.Column), NewParenState.Indent,
1987 IndentationAndAlignment(CurrentState.LastSpace)});
1988 }
1989
1990 // Special case for generic selection expressions, its comma-separated
1991 // expressions are not aligned to the opening paren like regular calls, but
1992 // rather continuation-indented relative to the _Generic keyword.
1993 if (Previous && Previous->endsSequence(tok::l_paren, tok::kw__Generic) &&
1994 State.Stack.size() > 1) {
1995 NewParenState.Indent = State.Stack[State.Stack.size() - 2].Indent +
1996 Style.ContinuationIndentWidth;
1997 }
1998
1999 if ((shouldUnindentNextOperator(Current) ||
2000 (Previous &&
2001 (PrecedenceLevel == prec::Conditional &&
2002 Previous->is(tok::question) && Previous->is(TT_ConditionalExpr)))) &&
2003 !Newline) {
2004 // If BreakBeforeBinaryOperators is set, un-indent a bit to account for
2005 // the operator and keep the operands aligned.
2006 if (Style.AlignOperands == FormatStyle::OAS_AlignAfterOperator)
2007 NewParenState.UnindentOperator = true;
2008 // Mark indentation as alignment if the expression is aligned.
2009 if (Style.AlignOperands != FormatStyle::OAS_DontAlign)
2010 NewParenState.IsAligned = true;
2011 }
2012
2013 // Do not indent relative to the fake parentheses inserted for "." or "->".
2014 // This is a special case to make the following to statements consistent:
2015 // OuterFunction(InnerFunctionCall( // break
2016 // ParameterToInnerFunction));
2017 // OuterFunction(SomeObject.InnerFunctionCall( // break
2018 // ParameterToInnerFunction));
2019 if (PrecedenceLevel > prec::Unknown)
2020 NewParenState.LastSpace = std::max(NewParenState.LastSpace, State.Column);
2021 if (PrecedenceLevel != prec::Conditional &&
2022 Current.isNot(TT_UnaryOperator) && Style.AlignAfterOpenBracket) {
2023 NewParenState.StartOfFunctionCall = State.Column;
2024 }
2025
2026 // Indent conditional expressions, unless they are chained "else-if"
2027 // conditionals. Never indent expression where the 'operator' is ',', ';' or
2028 // an assignment (i.e. *I <= prec::Assignment) as those have different
2029 // indentation rules. Indent other expression, unless the indentation needs
2030 // to be skipped.
2031 if (PrecedenceLevel == prec::Conditional && Previous &&
2032 Previous->is(tok::colon) && Previous->is(TT_ConditionalExpr) &&
2033 &PrecedenceLevel == &Current.FakeLParens.back() &&
2034 !CurrentState.IsWrappedConditional) {
2035 NewParenState.IsChainedConditional = true;
2036 NewParenState.UnindentOperator = State.Stack.back().UnindentOperator;
2037 } else if (PrecedenceLevel == prec::Conditional ||
2038 (!SkipFirstExtraIndent && PrecedenceLevel > prec::Assignment &&
2039 !Current.isTrailingComment())) {
2040 NewParenState.Indent += Style.ContinuationIndentWidth;
2041 }
2042 if ((Previous && !Previous->opensScope()) || PrecedenceLevel != prec::Comma)
2043 NewParenState.BreakBeforeParameter = false;
2044 State.Stack.push_back(NewParenState);
2045 SkipFirstExtraIndent = false;
2046 }
2047}
2048
2049void ContinuationIndenter::moveStatePastFakeRParens(LineState &State) {
2050 for (unsigned i = 0, e = State.NextToken->FakeRParens; i != e; ++i) {
2051 unsigned VariablePos = State.Stack.back().VariablePos;
2052 if (State.Stack.size() == 1) {
2053 // Do not pop the last element.
2054 break;
2055 }
2056 State.Stack.pop_back();
2057 State.Stack.back().VariablePos = VariablePos;
2058 }
2059
2060 if (State.NextToken->ClosesRequiresClause && Style.IndentRequiresClause) {
2061 // Remove the indentation of the requires clauses (which is not in Indent,
2062 // but in LastSpace).
2063 State.Stack.back().LastSpace -= Style.IndentWidth;
2064 }
2065}
2066
2067void ContinuationIndenter::moveStatePastScopeOpener(LineState &State,
2068 bool Newline) {
2069 const FormatToken &Current = *State.NextToken;
2070 if (!Current.opensScope())
2071 return;
2072
2073 const auto &CurrentState = State.Stack.back();
2074
2075 // Don't allow '<' or '(' in C# generic type constraints to start new scopes.
2076 if (Current.isOneOf(tok::less, tok::l_paren) &&
2077 CurrentState.IsCSharpGenericTypeConstraint) {
2078 return;
2079 }
2080
2081 if (Current.MatchingParen && Current.is(BK_Block)) {
2082 moveStateToNewBlock(State, Newline);
2083 return;
2084 }
2085
2086 const bool EndsInComma = [](const FormatToken *Tok) {
2087 if (!Tok)
2088 return false;
2089 const auto *Prev = Tok->getPreviousNonComment();
2090 if (!Prev)
2091 return false;
2092 return Prev->is(tok::comma);
2093 }(Current.MatchingParen);
2094
2095 IndentationAndAlignment NewIndent = 0;
2096 unsigned LastSpace = CurrentState.LastSpace;
2097 bool AvoidBinPacking;
2098 bool BreakBeforeParameter = false;
2099 unsigned NestedBlockIndent = std::max(CurrentState.StartOfFunctionCall,
2100 CurrentState.NestedBlockIndent);
2101 if (Current.isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
2102 opensProtoMessageField(Current, Style)) {
2103 if (Current.opensBlockOrBlockTypeList(Style)) {
2104 NewIndent = Style.IndentWidth +
2105 std::min(State.Column, CurrentState.NestedBlockIndent);
2106 } else if (Current.is(tok::l_brace)) {
2107 const auto Width = Style.BracedInitializerIndentWidth;
2108 NewIndent = IndentationAndAlignment(CurrentState.LastSpace) +
2109 (Width < 0 ? Style.ContinuationIndentWidth : Width);
2110 } else {
2111 NewIndent = CurrentState.LastSpace + Style.ContinuationIndentWidth;
2112 }
2113 const FormatToken *NextNonComment = Current.getNextNonComment();
2114 AvoidBinPacking = EndsInComma || Current.is(TT_DictLiteral) ||
2115 Style.isProto() || !Style.BinPackArguments ||
2116 (NextNonComment && NextNonComment->isOneOf(
2117 TT_DesignatedInitializerPeriod,
2118 TT_DesignatedInitializerLSquare));
2119 BreakBeforeParameter = EndsInComma;
2120 if (Current.ParameterCount > 1)
2121 NestedBlockIndent = std::max(NestedBlockIndent, State.Column + 1);
2122 } else {
2123 NewIndent = IndentationAndAlignment(std::max(
2124 CurrentState.LastSpace, CurrentState.StartOfFunctionCall)) +
2125 Style.ContinuationIndentWidth;
2126
2127 if (Style.isTableGen() && Current.is(TT_TableGenDAGArgOpenerToBreak) &&
2128 Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakElements) {
2129 // For the case the next token is a TableGen DAGArg operator identifier
2130 // that is not marked to have a line break after it.
2131 // In this case the option DAS_BreakElements requires to align the
2132 // DAGArg elements to the operator.
2133 const FormatToken *Next = Current.Next;
2134 if (Next && Next->is(TT_TableGenDAGArgOperatorID))
2135 NewIndent = State.Column + Next->TokenText.size() + 2;
2136 }
2137
2138 // Ensure that different different brackets force relative alignment, e.g.:
2139 // void SomeFunction(vector< // break
2140 // int> v);
2141 // FIXME: We likely want to do this for more combinations of brackets.
2142 if (Current.is(tok::less) && Current.ParentBracket == tok::l_paren) {
2143 NewIndent = std::max(NewIndent, CurrentState.Indent);
2144 LastSpace = std::max(LastSpace, CurrentState.Indent.Total);
2145 }
2146
2147 // If ObjCBinPackProtocolList is unspecified, fall back to BinPackParameters
2148 // for backwards compatibility.
2150 (Style.ObjCBinPackProtocolList == FormatStyle::BPS_Auto &&
2151 Style.BinPackParameters == FormatStyle::BPPS_BinPack) ||
2152 Style.ObjCBinPackProtocolList == FormatStyle::BPS_Always;
2153
2154 bool BinPackDeclaration =
2155 (State.Line->Type != LT_ObjCDecl &&
2156 Style.BinPackParameters == FormatStyle::BPPS_BinPack) ||
2157 (State.Line->Type == LT_ObjCDecl && ObjCBinPackProtocolList);
2158
2159 bool GenericSelection =
2160 Current.getPreviousNonComment() &&
2161 Current.getPreviousNonComment()->is(tok::kw__Generic);
2162
2163 AvoidBinPacking =
2164 (CurrentState.IsCSharpGenericTypeConstraint) || GenericSelection ||
2165 (Style.isJavaScript() && EndsInComma) ||
2166 (State.Line->MustBeDeclaration && !BinPackDeclaration) ||
2167 (!State.Line->MustBeDeclaration && !Style.BinPackArguments) ||
2168 (Style.ExperimentalAutoDetectBinPacking &&
2169 (Current.is(PPK_OnePerLine) ||
2170 (!BinPackInconclusiveFunctions && Current.is(PPK_Inconclusive))));
2171
2172 if (Current.is(TT_ObjCMethodExpr) && Current.MatchingParen &&
2173 Style.ObjCBreakBeforeNestedBlockParam) {
2174 if (Style.ColumnLimit) {
2175 // If this '[' opens an ObjC call, determine whether all parameters fit
2176 // into one line and put one per line if they don't.
2177 if (getLengthToMatchingParen(Current, State.Stack) + State.Column >
2178 getColumnLimit(State)) {
2179 BreakBeforeParameter = true;
2180 }
2181 } else {
2182 // For ColumnLimit = 0, we have to figure out whether there is or has to
2183 // be a line break within this call.
2184 for (const FormatToken *Tok = &Current;
2185 Tok && Tok != Current.MatchingParen; Tok = Tok->Next) {
2186 if (Tok->MustBreakBefore ||
2187 (Tok->CanBreakBefore && Tok->NewlinesBefore > 0)) {
2188 BreakBeforeParameter = true;
2189 break;
2190 }
2191 }
2192 }
2193 }
2194
2195 if (Style.isJavaScript() && EndsInComma)
2196 BreakBeforeParameter = true;
2197 }
2198 // Generally inherit NoLineBreak from the current scope to nested scope.
2199 // However, don't do this for non-empty nested blocks, dict literals and
2200 // array literals as these follow different indentation rules.
2201 bool NoLineBreak =
2202 Current.Children.empty() &&
2203 Current.isNoneOf(TT_DictLiteral, TT_ArrayInitializerLSquare) &&
2204 (CurrentState.NoLineBreak || CurrentState.NoLineBreakInOperand ||
2205 (Current.is(TT_TemplateOpener) &&
2206 CurrentState.ContainsUnwrappedBuilder));
2207 State.Stack.push_back(
2208 ParenState(&Current, NewIndent, LastSpace, AvoidBinPacking, NoLineBreak));
2209 auto &NewState = State.Stack.back();
2210 NewState.NestedBlockIndent = NestedBlockIndent;
2211 NewState.BreakBeforeParameter = BreakBeforeParameter;
2212 NewState.HasMultipleNestedBlocks = (Current.BlockParameterCount > 1);
2213
2214 if (Style.BraceWrapping.BeforeLambdaBody && Current.Next &&
2215 Current.is(tok::l_paren)) {
2216 // Search for any parameter that is a lambda.
2217 FormatToken const *next = Current.Next;
2218 while (next) {
2219 if (next->is(TT_LambdaLSquare)) {
2220 NewState.HasMultipleNestedBlocks = true;
2221 break;
2222 }
2223 next = next->Next;
2224 }
2225 }
2226
2227 NewState.IsInsideObjCArrayLiteral = Current.is(TT_ArrayInitializerLSquare) &&
2228 Current.Previous &&
2229 Current.Previous->is(tok::at);
2230}
2231
2232void ContinuationIndenter::moveStatePastScopeCloser(LineState &State) {
2233 const FormatToken &Current = *State.NextToken;
2234 if (!Current.closesScope())
2235 return;
2236
2237 // If we encounter a closing ), ], } or >, we can remove a level from our
2238 // stacks.
2239 if (State.Stack.size() > 1 &&
2240 (Current.isOneOf(tok::r_paren, tok::r_square, TT_TemplateString) ||
2241 (Current.is(tok::r_brace) && State.NextToken != State.Line->First) ||
2242 State.NextToken->is(TT_TemplateCloser) ||
2243 State.NextToken->is(TT_TableGenListCloser) ||
2244 (Current.is(tok::greater) && Current.is(TT_DictLiteral)))) {
2245 State.Stack.pop_back();
2246 }
2247
2248 auto &CurrentState = State.Stack.back();
2249
2250 // Reevaluate whether ObjC message arguments fit into one line.
2251 // If a receiver spans multiple lines, e.g.:
2252 // [[object block:^{
2253 // return 42;
2254 // }] a:42 b:42];
2255 // BreakBeforeParameter is calculated based on an incorrect assumption
2256 // (it is checked whether the whole expression fits into one line without
2257 // considering a line break inside a message receiver).
2258 // We check whether arguments fit after receiver scope closer (into the same
2259 // line).
2260 if (CurrentState.BreakBeforeParameter && Current.MatchingParen &&
2261 Current.MatchingParen->Previous) {
2262 const FormatToken &CurrentScopeOpener = *Current.MatchingParen->Previous;
2263 if (CurrentScopeOpener.is(TT_ObjCMethodExpr) &&
2264 CurrentScopeOpener.MatchingParen) {
2265 int NecessarySpaceInLine =
2266 getLengthToMatchingParen(CurrentScopeOpener, State.Stack) +
2267 CurrentScopeOpener.TotalLength - Current.TotalLength - 1;
2268 if (State.Column + Current.ColumnWidth + NecessarySpaceInLine <=
2269 Style.ColumnLimit) {
2270 CurrentState.BreakBeforeParameter = false;
2271 }
2272 }
2273 }
2274
2275 if (Current.is(tok::r_square)) {
2276 // If this ends the array subscript expr, reset the corresponding value.
2277 const FormatToken *NextNonComment = Current.getNextNonComment();
2278 if (NextNonComment && NextNonComment->isNot(tok::l_square))
2279 CurrentState.StartOfArraySubscripts = 0;
2280 }
2281}
2282
2283void ContinuationIndenter::moveStateToNewBlock(LineState &State, bool NewLine) {
2284 if (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope &&
2285 State.NextToken->is(TT_LambdaLBrace) &&
2286 !State.Line->MightBeFunctionDecl) {
2287 const auto Indent = Style.IndentWidth * Style.BraceWrapping.IndentBraces;
2288 State.Stack.back().NestedBlockIndent = State.FirstIndent + Indent;
2289 }
2290 unsigned NestedBlockIndent = State.Stack.back().NestedBlockIndent;
2291 // ObjC block sometimes follow special indentation rules.
2292 unsigned NewIndent =
2293 NestedBlockIndent + (State.NextToken->is(TT_ObjCBlockLBrace)
2294 ? Style.ObjCBlockIndentWidth
2295 : Style.IndentWidth);
2296
2297 // Even when wrapping before lambda body, the left brace can still be added to
2298 // the same line. This occurs when checking whether the whole lambda body can
2299 // go on a single line. In this case we have to make sure there are no line
2300 // breaks in the body, otherwise we could just end up with a regular lambda
2301 // body without the brace wrapped.
2302 bool NoLineBreak = Style.BraceWrapping.BeforeLambdaBody && !NewLine &&
2303 State.NextToken->is(TT_LambdaLBrace);
2304
2305 State.Stack.push_back(ParenState(State.NextToken, NewIndent,
2306 State.Stack.back().LastSpace,
2307 /*AvoidBinPacking=*/true, NoLineBreak));
2308 State.Stack.back().NestedBlockIndent = NestedBlockIndent;
2309 State.Stack.back().BreakBeforeParameter = true;
2310}
2311
2312static unsigned getLastLineEndColumn(StringRef Text, unsigned StartColumn,
2313 unsigned TabWidth,
2314 encoding::Encoding Encoding) {
2315 size_t LastNewlinePos = Text.find_last_of("\n");
2316 if (LastNewlinePos == StringRef::npos) {
2317 return StartColumn +
2318 encoding::columnWidthWithTabs(Text, StartColumn, TabWidth, Encoding);
2319 } else {
2320 return encoding::columnWidthWithTabs(Text.substr(LastNewlinePos),
2321 /*StartColumn=*/0, TabWidth, Encoding);
2322 }
2323}
2324
2325unsigned ContinuationIndenter::reformatRawStringLiteral(
2326 const FormatToken &Current, LineState &State,
2327 const FormatStyle &RawStringStyle, bool DryRun, bool Newline) {
2328 unsigned StartColumn = State.Column - Current.ColumnWidth;
2329 StringRef OldDelimiter = *getRawStringDelimiter(Current.TokenText);
2330 StringRef NewDelimiter =
2331 getCanonicalRawStringDelimiter(Style, RawStringStyle.Language);
2332 if (NewDelimiter.empty())
2333 NewDelimiter = OldDelimiter;
2334 // The text of a raw string is between the leading 'R"delimiter(' and the
2335 // trailing 'delimiter)"'.
2336 unsigned OldPrefixSize = 3 + OldDelimiter.size();
2337 unsigned OldSuffixSize = 2 + OldDelimiter.size();
2338 // We create a virtual text environment which expects a null-terminated
2339 // string, so we cannot use StringRef.
2340 std::string RawText = std::string(
2341 Current.TokenText.substr(OldPrefixSize).drop_back(OldSuffixSize));
2342 if (NewDelimiter != OldDelimiter) {
2343 // Don't update to the canonical delimiter 'deli' if ')deli"' occurs in the
2344 // raw string.
2345 std::string CanonicalDelimiterSuffix = (")" + NewDelimiter + "\"").str();
2346 if (StringRef(RawText).contains(CanonicalDelimiterSuffix))
2347 NewDelimiter = OldDelimiter;
2348 }
2349
2350 unsigned NewPrefixSize = 3 + NewDelimiter.size();
2351 unsigned NewSuffixSize = 2 + NewDelimiter.size();
2352
2353 // The first start column is the column the raw text starts after formatting.
2354 unsigned FirstStartColumn = StartColumn + NewPrefixSize;
2355
2356 // The next start column is the intended indentation a line break inside
2357 // the raw string at level 0. It is determined by the following rules:
2358 // - if the content starts on newline, it is one level more than the current
2359 // indent, and
2360 // - if the content does not start on a newline, it is the first start
2361 // column.
2362 // These rules have the advantage that the formatted content both does not
2363 // violate the rectangle rule and visually flows within the surrounding
2364 // source.
2365 bool ContentStartsOnNewline = Current.TokenText[OldPrefixSize] == '\n';
2366 // If this token is the last parameter (checked by looking if it's followed by
2367 // `)` and is not on a newline, the base the indent off the line's nested
2368 // block indent. Otherwise, base the indent off the arguments indent, so we
2369 // can achieve:
2370 //
2371 // fffffffffff(1, 2, 3, R"pb(
2372 // key1: 1 #
2373 // key2: 2)pb");
2374 //
2375 // fffffffffff(1, 2, 3,
2376 // R"pb(
2377 // key1: 1 #
2378 // key2: 2
2379 // )pb");
2380 //
2381 // fffffffffff(1, 2, 3,
2382 // R"pb(
2383 // key1: 1 #
2384 // key2: 2
2385 // )pb",
2386 // 5);
2387 unsigned CurrentIndent =
2388 (!Newline && Current.Next && Current.Next->is(tok::r_paren))
2389 ? State.Stack.back().NestedBlockIndent
2390 : State.Stack.back().Indent.Total;
2391 unsigned NextStartColumn = ContentStartsOnNewline
2392 ? CurrentIndent + Style.IndentWidth
2393 : FirstStartColumn;
2394
2395 // The last start column is the column the raw string suffix starts if it is
2396 // put on a newline.
2397 // The last start column is the intended indentation of the raw string postfix
2398 // if it is put on a newline. It is determined by the following rules:
2399 // - if the raw string prefix starts on a newline, it is the column where
2400 // that raw string prefix starts, and
2401 // - if the raw string prefix does not start on a newline, it is the current
2402 // indent.
2403 unsigned LastStartColumn =
2404 Current.NewlinesBefore ? FirstStartColumn - NewPrefixSize : CurrentIndent;
2405
2406 std::pair<tooling::Replacements, unsigned> Fixes = internal::reformat(
2407 RawStringStyle, RawText, {tooling::Range(0, RawText.size())},
2408 FirstStartColumn, NextStartColumn, LastStartColumn, "<stdin>",
2409 /*Status=*/nullptr);
2410
2411 auto NewCode = applyAllReplacements(RawText, Fixes.first);
2412 if (!NewCode)
2413 return addMultilineToken(Current, State);
2414 if (!DryRun) {
2415 if (NewDelimiter != OldDelimiter) {
2416 // In 'R"delimiter(...', the delimiter starts 2 characters after the start
2417 // of the token.
2418 SourceLocation PrefixDelimiterStart =
2419 Current.Tok.getLocation().getLocWithOffset(2);
2420 auto PrefixErr = Whitespaces.addReplacement(tooling::Replacement(
2421 SourceMgr, PrefixDelimiterStart, OldDelimiter.size(), NewDelimiter));
2422 if (PrefixErr) {
2423 llvm::errs()
2424 << "Failed to update the prefix delimiter of a raw string: "
2425 << llvm::toString(std::move(PrefixErr)) << "\n";
2426 }
2427 // In 'R"delimiter(...)delimiter"', the suffix delimiter starts at
2428 // position length - 1 - |delimiter|.
2429 SourceLocation SuffixDelimiterStart =
2430 Current.Tok.getLocation().getLocWithOffset(Current.TokenText.size() -
2431 1 - OldDelimiter.size());
2432 auto SuffixErr = Whitespaces.addReplacement(tooling::Replacement(
2433 SourceMgr, SuffixDelimiterStart, OldDelimiter.size(), NewDelimiter));
2434 if (SuffixErr) {
2435 llvm::errs()
2436 << "Failed to update the suffix delimiter of a raw string: "
2437 << llvm::toString(std::move(SuffixErr)) << "\n";
2438 }
2439 }
2440 SourceLocation OriginLoc =
2441 Current.Tok.getLocation().getLocWithOffset(OldPrefixSize);
2442 for (const tooling::Replacement &Fix : Fixes.first) {
2443 auto Err = Whitespaces.addReplacement(tooling::Replacement(
2444 SourceMgr, OriginLoc.getLocWithOffset(Fix.getOffset()),
2445 Fix.getLength(), Fix.getReplacementText()));
2446 if (Err) {
2447 llvm::errs() << "Failed to reformat raw string: "
2448 << llvm::toString(std::move(Err)) << "\n";
2449 }
2450 }
2451 }
2452 unsigned RawLastLineEndColumn = getLastLineEndColumn(
2453 *NewCode, FirstStartColumn, Style.TabWidth, Encoding);
2454 State.Column = RawLastLineEndColumn + NewSuffixSize;
2455 // Since we're updating the column to after the raw string literal here, we
2456 // have to manually add the penalty for the prefix R"delim( over the column
2457 // limit.
2458 unsigned PrefixExcessCharacters =
2459 StartColumn + NewPrefixSize > Style.ColumnLimit
2460 ? StartColumn + NewPrefixSize - Style.ColumnLimit
2461 : 0;
2462 bool IsMultiline =
2463 ContentStartsOnNewline || (NewCode->find('\n') != std::string::npos);
2464 if (IsMultiline) {
2465 // Break before further function parameters on all levels.
2466 for (ParenState &Paren : State.Stack)
2467 Paren.BreakBeforeParameter = true;
2468 }
2469 return Fixes.second + PrefixExcessCharacters * Style.PenaltyExcessCharacter;
2470}
2471
2472unsigned ContinuationIndenter::addMultilineToken(const FormatToken &Current,
2473 LineState &State) {
2474 // Break before further function parameters on all levels.
2475 for (ParenState &Paren : State.Stack)
2476 Paren.BreakBeforeParameter = true;
2477
2478 unsigned ColumnsUsed = State.Column;
2479 // We can only affect layout of the first and the last line, so the penalty
2480 // for all other lines is constant, and we ignore it.
2481 State.Column = Current.LastLineColumnWidth;
2482
2483 if (ColumnsUsed > getColumnLimit(State))
2484 return Style.PenaltyExcessCharacter * (ColumnsUsed - getColumnLimit(State));
2485 return 0;
2486}
2487
2488unsigned ContinuationIndenter::handleEndOfLine(const FormatToken &Current,
2489 LineState &State, bool DryRun,
2490 bool AllowBreak, bool Newline) {
2491 unsigned Penalty = 0;
2492 // Compute the raw string style to use in case this is a raw string literal
2493 // that can be reformatted.
2494 auto RawStringStyle = getRawStringStyle(Current, State);
2495 if (RawStringStyle && !Current.Finalized) {
2496 Penalty = reformatRawStringLiteral(Current, State, *RawStringStyle, DryRun,
2497 Newline);
2498 } else if (Current.IsMultiline && Current.isNot(TT_BlockComment)) {
2499 // Don't break multi-line tokens other than block comments and raw string
2500 // literals. Instead, just update the state.
2501 Penalty = addMultilineToken(Current, State);
2502 } else if (State.Line->Type != LT_ImportStatement) {
2503 // We generally don't break import statements.
2504 LineState OriginalState = State;
2505
2506 // Whether we force the reflowing algorithm to stay strictly within the
2507 // column limit.
2508 bool Strict = false;
2509 // Whether the first non-strict attempt at reflowing did intentionally
2510 // exceed the column limit.
2511 bool Exceeded = false;
2512 std::tie(Penalty, Exceeded) = breakProtrudingToken(
2513 Current, State, AllowBreak, /*DryRun=*/true, Strict);
2514 if (Exceeded) {
2515 // If non-strict reflowing exceeds the column limit, try whether strict
2516 // reflowing leads to an overall lower penalty.
2517 LineState StrictState = OriginalState;
2518 unsigned StrictPenalty =
2519 breakProtrudingToken(Current, StrictState, AllowBreak,
2520 /*DryRun=*/true, /*Strict=*/true)
2521 .first;
2522 Strict = StrictPenalty <= Penalty;
2523 if (Strict) {
2524 Penalty = StrictPenalty;
2525 State = std::move(StrictState);
2526 }
2527 }
2528 if (!DryRun) {
2529 // If we're not in dry-run mode, apply the changes with the decision on
2530 // strictness made above.
2531 breakProtrudingToken(Current, OriginalState, AllowBreak, /*DryRun=*/false,
2532 Strict);
2533 }
2534 }
2535 if (State.Column > getColumnLimit(State)) {
2536 unsigned ExcessCharacters = State.Column - getColumnLimit(State);
2537 Penalty += Style.PenaltyExcessCharacter * ExcessCharacters;
2538 }
2539 return Penalty;
2540}
2541
2542// Returns the enclosing function name of a token, or the empty string if not
2543// found.
2544static StringRef getEnclosingFunctionName(const FormatToken &Current) {
2545 // Look for: 'function(' or 'function<templates>(' before Current.
2546 auto Tok = Current.getPreviousNonComment();
2547 if (!Tok || Tok->isNot(tok::l_paren))
2548 return "";
2549 Tok = Tok->getPreviousNonComment();
2550 if (!Tok)
2551 return "";
2552 if (Tok->is(TT_TemplateCloser)) {
2553 Tok = Tok->MatchingParen;
2554 if (Tok)
2555 Tok = Tok->getPreviousNonComment();
2556 }
2557 if (!Tok || Tok->isNot(tok::identifier))
2558 return "";
2559 return Tok->TokenText;
2560}
2561
2562std::optional<FormatStyle>
2563ContinuationIndenter::getRawStringStyle(const FormatToken &Current,
2564 const LineState &State) {
2565 if (!Current.isStringLiteral())
2566 return std::nullopt;
2567 auto Delimiter = getRawStringDelimiter(Current.TokenText);
2568 if (!Delimiter)
2569 return std::nullopt;
2570 auto RawStringStyle = RawStringFormats.getDelimiterStyle(*Delimiter);
2571 if (!RawStringStyle && Delimiter->empty()) {
2572 RawStringStyle = RawStringFormats.getEnclosingFunctionStyle(
2573 getEnclosingFunctionName(Current));
2574 }
2575 if (!RawStringStyle)
2576 return std::nullopt;
2577 RawStringStyle->ColumnLimit = getColumnLimit(State);
2578 return RawStringStyle;
2579}
2580
2581std::unique_ptr<BreakableToken>
2582ContinuationIndenter::createBreakableToken(const FormatToken &Current,
2583 LineState &State, bool AllowBreak) {
2584 unsigned StartColumn = State.Column - Current.ColumnWidth;
2585 if (Current.isStringLiteral()) {
2586 // Strings in JSON cannot be broken. Breaking strings in JavaScript is
2587 // disabled for now.
2588 if (Style.isJson() || Style.isJavaScript() || !Style.BreakStringLiterals ||
2589 !AllowBreak) {
2590 return nullptr;
2591 }
2592
2593 // Don't break string literals inside preprocessor directives (except for
2594 // #define directives, as their contents are stored in separate lines and
2595 // are not affected by this check).
2596 // This way we avoid breaking code with line directives and unknown
2597 // preprocessor directives that contain long string literals.
2598 if (State.Line->Type == LT_PreprocessorDirective)
2599 return nullptr;
2600 // Exempts unterminated string literals from line breaking. The user will
2601 // likely want to terminate the string before any line breaking is done.
2602 if (Current.IsUnterminatedLiteral)
2603 return nullptr;
2604 // Don't break string literals inside Objective-C array literals (doing so
2605 // raises the warning -Wobjc-string-concatenation).
2606 if (State.Stack.back().IsInsideObjCArrayLiteral)
2607 return nullptr;
2608
2609 // The "DPI"/"DPI-C" in SystemVerilog direct programming interface
2610 // imports/exports cannot be split, e.g.
2611 // `import "DPI" function foo();`
2612 // FIXME: make this use same infra as C++ import checks
2613 if (Style.isVerilog() && Current.Previous &&
2614 Current.Previous->isOneOf(tok::kw_export, Keywords.kw_import)) {
2615 return nullptr;
2616 }
2617 StringRef Text = Current.TokenText;
2618
2619 // We need this to address the case where there is an unbreakable tail only
2620 // if certain other formatting decisions have been taken. The
2621 // UnbreakableTailLength of Current is an overapproximation in that case and
2622 // we need to be correct here.
2623 unsigned UnbreakableTailLength = (State.NextToken && canBreak(State))
2624 ? 0
2625 : Current.UnbreakableTailLength;
2626
2627 if (Style.isVerilog() || Style.isJava() || Style.isJavaScript() ||
2628 Style.isCSharp()) {
2630 if (Style.isJavaScript() && Text.starts_with("'") &&
2631 Text.ends_with("'")) {
2633 } else if (Style.isCSharp() && Text.starts_with("@\"") &&
2634 Text.ends_with("\"")) {
2636 } else if (Text.starts_with("\"") && Text.ends_with("\"")) {
2638 } else {
2639 return nullptr;
2640 }
2641 return std::make_unique<BreakableStringLiteralUsingOperators>(
2642 Current, QuoteStyle,
2643 /*UnindentPlus=*/shouldUnindentNextOperator(Current), StartColumn,
2644 UnbreakableTailLength, State.Line->InPPDirective, Encoding, Style);
2645 }
2646
2647 StringRef Prefix;
2648 StringRef Postfix;
2649 // FIXME: Handle whitespace between '_T', '(', '"..."', and ')'.
2650 // FIXME: Store Prefix and Suffix (or PrefixLength and SuffixLength to
2651 // reduce the overhead) for each FormatToken, which is a string, so that we
2652 // don't run multiple checks here on the hot path.
2653 if ((Text.ends_with(Postfix = "\"") &&
2654 (Text.starts_with(Prefix = "@\"") || Text.starts_with(Prefix = "\"") ||
2655 Text.starts_with(Prefix = "u\"") ||
2656 Text.starts_with(Prefix = "U\"") ||
2657 Text.starts_with(Prefix = "u8\"") ||
2658 Text.starts_with(Prefix = "L\""))) ||
2659 (Text.starts_with(Prefix = "_T(\"") &&
2660 Text.ends_with(Postfix = "\")"))) {
2661 return std::make_unique<BreakableStringLiteral>(
2662 Current, StartColumn, Prefix, Postfix, UnbreakableTailLength,
2663 State.Line->InPPDirective, Encoding, Style);
2664 }
2665 } else if (Current.is(TT_BlockComment)) {
2666 if (Style.ReflowComments == FormatStyle::RCS_Never ||
2667 // If a comment token switches formatting, like
2668 // /* clang-format on */, we don't want to break it further,
2669 // but we may still want to adjust its indentation.
2670 switchesFormatting(Current)) {
2671 return nullptr;
2672 }
2673 return std::make_unique<BreakableBlockComment>(
2674 Current, StartColumn, Current.OriginalColumn, !Current.Previous,
2675 State.Line->InPPDirective, Encoding, Style, Whitespaces.useCRLF());
2676 } else if (Current.is(TT_LineComment) &&
2677 (!Current.Previous ||
2678 Current.Previous->isNot(TT_ImplicitStringLiteral))) {
2679 bool RegularComments = [&]() {
2680 for (const FormatToken *T = &Current; T && T->is(TT_LineComment);
2681 T = T->Next) {
2682 if (!(T->TokenText.starts_with("//") || T->TokenText.starts_with("#")))
2683 return false;
2684 }
2685 return true;
2686 }();
2687 if (Style.ReflowComments == FormatStyle::RCS_Never ||
2688 CommentPragmasRegex.match(Current.TokenText.substr(2)) ||
2689 switchesFormatting(Current) || !RegularComments) {
2690 return nullptr;
2691 }
2692 return std::make_unique<BreakableLineCommentSection>(
2693 Current, StartColumn, /*InPPDirective=*/false, Encoding, Style);
2694 }
2695 return nullptr;
2696}
2697
2698std::pair<unsigned, bool>
2699ContinuationIndenter::breakProtrudingToken(const FormatToken &Current,
2700 LineState &State, bool AllowBreak,
2701 bool DryRun, bool Strict) {
2702 std::unique_ptr<const BreakableToken> Token =
2703 createBreakableToken(Current, State, AllowBreak);
2704 if (!Token)
2705 return {0, false};
2706 assert(Token->getLineCount() > 0);
2707 unsigned ColumnLimit = getColumnLimit(State);
2708 if (Current.is(TT_LineComment)) {
2709 // We don't insert backslashes when breaking line comments.
2710 ColumnLimit = Style.ColumnLimit;
2711 }
2712 if (ColumnLimit == 0) {
2713 // To make the rest of the function easier set the column limit to the
2714 // maximum, if there should be no limit.
2715 ColumnLimit = std::numeric_limits<decltype(ColumnLimit)>::max();
2716 }
2717 if (Current.UnbreakableTailLength >= ColumnLimit)
2718 return {0, false};
2719 // ColumnWidth was already accounted into State.Column before calling
2720 // breakProtrudingToken.
2721 unsigned StartColumn = State.Column - Current.ColumnWidth;
2722 unsigned NewBreakPenalty = Current.isStringLiteral()
2723 ? Style.PenaltyBreakString
2724 : Style.PenaltyBreakComment;
2725 // Stores whether we intentionally decide to let a line exceed the column
2726 // limit.
2727 bool Exceeded = false;
2728 // Stores whether we introduce a break anywhere in the token.
2729 bool BreakInserted = Token->introducesBreakBeforeToken();
2730 // Store whether we inserted a new line break at the end of the previous
2731 // logical line.
2732 bool NewBreakBefore = false;
2733 // We use a conservative reflowing strategy. Reflow starts after a line is
2734 // broken or the corresponding whitespace compressed. Reflow ends as soon as a
2735 // line that doesn't get reflown with the previous line is reached.
2736 bool Reflow = false;
2737 // Keep track of where we are in the token:
2738 // Where we are in the content of the current logical line.
2739 unsigned TailOffset = 0;
2740 // The column number we're currently at.
2741 unsigned ContentStartColumn =
2742 Token->getContentStartColumn(0, /*Break=*/false);
2743 // The number of columns left in the current logical line after TailOffset.
2744 unsigned RemainingTokenColumns =
2745 Token->getRemainingLength(0, TailOffset, ContentStartColumn);
2746 // Adapt the start of the token, for example indent.
2747 if (!DryRun)
2748 Token->adaptStartOfLine(0, Whitespaces);
2749
2750 unsigned ContentIndent = 0;
2751 unsigned Penalty = 0;
2752 LLVM_DEBUG(llvm::dbgs() << "Breaking protruding token at column "
2753 << StartColumn << ".\n");
2754 for (unsigned LineIndex = 0, EndIndex = Token->getLineCount();
2755 LineIndex != EndIndex; ++LineIndex) {
2756 LLVM_DEBUG(llvm::dbgs()
2757 << " Line: " << LineIndex << " (Reflow: " << Reflow << ")\n");
2758 NewBreakBefore = false;
2759 // If we did reflow the previous line, we'll try reflowing again. Otherwise
2760 // we'll start reflowing if the current line is broken or whitespace is
2761 // compressed.
2762 bool TryReflow = Reflow;
2763 // Break the current token until we can fit the rest of the line.
2764 while (ContentStartColumn + RemainingTokenColumns > ColumnLimit) {
2765 LLVM_DEBUG(llvm::dbgs() << " Over limit, need: "
2766 << (ContentStartColumn + RemainingTokenColumns)
2767 << ", space: " << ColumnLimit
2768 << ", reflown prefix: " << ContentStartColumn
2769 << ", offset in line: " << TailOffset << "\n");
2770 // If the current token doesn't fit, find the latest possible split in the
2771 // current line so that breaking at it will be under the column limit.
2772 // FIXME: Use the earliest possible split while reflowing to correctly
2773 // compress whitespace within a line.
2775 Token->getSplit(LineIndex, TailOffset, ColumnLimit,
2776 ContentStartColumn, CommentPragmasRegex);
2777 if (Split.first == StringRef::npos) {
2778 // No break opportunity - update the penalty and continue with the next
2779 // logical line.
2780 if (LineIndex < EndIndex - 1) {
2781 // The last line's penalty is handled in addNextStateToQueue() or when
2782 // calling replaceWhitespaceAfterLastLine below.
2783 Penalty += Style.PenaltyExcessCharacter *
2784 (ContentStartColumn + RemainingTokenColumns - ColumnLimit);
2785 }
2786 LLVM_DEBUG(llvm::dbgs() << " No break opportunity.\n");
2787 break;
2788 }
2789 assert(Split.first != 0);
2790
2791 if (Token->supportsReflow()) {
2792 // Check whether the next natural split point after the current one can
2793 // still fit the line, either because we can compress away whitespace,
2794 // or because the penalty the excess characters introduce is lower than
2795 // the break penalty.
2796 // We only do this for tokens that support reflowing, and thus allow us
2797 // to change the whitespace arbitrarily (e.g. comments).
2798 // Other tokens, like string literals, can be broken on arbitrary
2799 // positions.
2800
2801 // First, compute the columns from TailOffset to the next possible split
2802 // position.
2803 // For example:
2804 // ColumnLimit: |
2805 // // Some text that breaks
2806 // ^ tail offset
2807 // ^-- split
2808 // ^-------- to split columns
2809 // ^--- next split
2810 // ^--------------- to next split columns
2811 unsigned ToSplitColumns = Token->getRangeLength(
2812 LineIndex, TailOffset, Split.first, ContentStartColumn);
2813 LLVM_DEBUG(llvm::dbgs() << " ToSplit: " << ToSplitColumns << "\n");
2814
2815 BreakableToken::Split NextSplit = Token->getSplit(
2816 LineIndex, TailOffset + Split.first + Split.second, ColumnLimit,
2817 ContentStartColumn + ToSplitColumns + 1, CommentPragmasRegex);
2818 // Compute the columns necessary to fit the next non-breakable sequence
2819 // into the current line.
2820 unsigned ToNextSplitColumns = 0;
2821 if (NextSplit.first == StringRef::npos) {
2822 ToNextSplitColumns = Token->getRemainingLength(LineIndex, TailOffset,
2823 ContentStartColumn);
2824 } else {
2825 ToNextSplitColumns = Token->getRangeLength(
2826 LineIndex, TailOffset,
2827 Split.first + Split.second + NextSplit.first, ContentStartColumn);
2828 }
2829 // Compress the whitespace between the break and the start of the next
2830 // unbreakable sequence.
2831 ToNextSplitColumns =
2832 Token->getLengthAfterCompression(ToNextSplitColumns, Split);
2833 LLVM_DEBUG(llvm::dbgs()
2834 << " ContentStartColumn: " << ContentStartColumn << "\n");
2835 LLVM_DEBUG(llvm::dbgs()
2836 << " ToNextSplit: " << ToNextSplitColumns << "\n");
2837 // If the whitespace compression makes us fit, continue on the current
2838 // line.
2839 bool ContinueOnLine =
2840 ContentStartColumn + ToNextSplitColumns <= ColumnLimit;
2841 unsigned ExcessCharactersPenalty = 0;
2842 if (!ContinueOnLine && !Strict) {
2843 // Similarly, if the excess characters' penalty is lower than the
2844 // penalty of introducing a new break, continue on the current line.
2845 ExcessCharactersPenalty =
2846 (ContentStartColumn + ToNextSplitColumns - ColumnLimit) *
2847 Style.PenaltyExcessCharacter;
2848 LLVM_DEBUG(llvm::dbgs()
2849 << " Penalty excess: " << ExcessCharactersPenalty
2850 << "\n break : " << NewBreakPenalty << "\n");
2851 if (ExcessCharactersPenalty < NewBreakPenalty) {
2852 Exceeded = true;
2853 ContinueOnLine = true;
2854 }
2855 }
2856 if (ContinueOnLine) {
2857 LLVM_DEBUG(llvm::dbgs() << " Continuing on line...\n");
2858 // The current line fits after compressing the whitespace - reflow
2859 // the next line into it if possible.
2860 TryReflow = true;
2861 if (!DryRun) {
2862 Token->compressWhitespace(LineIndex, TailOffset, Split,
2863 Whitespaces);
2864 }
2865 // When we continue on the same line, leave one space between content.
2866 ContentStartColumn += ToSplitColumns + 1;
2867 Penalty += ExcessCharactersPenalty;
2868 TailOffset += Split.first + Split.second;
2869 RemainingTokenColumns = Token->getRemainingLength(
2870 LineIndex, TailOffset, ContentStartColumn);
2871 continue;
2872 }
2873 }
2874 LLVM_DEBUG(llvm::dbgs() << " Breaking...\n");
2875 // Update the ContentIndent only if the current line was not reflown with
2876 // the previous line, since in that case the previous line should still
2877 // determine the ContentIndent. Also never intent the last line.
2878 if (!Reflow)
2879 ContentIndent = Token->getContentIndent(LineIndex);
2880 LLVM_DEBUG(llvm::dbgs()
2881 << " ContentIndent: " << ContentIndent << "\n");
2882 ContentStartColumn = ContentIndent + Token->getContentStartColumn(
2883 LineIndex, /*Break=*/true);
2884
2885 unsigned NewRemainingTokenColumns = Token->getRemainingLength(
2886 LineIndex, TailOffset + Split.first + Split.second,
2887 ContentStartColumn);
2888 if (NewRemainingTokenColumns == 0) {
2889 // No content to indent.
2890 ContentIndent = 0;
2891 ContentStartColumn =
2892 Token->getContentStartColumn(LineIndex, /*Break=*/true);
2893 NewRemainingTokenColumns = Token->getRemainingLength(
2894 LineIndex, TailOffset + Split.first + Split.second,
2895 ContentStartColumn);
2896 }
2897
2898 // When breaking before a tab character, it may be moved by a few columns,
2899 // but will still be expanded to the next tab stop, so we don't save any
2900 // columns.
2901 if (NewRemainingTokenColumns >= RemainingTokenColumns) {
2902 // FIXME: Do we need to adjust the penalty?
2903 break;
2904 }
2905
2906 LLVM_DEBUG(llvm::dbgs() << " Breaking at: " << TailOffset + Split.first
2907 << ", " << Split.second << "\n");
2908 if (!DryRun) {
2909 Token->insertBreak(LineIndex, TailOffset, Split, ContentIndent,
2910 Whitespaces);
2911 }
2912
2913 Penalty += NewBreakPenalty;
2914 TailOffset += Split.first + Split.second;
2915 RemainingTokenColumns = NewRemainingTokenColumns;
2916 BreakInserted = true;
2917 NewBreakBefore = true;
2918 }
2919 // In case there's another line, prepare the state for the start of the next
2920 // line.
2921 if (LineIndex + 1 != EndIndex) {
2922 unsigned NextLineIndex = LineIndex + 1;
2923 if (NewBreakBefore) {
2924 // After breaking a line, try to reflow the next line into the current
2925 // one once RemainingTokenColumns fits.
2926 TryReflow = true;
2927 }
2928 if (TryReflow) {
2929 // We decided that we want to try reflowing the next line into the
2930 // current one.
2931 // We will now adjust the state as if the reflow is successful (in
2932 // preparation for the next line), and see whether that works. If we
2933 // decide that we cannot reflow, we will later reset the state to the
2934 // start of the next line.
2935 Reflow = false;
2936 // As we did not continue breaking the line, RemainingTokenColumns is
2937 // known to fit after ContentStartColumn. Adapt ContentStartColumn to
2938 // the position at which we want to format the next line if we do
2939 // actually reflow.
2940 // When we reflow, we need to add a space between the end of the current
2941 // line and the next line's start column.
2942 ContentStartColumn += RemainingTokenColumns + 1;
2943 // Get the split that we need to reflow next logical line into the end
2944 // of the current one; the split will include any leading whitespace of
2945 // the next logical line.
2946 BreakableToken::Split SplitBeforeNext =
2947 Token->getReflowSplit(NextLineIndex, CommentPragmasRegex);
2948 LLVM_DEBUG(llvm::dbgs()
2949 << " Size of reflown text: " << ContentStartColumn
2950 << "\n Potential reflow split: ");
2951 if (SplitBeforeNext.first != StringRef::npos) {
2952 LLVM_DEBUG(llvm::dbgs() << SplitBeforeNext.first << ", "
2953 << SplitBeforeNext.second << "\n");
2954 TailOffset = SplitBeforeNext.first + SplitBeforeNext.second;
2955 // If the rest of the next line fits into the current line below the
2956 // column limit, we can safely reflow.
2957 RemainingTokenColumns = Token->getRemainingLength(
2958 NextLineIndex, TailOffset, ContentStartColumn);
2959 Reflow = true;
2960 if (ContentStartColumn + RemainingTokenColumns > ColumnLimit) {
2961 LLVM_DEBUG(llvm::dbgs()
2962 << " Over limit after reflow, need: "
2963 << (ContentStartColumn + RemainingTokenColumns)
2964 << ", space: " << ColumnLimit
2965 << ", reflown prefix: " << ContentStartColumn
2966 << ", offset in line: " << TailOffset << "\n");
2967 // If the whole next line does not fit, try to find a point in
2968 // the next line at which we can break so that attaching the part
2969 // of the next line to that break point onto the current line is
2970 // below the column limit.
2972 Token->getSplit(NextLineIndex, TailOffset, ColumnLimit,
2973 ContentStartColumn, CommentPragmasRegex);
2974 if (Split.first == StringRef::npos) {
2975 LLVM_DEBUG(llvm::dbgs() << " Did not find later break\n");
2976 Reflow = false;
2977 } else {
2978 // Check whether the first split point gets us below the column
2979 // limit. Note that we will execute this split below as part of
2980 // the normal token breaking and reflow logic within the line.
2981 unsigned ToSplitColumns = Token->getRangeLength(
2982 NextLineIndex, TailOffset, Split.first, ContentStartColumn);
2983 if (ContentStartColumn + ToSplitColumns > ColumnLimit) {
2984 LLVM_DEBUG(llvm::dbgs() << " Next split protrudes, need: "
2985 << (ContentStartColumn + ToSplitColumns)
2986 << ", space: " << ColumnLimit);
2987 unsigned ExcessCharactersPenalty =
2988 (ContentStartColumn + ToSplitColumns - ColumnLimit) *
2989 Style.PenaltyExcessCharacter;
2990 if (NewBreakPenalty < ExcessCharactersPenalty)
2991 Reflow = false;
2992 }
2993 }
2994 }
2995 } else {
2996 LLVM_DEBUG(llvm::dbgs() << "not found.\n");
2997 }
2998 }
2999 if (!Reflow) {
3000 // If we didn't reflow into the next line, the only space to consider is
3001 // the next logical line. Reset our state to match the start of the next
3002 // line.
3003 TailOffset = 0;
3004 ContentStartColumn =
3005 Token->getContentStartColumn(NextLineIndex, /*Break=*/false);
3006 RemainingTokenColumns = Token->getRemainingLength(
3007 NextLineIndex, TailOffset, ContentStartColumn);
3008 // Adapt the start of the token, for example indent.
3009 if (!DryRun)
3010 Token->adaptStartOfLine(NextLineIndex, Whitespaces);
3011 } else {
3012 // If we found a reflow split and have added a new break before the next
3013 // line, we are going to remove the line break at the start of the next
3014 // logical line. For example, here we'll add a new line break after
3015 // 'text', and subsequently delete the line break between 'that' and
3016 // 'reflows'.
3017 // // some text that
3018 // // reflows
3019 // ->
3020 // // some text
3021 // // that reflows
3022 // When adding the line break, we also added the penalty for it, so we
3023 // need to subtract that penalty again when we remove the line break due
3024 // to reflowing.
3025 if (NewBreakBefore) {
3026 assert(Penalty >= NewBreakPenalty);
3027 Penalty -= NewBreakPenalty;
3028 }
3029 if (!DryRun)
3030 Token->reflow(NextLineIndex, Whitespaces);
3031 }
3032 }
3033 }
3034
3035 BreakableToken::Split SplitAfterLastLine =
3036 Token->getSplitAfterLastLine(TailOffset);
3037 if (SplitAfterLastLine.first != StringRef::npos) {
3038 LLVM_DEBUG(llvm::dbgs() << "Replacing whitespace after last line.\n");
3039
3040 // We add the last line's penalty here, since that line is going to be split
3041 // now.
3042 Penalty += Style.PenaltyExcessCharacter *
3043 (ContentStartColumn + RemainingTokenColumns - ColumnLimit);
3044
3045 if (!DryRun) {
3046 Token->replaceWhitespaceAfterLastLine(TailOffset, SplitAfterLastLine,
3047 Whitespaces);
3048 }
3049 ContentStartColumn =
3050 Token->getContentStartColumn(Token->getLineCount() - 1, /*Break=*/true);
3051 RemainingTokenColumns = Token->getRemainingLength(
3052 Token->getLineCount() - 1,
3053 TailOffset + SplitAfterLastLine.first + SplitAfterLastLine.second,
3054 ContentStartColumn);
3055 }
3056
3057 State.Column = ContentStartColumn + RemainingTokenColumns -
3058 Current.UnbreakableTailLength;
3059
3060 if (BreakInserted) {
3061 if (!DryRun)
3062 Token->updateAfterBroken(Whitespaces);
3063
3064 // If we break the token inside a parameter list, we need to break before
3065 // the next parameter on all levels, so that the next parameter is clearly
3066 // visible. Line comments already introduce a break.
3067 if (Current.isNot(TT_LineComment))
3068 for (ParenState &Paren : State.Stack)
3069 Paren.BreakBeforeParameter = true;
3070
3071 if (Current.is(TT_BlockComment))
3072 State.NoContinuation = true;
3073
3074 State.Stack.back().LastSpace = StartColumn;
3075 }
3076
3077 Token->updateNextToken(State);
3078
3079 return {Penalty, Exceeded};
3080}
3081
3083 // In preprocessor directives reserve two chars for trailing " \".
3084 return Style.ColumnLimit - (State.Line->InPPDirective ? 2 : 0);
3085}
3086
3087bool ContinuationIndenter::nextIsMultilineString(const LineState &State) {
3088 const FormatToken &Current = *State.NextToken;
3089 if (!Current.isStringLiteral() || Current.is(TT_ImplicitStringLiteral))
3090 return false;
3091 // We never consider raw string literals "multiline" for the purpose of
3092 // AlwaysBreakBeforeMultilineStrings implementation as they are special-cased
3093 // (see TokenAnnotator::mustBreakBefore().
3094 if (Current.TokenText.starts_with("R\""))
3095 return false;
3096 if (Current.IsMultiline)
3097 return true;
3098 if (Current.getNextNonComment() &&
3099 Current.getNextNonComment()->isStringLiteral()) {
3100 return true; // Implicit concatenation.
3101 }
3102 if (Style.ColumnLimit != 0 && Style.BreakStringLiterals &&
3103 State.Column + Current.ColumnWidth + Current.UnbreakableTailLength >
3104 Style.ColumnLimit) {
3105 return true; // String will be split.
3106 }
3107 return false;
3108}
3109
3110} // namespace format
3111} // namespace clang
Declares BreakableToken, BreakableStringLiteral, BreakableComment, BreakableBlockComment and Breakabl...
This file implements an indenter that manages the indentation of continuations.
This file declares Format APIs to be used internally by the formatting library implementation.
This file contains the declaration of the FormatToken, a wrapper around Token with additional informa...
unsigned UnbreakableTailLength
The length of following tokens until the next natural split point, or the next token that can be brok...
unsigned ColumnWidth
The width of the non-whitespace parts of the token (or its first line for multi-line tokens) in colum...
int Newlines
The number of newlines immediately before the Token after formatting.
StringRef TokenText
The raw text of the token.
unsigned IsMultiline
Whether the token text contains newlines (escaped or not).
FormatToken()
unsigned LongestObjCSelectorName
If this is the first ObjC selector name in an ObjC method definition or call, this contains the lengt...
Token Tok
The Token.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
Various functions to configurably format source code.
Defines and computes precedence levels for binary/ternary operators.
static bool contains(const std::set< tok::TokenKind > &Terminators, const Token &Tok)
Defines the SourceManager interface.
Defines the clang::TokenKind enum and support functions.
WhitespaceManager class manages whitespace around tokens and their replacements.
__DEVICE__ int max(int __a, int __b)
This class handles loading and caching of source files into memory.
SourceLocation getEnd() const
SourceLocation getBegin() const
Token - This structure provides full information about a lexed token.
Definition Token.h:36
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)) {....
Definition Token.h:104
tok::TokenKind getKind() const
Definition Token.h:99
std::pair< StringRef::size_type, unsigned > Split
Contains starting character index and length of split.
bool canBreak(const LineState &State)
Returns true, if a line break after State is allowed.
unsigned addTokenToState(LineState &State, bool Newline, bool DryRun, unsigned ExtraSpaces=0)
Appends the next token to State and updates information necessary for indentation.
unsigned getColumnLimit(const LineState &State) const
Get the column limit for this line.
LineState getInitialState(unsigned FirstIndent, unsigned FirstStartColumn, const AnnotatedLine *Line, bool DryRun)
Get the initial state, i.e.
ContinuationIndenter(const FormatStyle &Style, const AdditionalKeywords &Keywords, const SourceManager &SourceMgr, WhitespaceManager &Whitespaces, encoding::Encoding Encoding, bool BinPackInconclusiveFunctions)
Constructs a ContinuationIndenter to format Line starting in column FirstIndent.
bool mustBreak(const LineState &State)
Returns true, if a line break after State is mandatory.
Manages the whitespaces around tokens and their replacements.
unsigned columnWidthWithTabs(StringRef Text, unsigned StartColumn, unsigned TabWidth, Encoding Encoding)
Returns the number of columns required to display the Text, starting from the StartColumn on a termin...
Definition Encoding.h:60
std::pair< tooling::Replacements, unsigned > reformat(const FormatStyle &Style, StringRef Code, ArrayRef< tooling::Range > Ranges, unsigned FirstStartColumn, unsigned NextStartColumn, unsigned LastStartColumn, StringRef FileName, FormattingAttemptStatus *Status)
Reformats the given Ranges in the code fragment Code.
Definition Format.cpp:4113
static bool mustBreakBinaryOperation(const FormatToken &Current, const FormatStyle &Style)
static unsigned getLastLineEndColumn(StringRef Text, unsigned StartColumn, unsigned TabWidth, encoding::Encoding Encoding)
static bool shouldUnindentNextOperator(const FormatToken &Tok)
bool switchesFormatting(const FormatToken &Token)
Checks if Token switches formatting, like /* clang-format off *‍/.
static bool hasNestedBlockInlined(const FormatToken *Previous, const FormatToken &Current, const FormatStyle &Style)
static bool startsSegmentOfBuilderTypeCall(const FormatToken &Tok)
static unsigned getLengthToNextOperator(const FormatToken &Tok)
static bool isAlignableBinaryOperator(const FormatToken &Token)
static unsigned getLengthToMatchingParen(const FormatToken &Tok, ArrayRef< ParenState > Stack)
static bool shouldIndentWrappedSelectorName(const FormatStyle &Style, LineType LineType)
bool getPredefinedStyle(StringRef Name, FormatStyle::LanguageKind Language, FormatStyle *Style)
Definition Format.cpp:2318
static std::optional< StringRef > getRawStringDelimiter(StringRef TokenText)
static unsigned getChainLength(const FormatToken &Op)
static StringRef getCanonicalRawStringDelimiter(const FormatStyle &Style, FormatStyle::LanguageKind Language)
FormatStyle getLLVMStyle(FormatStyle::LanguageKind Language)
Definition Format.cpp:1744
static bool startsNextOperand(const FormatToken &Current)
static bool opensProtoMessageField(const FormatToken &LessTok, const FormatStyle &Style)
static StringRef getEnclosingFunctionName(const FormatToken &Current)
bool startsNextParameter(const FormatToken &Current, const FormatStyle &Style)
bool applyAllReplacements(const Replacements &Replaces, Rewriter &Rewrite)
Apply all replacements in Replaces to the Rewriter Rewrite.
The JSON file list parser is used to communicate input to InstallAPI.
unsigned TabWidth
The number of columns used for tab stops.
Definition Format.h:5771
std::vector< RawStringFormat > RawStringFormats
Defines hints for detecting supported languages code blocks in raw strings.
Definition Format.h:4503
raw_ostream & Indent(raw_ostream &Out, const unsigned int Space, bool IsDot)
Definition JsonSupport.h:21
Language
The language for the input, used to select and validate the language standard and possible actions.
BinPackStyle ObjCBinPackProtocolList
Controls bin-packing Objective-C protocol conformance list items into as few lines as possible when t...
Definition Format.h:4119
unsigned MaxEmptyLinesToKeep
The maximum number of consecutive empty lines to keep.
Definition Format.h:3968
Encapsulates keywords that are context sensitive or for languages not properly supported by Clang's l...
See documentation of RawStringFormats.
Definition Format.h:4446
std::vector< std::string > Delimiters
A list of raw string delimiters that match this language.
Definition Format.h:4450
std::vector< std::string > EnclosingFunctions
A list of enclosing function names that match this language.
Definition Format.h:4452
std::string BasedOnStyle
The style name on which this raw string format is based on. If not specified, the raw string format i...
Definition Format.h:4458
LanguageKind Language
The language of this raw string.
Definition Format.h:4448
A wrapper around a Token storing information about the whitespace characters preceding it.
unsigned NestingLevel
The nesting level of this token, i.e.
bool MacroParent
When macro expansion introduces nodes with children, those are marked as MacroParent.
unsigned StartsBinaryExpression
true if this token starts a binary expression, i.e.
unsigned OriginalColumn
The original 0-based column of this token, including expanded tabs.
unsigned CanBreakBefore
true if it is allowed to break before this token.
bool isNot(T Kind) const
StringRef TokenText
The raw text of the token.
unsigned LongestObjCSelectorName
If this is the first ObjC selector name in an ObjC method definition or call, this contains the lengt...
unsigned LastNewlineOffset
The offset just past the last ' ' in this token's leading whitespace (relative to WhiteSpaceStart).
bool isNoneOf(Ts... Ks) const
FormatToken * Next
The next token in the unwrapped line.
unsigned IsMultiline
Whether the token text contains newlines (escaped or not).
unsigned NewlinesBefore
The number of newlines immediately before the Token.
unsigned SpacesRequiredBefore
The number of spaces that should be inserted before this token.
std::shared_ptr< TokenRole > Role
A token can have a special role that can carry extra information about the token's formatting.
unsigned MustBreakBefore
Whether there must be a line break before this token.
unsigned ColumnWidth
The width of the non-whitespace parts of the token (or its first line for multi-line tokens) in colum...
unsigned ObjCSelectorNameParts
If this is the first ObjC selector name in an ObjC method definition or call, this contains the numbe...
unsigned UnbreakableTailLength
The length of following tokens until the next natural split point, or the next token that can be brok...
bool is(tok::TokenKind Kind) const
unsigned TotalLength
The total length of the unwrapped line up to and including this token.
bool isOneOf(A K1, B K2) const
SourceRange WhitespaceRange
The range of the whitespace immediately preceding the Token.
FormatToken * MatchingParen
If this is a bracket, this points to the matching one.
FormatToken * Previous
The previous token in the unwrapped line.
Represents the spaces at the start of a line, keeping track of what the spaces are for.
IndentationAndAlignment operator+(unsigned Spaces) const
Adding indentation is more common than padding. So the operator does that.
IndentationAndAlignment(unsigned Total, unsigned IndentedFrom)
IndentationAndAlignment addPadding(unsigned Spaces) const
Add spaces for right-justifying the token.
IndentationAndAlignment operator-(unsigned Spaces) const
IndentationAndAlignment & operator+=(unsigned Spaces)
bool operator<(const IndentationAndAlignment &Other) const
unsigned IndentedFrom
The column that the position of the start of the line is calculated from.
The current state when indenting a unwrapped line.
const AnnotatedLine * Line
The line that is being formatted.
unsigned Column
The number of used columns in the current line.
SmallVector< ParenState > Stack
A stack keeping track of properties applying to parenthesis levels.
unsigned FirstIndent
The indent of the first token.
llvm::StringMap< FormatStyle > EnclosingFunctionStyle
std::optional< FormatStyle > getDelimiterStyle(StringRef Delimiter) const
std::optional< FormatStyle > getEnclosingFunctionStyle(StringRef EnclosingFunction) const
RawStringFormatStyleManager(const FormatStyle &CodeStyle)
llvm::StringMap< FormatStyle > DelimiterStyle