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 assert(Tok);
714 }
715 if (Tok->FirstAfterPPLine)
716 return false;
717 }
718
719 return true;
720 }
721
722 // The following could be precomputed as they do not depend on the state.
723 // However, as they should take effect only if the UnwrappedLine does not fit
724 // into the ColumnLimit, they are checked here in the ContinuationIndenter.
725 if (Style.ColumnLimit != 0 && Previous.is(BK_Block) &&
726 Previous.is(tok::l_brace) &&
727 Current.isNoneOf(tok::r_brace, tok::comment)) {
728 return true;
729 }
730
731 if (Current.is(tok::lessless) &&
732 ((Previous.is(tok::identifier) && Previous.TokenText == "endl") ||
733 (Previous.Tok.isLiteral() && (Previous.TokenText.ends_with("\\n\"") ||
734 Previous.TokenText == "\'\\n\'")))) {
735 return true;
736 }
737
738 if (Previous.is(TT_BlockComment) && Previous.IsMultiline)
739 return true;
740
741 if (State.NoContinuation)
742 return true;
743
744 return false;
745}
746
748 bool DryRun,
749 unsigned ExtraSpaces) {
750 const FormatToken &Current = *State.NextToken;
751 assert(State.NextToken->Previous);
752 const FormatToken &Previous = *State.NextToken->Previous;
753
754 assert(!State.Stack.empty());
755 State.NoContinuation = false;
756
757 if (Current.is(TT_ImplicitStringLiteral) &&
758 (!Previous.Tok.getIdentifierInfo() ||
759 Previous.Tok.getIdentifierInfo()->getPPKeywordID() ==
760 tok::pp_not_keyword)) {
761 unsigned EndColumn =
762 SourceMgr.getSpellingColumnNumber(Current.WhitespaceRange.getEnd());
763 if (Current.LastNewlineOffset != 0) {
764 // If there is a newline within this token, the final column will solely
765 // determined by the current end column.
766 State.Column = EndColumn;
767 } else {
768 unsigned StartColumn =
769 SourceMgr.getSpellingColumnNumber(Current.WhitespaceRange.getBegin());
770 assert(EndColumn >= StartColumn);
771 State.Column += EndColumn - StartColumn;
772 }
773 moveStateToNextToken(State, DryRun, /*Newline=*/false);
774 return 0;
775 }
776
777 unsigned Penalty = 0;
778 if (Newline)
779 Penalty = addTokenOnNewLine(State, DryRun);
780 else
781 addTokenOnCurrentLine(State, DryRun, ExtraSpaces);
782
783 return moveStateToNextToken(State, DryRun, Newline) + Penalty;
784}
785
786void ContinuationIndenter::addTokenOnCurrentLine(LineState &State, bool DryRun,
787 unsigned ExtraSpaces) {
788 FormatToken &Current = *State.NextToken;
789 assert(State.NextToken->Previous);
790 const FormatToken &Previous = *State.NextToken->Previous;
791 auto &CurrentState = State.Stack.back();
792
793 // Deal with lambda arguments in C++. The aim here is to ensure that we don't
794 // over-indent lambda function bodies when lambdas are passed as arguments to
795 // function calls. We do this by ensuring that either all arguments (including
796 // any lambdas) go on the same line as the function call, or we break before
797 // the first argument.
798 auto DisallowLineBreaks = [&] {
799 if (!Style.isCpp() ||
800 Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope) {
801 return false;
802 }
803
804 // For example, `/*Newline=*/false`.
805 if (Previous.is(TT_BlockComment) && Current.SpacesRequiredBefore == 0)
806 return false;
807
808 if (Current.isOneOf(tok::comment, tok::l_paren, TT_LambdaLSquare))
809 return false;
810
811 const auto *Prev = Current.getPreviousNonComment();
812 if (!Prev || Prev->isNot(tok::l_paren))
813 return false;
814
815 if (Prev->BlockParameterCount == 0)
816 return false;
817
818 // Multiple lambdas in the same function call.
819 if (Prev->BlockParameterCount > 1)
820 return true;
821
822 // A lambda followed by another arg.
823 if (!Prev->Role)
824 return false;
825
826 const auto *Comma = Prev->Role->lastComma();
827 if (!Comma)
828 return false;
829
830 const auto *Next = Comma->getNextNonComment();
831 return Next && Next->isNoneOf(TT_LambdaLSquare, tok::l_brace, tok::caret);
832 };
833
834 if (DisallowLineBreaks())
835 State.NoLineBreak = true;
836
837 if (Current.is(tok::equal) &&
838 (State.Line->First->is(tok::kw_for) || Current.NestingLevel == 0) &&
839 CurrentState.VariablePos == 0 &&
840 (!Previous.Previous ||
841 Previous.Previous->isNot(TT_DesignatedInitializerPeriod))) {
842 CurrentState.VariablePos = State.Column;
843 // Move over * and & if they are bound to the variable name.
844 const FormatToken *Tok = &Previous;
845 while (Tok && CurrentState.VariablePos >= Tok->ColumnWidth) {
846 CurrentState.VariablePos -= Tok->ColumnWidth;
847 if (Tok->SpacesRequiredBefore != 0)
848 break;
849 Tok = Tok->Previous;
850 }
851 if (Previous.PartOfMultiVariableDeclStmt)
852 CurrentState.LastSpace = CurrentState.VariablePos;
853 }
854
855 unsigned Spaces = Current.SpacesRequiredBefore + ExtraSpaces;
856
857 // Indent preprocessor directives after the hash if required.
858 int PPColumnCorrection = 0;
859 if (&Previous == State.Line->First && Previous.is(tok::hash) &&
861 State.Line->Type == LT_ImportStatement)) {
862 if (Style.IndentPPDirectives == FormatStyle::PPDIS_AfterHash) {
863 Spaces += State.FirstIndent;
864
865 // For preprocessor indent with tabs, State.Column will be 1 because of
866 // the hash. This causes second-level indents onward to have an extra
867 // space after the tabs. We avoid this misalignment by subtracting 1 from
868 // the column value passed to replaceWhitespace().
869 if (Style.UseTab != FormatStyle::UT_Never)
870 PPColumnCorrection = -1;
871 } else if (Style.IndentPPDirectives == FormatStyle::PPDIS_Leave) {
872 Spaces += Current.OriginalColumn - Previous.OriginalColumn - 1;
873 }
874 }
875
876 if (!DryRun) {
877 const bool ContinuePPDirective =
878 State.Line->InMacroBody && Current.isNot(TT_LineComment);
879 Whitespaces.replaceWhitespace(Current, /*Newlines=*/0, Spaces,
880 State.Column + Spaces + PPColumnCorrection,
881 /*IsAligned=*/false, ContinuePPDirective);
882 }
883
884 // If "BreakBeforeInheritanceComma" mode, don't break within the inheritance
885 // declaration unless there is multiple inheritance.
886 if (Style.BreakInheritanceList == FormatStyle::BILS_BeforeComma &&
887 Current.is(TT_InheritanceColon)) {
888 CurrentState.NoLineBreak = true;
889 }
890 if (Style.BreakInheritanceList == FormatStyle::BILS_AfterColon &&
891 Previous.is(TT_InheritanceColon)) {
892 CurrentState.NoLineBreak = true;
893 }
894
895 if (Current.is(TT_SelectorName) && !CurrentState.ObjCSelectorNameFound) {
896 unsigned MinIndent =
897 std::max(State.FirstIndent + Style.ContinuationIndentWidth,
898 CurrentState.Indent.Total);
899 unsigned FirstColonPos = State.Column + Spaces + Current.ColumnWidth;
900 if (Current.LongestObjCSelectorName == 0)
901 CurrentState.AlignColons = false;
902 else if (MinIndent + Current.LongestObjCSelectorName > FirstColonPos)
903 CurrentState.ColonPos = MinIndent + Current.LongestObjCSelectorName;
904 else
905 CurrentState.ColonPos = FirstColonPos;
906 }
907
908 // In "AlwaysBreak" or "BlockIndent" mode, enforce wrapping directly after the
909 // parenthesis by disallowing any further line breaks if there is no line
910 // break after the opening parenthesis. Don't break if it doesn't conserve
911 // columns.
912 auto IsOpeningBracket = [&](const FormatToken &Tok) {
913 auto IsStartOfBracedList = [&]() {
914 return Tok.is(tok::l_brace) && Tok.isNot(BK_Block) &&
915 Style.Cpp11BracedListStyle != FormatStyle::BLS_Block;
916 };
917 if (IsStartOfBracedList())
918 return Style.BreakAfterOpenBracketBracedList;
919 if (Tok.isNoneOf(tok::l_paren, TT_TemplateOpener, tok::l_square))
920 return false;
921 if (!Tok.Previous)
922 return true;
923 if (Tok.Previous->isIf())
924 return Style.BreakAfterOpenBracketIf;
925 if (Tok.Previous->isLoop(Style))
926 return Style.BreakAfterOpenBracketLoop;
927 if (Tok.Previous->is(tok::kw_switch))
928 return Style.BreakAfterOpenBracketSwitch;
929 if (Style.BreakAfterOpenBracketFunction) {
930 return !Tok.Previous->is(TT_CastRParen) &&
931 !(Style.isJavaScript() && Tok.is(Keywords.kw_await));
932 }
933 return false;
934 };
935 auto IsFunctionCallParen = [](const FormatToken &Tok) {
936 return Tok.is(tok::l_paren) && Tok.ParameterCount > 0 && Tok.Previous &&
937 Tok.Previous->is(tok::identifier);
938 };
939 auto IsInTemplateString = [this](const FormatToken &Tok, bool NestBlocks) {
940 if (!Style.isJavaScript())
941 return false;
942 for (const auto *Prev = &Tok; Prev; Prev = Prev->Previous) {
943 if (Prev->is(TT_TemplateString) && Prev->opensScope())
944 return true;
945 if (Prev->opensScope() && !NestBlocks)
946 return false;
947 if (Prev->is(TT_TemplateString) && Prev->closesScope())
948 return false;
949 }
950 return false;
951 };
952 // Identifies simple (no expression) one-argument function calls.
953 auto StartsSimpleOneArgList = [&](const FormatToken &TokAfterLParen) {
954 assert(TokAfterLParen.isNot(tok::comment) || TokAfterLParen.Next);
955 const auto &Tok =
956 TokAfterLParen.is(tok::comment) ? *TokAfterLParen.Next : TokAfterLParen;
957 if (!Tok.FakeLParens.empty() && Tok.FakeLParens.back() > prec::Unknown)
958 return false;
959 // Nested calls that involve `new` expressions also look like simple
960 // function calls, eg:
961 // - foo(new Bar())
962 // - foo(::new Bar())
963 if (Tok.is(tok::kw_new) || Tok.startsSequence(tok::coloncolon, tok::kw_new))
964 return true;
965 if (Tok.is(TT_UnaryOperator) ||
966 (Style.isJavaScript() &&
967 Tok.isOneOf(tok::ellipsis, Keywords.kw_await))) {
968 return true;
969 }
970 const auto *Previous = TokAfterLParen.Previous;
971 assert(Previous); // IsOpeningBracket(Previous)
972 if (Previous->Previous &&
973 (Previous->Previous->isIf() || Previous->Previous->isLoop(Style) ||
974 Previous->Previous->is(tok::kw_switch))) {
975 return false;
976 }
977 if (Previous->isNoneOf(TT_FunctionDeclarationLParen,
978 TT_LambdaDefinitionLParen) &&
979 !IsFunctionCallParen(*Previous)) {
980 return true;
981 }
982 if (IsOpeningBracket(Tok) || IsInTemplateString(Tok, true))
983 return true;
984 const auto *Next = Tok.Next;
985 return !Next || Next->isMemberAccess() ||
986 Next->is(TT_FunctionDeclarationLParen) || IsFunctionCallParen(*Next);
987 };
988 if (IsOpeningBracket(Previous) &&
989 State.Column > getNewLineColumn(State).Total &&
990 // Don't do this for simple (no expressions) one-argument function calls
991 // as that feels like needlessly wasting whitespace, e.g.:
992 //
993 // caaaaaaaaaaaall(
994 // caaaaaaaaaaaall(
995 // caaaaaaaaaaaall(
996 // caaaaaaaaaaaaaaaaaaaaaaall(aaaaaaaaaaaaaa, aaaaaaaaa))));
997 // or
998 // caaaaaaaaaaaaaaaaaaaaal(
999 // new SomethingElseeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee());
1000 !StartsSimpleOneArgList(Current)) {
1001 CurrentState.NoLineBreak = true;
1002 }
1003
1004 if (Previous.is(TT_TemplateString) && Previous.opensScope())
1005 CurrentState.NoLineBreak = true;
1006
1007 // Align following lines within parentheses / brackets if configured.
1008 // Note: This doesn't apply to macro expansion lines, which are MACRO( , , )
1009 // with args as children of the '(' and ',' tokens. It does not make sense to
1010 // align the commas with the opening paren.
1011 if (Style.AlignAfterOpenBracket &&
1012 !CurrentState.IsCSharpGenericTypeConstraint && Previous.opensScope() &&
1013 Previous.isNoneOf(TT_ObjCMethodExpr, TT_RequiresClause,
1014 TT_TableGenDAGArgOpener,
1015 TT_TableGenDAGArgOpenerToBreak) &&
1016 !(Current.MacroParent && Previous.MacroParent) &&
1017 (Current.isNot(TT_LineComment) ||
1018 (Previous.is(BK_BracedInit) &&
1019 (Style.Cpp11BracedListStyle != FormatStyle::BLS_FunctionCall ||
1020 !Previous.Previous ||
1021 Previous.Previous->isNoneOf(tok::identifier, tok::l_paren,
1022 BK_BracedInit))) ||
1023 Previous.is(TT_VerilogMultiLineListLParen)) &&
1024 !IsInTemplateString(Current, false)) {
1025 CurrentState.Indent = State.Column + Spaces;
1026 CurrentState.IsAligned = true;
1027 }
1028 if (CurrentState.AvoidBinPacking && startsNextParameter(Current, Style))
1029 CurrentState.NoLineBreak = true;
1030 if (mustBreakBinaryOperation(Current, Style))
1031 CurrentState.NoLineBreak = true;
1032
1033 if (startsSegmentOfBuilderTypeCall(Current) &&
1034 State.Column > getNewLineColumn(State).Total) {
1035 CurrentState.ContainsUnwrappedBuilder = true;
1036 }
1037
1038 if (Current.is(TT_LambdaArrow) && Style.isJava())
1039 CurrentState.NoLineBreak = true;
1040 if (Current.isMemberAccess() && Previous.is(tok::r_paren) &&
1041 (Previous.MatchingParen &&
1042 (Previous.TotalLength - Previous.MatchingParen->TotalLength > 10))) {
1043 // If there is a function call with long parameters, break before trailing
1044 // calls. This prevents things like:
1045 // EXPECT_CALL(SomeLongParameter).Times(
1046 // 2);
1047 // We don't want to do this for short parameters as they can just be
1048 // indexes.
1049 CurrentState.NoLineBreak = true;
1050 }
1051
1052 // Don't allow the RHS of an operator to be split over multiple lines unless
1053 // there is a line-break right after the operator.
1054 // Exclude relational operators, as there, it is always more desirable to
1055 // have the LHS 'left' of the RHS.
1056 const FormatToken *P = Current.getPreviousNonComment();
1057 if (Current.isNot(tok::comment) && P &&
1058 (P->isOneOf(TT_BinaryOperator, tok::comma) ||
1059 (P->is(TT_ConditionalExpr) && P->is(tok::colon))) &&
1060 P->isNoneOf(TT_OverloadedOperator, TT_CtorInitializerComma) &&
1061 P->getPrecedence() != prec::Assignment &&
1062 P->getPrecedence() != prec::Relational &&
1063 P->getPrecedence() != prec::Spaceship) {
1064 bool BreakBeforeOperator =
1065 P->MustBreakBefore || P->is(tok::lessless) ||
1066 (P->is(TT_BinaryOperator) &&
1067 Style.BreakBeforeBinaryOperators != FormatStyle::BOS_None) ||
1068 (P->is(TT_ConditionalExpr) && Style.BreakBeforeTernaryOperators);
1069 // Don't do this if there are only two operands. In these cases, there is
1070 // always a nice vertical separation between them and the extra line break
1071 // does not help.
1072 bool HasTwoOperands = P->OperatorIndex == 0 && !P->NextOperator &&
1073 P->isNot(TT_ConditionalExpr);
1074 if ((!BreakBeforeOperator &&
1075 !(HasTwoOperands &&
1076 Style.AlignOperands != FormatStyle::OAS_DontAlign)) ||
1077 (!CurrentState.LastOperatorWrapped && BreakBeforeOperator)) {
1078 CurrentState.NoLineBreakInOperand = true;
1079 }
1080 }
1081
1082 State.Column += Spaces;
1083 if (Current.isNot(tok::comment) && Previous.is(tok::l_paren) &&
1084 Previous.Previous &&
1085 (Previous.Previous->is(tok::kw_for) || Previous.Previous->isIf())) {
1086 // Treat the condition inside an if as if it was a second function
1087 // parameter, i.e. let nested calls have a continuation indent.
1088 CurrentState.LastSpace = State.Column;
1089 CurrentState.NestedBlockIndent = State.Column;
1090 } else if (Current.isNoneOf(tok::comment, tok::caret) &&
1091 ((Previous.is(tok::comma) &&
1092 Previous.isNot(TT_OverloadedOperator)) ||
1093 (Previous.is(tok::colon) && Previous.is(TT_ObjCMethodExpr)))) {
1094 CurrentState.LastSpace = State.Column;
1095 } else if (Previous.is(TT_CtorInitializerColon) &&
1096 (!Current.isTrailingComment() || Current.NewlinesBefore > 0) &&
1097 Style.BreakConstructorInitializers ==
1098 FormatStyle::BCIS_AfterColon) {
1099 CurrentState.Indent = State.Column;
1100 CurrentState.LastSpace = State.Column;
1101 } else if (Previous.isOneOf(TT_ConditionalExpr, TT_CtorInitializerColon)) {
1102 CurrentState.LastSpace = State.Column;
1103 } else if (Previous.is(TT_BinaryOperator) &&
1104 ((Previous.getPrecedence() != prec::Assignment &&
1105 (Previous.isNot(tok::lessless) || Previous.OperatorIndex != 0 ||
1106 Previous.NextOperator)) ||
1107 Current.StartsBinaryExpression)) {
1108 // Indent relative to the RHS of the expression unless this is a simple
1109 // assignment without binary expression on the RHS.
1110 if (Style.BreakBeforeBinaryOperators == FormatStyle::BOS_None)
1111 CurrentState.LastSpace = State.Column;
1112 } else if (Previous.is(TT_InheritanceColon)) {
1113 CurrentState.Indent = State.Column;
1114 CurrentState.LastSpace = State.Column;
1115 } else if (Current.is(TT_CSharpGenericTypeConstraintColon)) {
1116 CurrentState.ColonPos = State.Column;
1117 } else if (Previous.opensScope()) {
1118 // If a function has a trailing call, indent all parameters from the
1119 // opening parenthesis. This avoids confusing indents like:
1120 // OuterFunction(InnerFunctionCall( // break
1121 // ParameterToInnerFunction)) // break
1122 // .SecondInnerFunctionCall();
1123 if (Previous.MatchingParen) {
1124 const FormatToken *Next = Previous.MatchingParen->getNextNonComment();
1125 if (Next && Next->isMemberAccess() && State.Stack.size() > 1 &&
1126 State.Stack[State.Stack.size() - 2].CallContinuation == 0) {
1127 CurrentState.LastSpace = State.Column;
1128 }
1129 }
1130 }
1131}
1132
1133unsigned ContinuationIndenter::addTokenOnNewLine(LineState &State,
1134 bool DryRun) {
1135 FormatToken &Current = *State.NextToken;
1136 assert(State.NextToken->Previous);
1137 const FormatToken &Previous = *State.NextToken->Previous;
1138 auto &CurrentState = State.Stack.back();
1139
1140 // Extra penalty that needs to be added because of the way certain line
1141 // breaks are chosen.
1142 unsigned Penalty = 0;
1143
1144 const FormatToken *PreviousNonComment = Current.getPreviousNonComment();
1145 const FormatToken *NextNonComment = Previous.getNextNonComment();
1146 if (!NextNonComment)
1147 NextNonComment = &Current;
1148 // The first line break on any NestingLevel causes an extra penalty in order
1149 // prefer similar line breaks.
1150 if (!CurrentState.ContainsLineBreak)
1151 Penalty += 15;
1152 CurrentState.ContainsLineBreak = true;
1153
1154 Penalty += State.NextToken->SplitPenalty;
1155
1156 // Breaking before the first "<<" is generally not desirable if the LHS is
1157 // short. Also always add the penalty if the LHS is split over multiple lines
1158 // to avoid unnecessary line breaks that just work around this penalty.
1159 if (NextNonComment->is(tok::lessless) && CurrentState.FirstLessLess == 0 &&
1160 (State.Column <= Style.ColumnLimit / 3 ||
1161 CurrentState.BreakBeforeParameter)) {
1162 Penalty += Style.PenaltyBreakFirstLessLess;
1163 }
1164
1165 const auto [TotalColumn, IndentedFromColumn] = getNewLineColumn(State);
1166 State.Column = TotalColumn;
1167
1168 // Add Penalty proportional to amount of whitespace away from FirstColumn
1169 // This tends to penalize several lines that are far-right indented,
1170 // and prefers a line-break prior to such a block, e.g:
1171 //
1172 // Constructor() :
1173 // member(value), looooooooooooooooong_member(
1174 // looooooooooong_call(param_1, param_2, param_3))
1175 // would then become
1176 // Constructor() :
1177 // member(value),
1178 // looooooooooooooooong_member(
1179 // looooooooooong_call(param_1, param_2, param_3))
1180 if (State.Column > State.FirstIndent) {
1181 Penalty +=
1182 Style.PenaltyIndentedWhitespace * (State.Column - State.FirstIndent);
1183 }
1184
1185 // Indent nested blocks relative to this column, unless in a very specific
1186 // JavaScript special case where:
1187 //
1188 // var loooooong_name =
1189 // function() {
1190 // // code
1191 // }
1192 //
1193 // is common and should be formatted like a free-standing function. The same
1194 // goes for wrapping before the lambda return type arrow.
1195 if (Current.isNot(TT_LambdaArrow) &&
1196 (!Style.isJavaScript() || Current.NestingLevel != 0 ||
1197 !PreviousNonComment || PreviousNonComment->isNot(tok::equal) ||
1198 Current.isNoneOf(Keywords.kw_async, Keywords.kw_function))) {
1199 CurrentState.NestedBlockIndent = State.Column;
1200 }
1201
1202 if (NextNonComment->isMemberAccess()) {
1203 if (CurrentState.CallContinuation == 0)
1204 CurrentState.CallContinuation = State.Column;
1205 } else if (NextNonComment->is(TT_SelectorName)) {
1206 if (!CurrentState.ObjCSelectorNameFound) {
1207 if (NextNonComment->LongestObjCSelectorName == 0) {
1208 CurrentState.AlignColons = false;
1209 } else {
1210 CurrentState.ColonPos =
1211 (shouldIndentWrappedSelectorName(Style, State.Line->Type)
1212 ? std::max(CurrentState.Indent.Total,
1213 State.FirstIndent + Style.ContinuationIndentWidth)
1214 : CurrentState.Indent.Total) +
1215 std::max(NextNonComment->LongestObjCSelectorName,
1216 NextNonComment->ColumnWidth);
1217 }
1218 } else if (CurrentState.AlignColons &&
1219 CurrentState.ColonPos <= NextNonComment->ColumnWidth) {
1220 CurrentState.ColonPos = State.Column + NextNonComment->ColumnWidth;
1221 }
1222 } else if (PreviousNonComment && PreviousNonComment->is(tok::colon) &&
1223 PreviousNonComment->isOneOf(TT_ObjCMethodExpr, TT_DictLiteral)) {
1224 // FIXME: This is hacky, find a better way. The problem is that in an ObjC
1225 // method expression, the block should be aligned to the line starting it,
1226 // e.g.:
1227 // [aaaaaaaaaaaaaaa aaaaaaaaa: \\ break for some reason
1228 // ^(int *i) {
1229 // // ...
1230 // }];
1231 // Thus, we set LastSpace of the next higher NestingLevel, to which we move
1232 // when we consume all of the "}"'s FakeRParens at the "{".
1233 if (State.Stack.size() > 1) {
1234 State.Stack[State.Stack.size() - 2].LastSpace =
1235 std::max(CurrentState.LastSpace, CurrentState.Indent.Total) +
1236 Style.ContinuationIndentWidth;
1237 }
1238 }
1239
1240 if ((PreviousNonComment &&
1241 PreviousNonComment->isOneOf(tok::comma, tok::semi) &&
1242 !CurrentState.AvoidBinPacking) ||
1243 Previous.is(TT_BinaryOperator)) {
1244 CurrentState.BreakBeforeParameter = false;
1245 }
1246 if (PreviousNonComment &&
1247 (PreviousNonComment->isOneOf(TT_TemplateCloser, TT_JavaAnnotation) ||
1248 PreviousNonComment->ClosesRequiresClause) &&
1249 Current.NestingLevel == 0) {
1250 CurrentState.BreakBeforeParameter = false;
1251 }
1252 if (NextNonComment->is(tok::question) ||
1253 (PreviousNonComment && PreviousNonComment->is(tok::question))) {
1254 CurrentState.BreakBeforeParameter = true;
1255 }
1256 if (Current.is(TT_BinaryOperator) && Current.CanBreakBefore)
1257 CurrentState.BreakBeforeParameter = false;
1258
1259 if (!DryRun) {
1260 unsigned MaxEmptyLinesToKeep = Style.MaxEmptyLinesToKeep + 1;
1261 if (Current.is(tok::r_brace) && Current.MatchingParen &&
1262 // Only strip trailing empty lines for l_braces that have children, i.e.
1263 // for function expressions (lambdas, arrows, etc).
1264 !Current.MatchingParen->Children.empty()) {
1265 // lambdas and arrow functions are expressions, thus their r_brace is not
1266 // on its own line, and thus not covered by UnwrappedLineFormatter's logic
1267 // about removing empty lines on closing blocks. Special case them here.
1269 }
1270 const unsigned Newlines =
1271 std::max(1u, std::min(Current.NewlinesBefore, MaxEmptyLinesToKeep));
1272 const bool ContinuePPDirective = State.Line->InPPDirective &&
1273 State.Line->Type != LT_ImportStatement &&
1274 Current.isNot(TT_LineComment);
1275 Whitespaces.replaceWhitespace(Current, Newlines, State.Column, State.Column,
1276 CurrentState.IsAligned, ContinuePPDirective,
1277 IndentedFromColumn);
1278 }
1279
1280 if (!Current.isTrailingComment())
1281 CurrentState.LastSpace = State.Column;
1282 if (Current.is(tok::lessless)) {
1283 // If we are breaking before a "<<", we always want to indent relative to
1284 // RHS. This is necessary only for "<<", as we special-case it and don't
1285 // always indent relative to the RHS.
1286 CurrentState.LastSpace += 3; // 3 -> width of "<< ".
1287 }
1288
1289 State.StartOfLineLevel = Current.NestingLevel;
1290 State.LowestLevelOnLine = Current.NestingLevel;
1291
1292 // Any break on this level means that the parent level has been broken
1293 // and we need to avoid bin packing there.
1294 bool NestedBlockSpecialCase =
1295 (!Style.isCpp() && Current.is(tok::r_brace) && State.Stack.size() > 1 &&
1296 State.Stack[State.Stack.size() - 2].NestedBlockInlined) ||
1297 (Style.Language == FormatStyle::LK_ObjC && Current.is(tok::r_brace) &&
1298 State.Stack.size() > 1 && !Style.ObjCBreakBeforeNestedBlockParam);
1299 // Do not force parameter break for statements with requires expressions.
1300 NestedBlockSpecialCase =
1301 NestedBlockSpecialCase ||
1302 (Current.MatchingParen &&
1303 Current.MatchingParen->is(TT_RequiresExpressionLBrace));
1304 if (!NestedBlockSpecialCase) {
1305 auto ParentLevelIt = std::next(State.Stack.rbegin());
1306 if (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope &&
1307 Current.MatchingParen && Current.MatchingParen->is(TT_LambdaLBrace)) {
1308 // If the first character on the new line is a lambda's closing brace, the
1309 // stack still contains that lambda's parenthesis. As such, we need to
1310 // recurse further down the stack than usual to find the parenthesis level
1311 // containing the lambda, which is where we want to set
1312 // BreakBeforeParameter.
1313 //
1314 // We specifically special case "OuterScope"-formatted lambdas here
1315 // because, when using that setting, breaking before the parameter
1316 // directly following the lambda is particularly unsightly. However, when
1317 // "OuterScope" is not set, the logic to find the parent parenthesis level
1318 // still appears to be sometimes incorrect. It has not been fixed yet
1319 // because it would lead to significant changes in existing behaviour.
1320 //
1321 // TODO: fix the non-"OuterScope" case too.
1322 auto FindCurrentLevel = [&](const auto &It) {
1323 return std::find_if(It, State.Stack.rend(), [](const auto &PState) {
1324 return PState.Tok != nullptr; // Ignore fake parens.
1325 });
1326 };
1327 auto MaybeIncrement = [&](const auto &It) {
1328 return It != State.Stack.rend() ? std::next(It) : It;
1329 };
1330 auto LambdaLevelIt = FindCurrentLevel(State.Stack.rbegin());
1331 auto LevelContainingLambdaIt =
1332 FindCurrentLevel(MaybeIncrement(LambdaLevelIt));
1333 ParentLevelIt = MaybeIncrement(LevelContainingLambdaIt);
1334 }
1335 for (auto I = ParentLevelIt, E = State.Stack.rend(); I != E; ++I)
1336 I->BreakBeforeParameter = true;
1337 }
1338
1339 if (PreviousNonComment &&
1340 PreviousNonComment->isNoneOf(tok::comma, tok::colon, tok::semi) &&
1341 ((PreviousNonComment->isNot(TT_TemplateCloser) &&
1342 !PreviousNonComment->ClosesRequiresClause) ||
1343 Current.NestingLevel != 0) &&
1344 PreviousNonComment->isNoneOf(
1345 TT_BinaryOperator, TT_FunctionAnnotationRParen, TT_JavaAnnotation,
1346 TT_LeadingJavaAnnotation) &&
1347 Current.isNot(TT_BinaryOperator) && !PreviousNonComment->opensScope() &&
1348 // We don't want to enforce line breaks for subsequent arguments just
1349 // because we have been forced to break before a lambda body.
1350 (!Style.BraceWrapping.BeforeLambdaBody ||
1351 Current.isNot(TT_LambdaLBrace))) {
1352 CurrentState.BreakBeforeParameter = true;
1353 }
1354
1355 // If we break after { or the [ of an array initializer, we should also break
1356 // before the corresponding } or ].
1357 if (PreviousNonComment &&
1358 (PreviousNonComment->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
1359 opensProtoMessageField(*PreviousNonComment, Style))) {
1360 CurrentState.BreakBeforeClosingBrace = true;
1361 }
1362
1363 if (PreviousNonComment && PreviousNonComment->is(tok::l_paren)) {
1364 if (auto Previous = PreviousNonComment->Previous) {
1365 if (Previous->isIf()) {
1366 CurrentState.BreakBeforeClosingParen = Style.BreakBeforeCloseBracketIf;
1367 } else if (Previous->isLoop(Style)) {
1368 CurrentState.BreakBeforeClosingParen =
1369 Style.BreakBeforeCloseBracketLoop;
1370 } else if (Previous->is(tok::kw_switch)) {
1371 CurrentState.BreakBeforeClosingParen =
1372 Style.BreakBeforeCloseBracketSwitch;
1373 } else {
1374 CurrentState.BreakBeforeClosingParen =
1375 Style.BreakBeforeCloseBracketFunction;
1376 }
1377 }
1378 }
1379
1380 if (PreviousNonComment && PreviousNonComment->is(TT_TemplateOpener))
1381 CurrentState.BreakBeforeClosingAngle = Style.BreakBeforeTemplateCloser;
1382
1383 if (CurrentState.AvoidBinPacking) {
1384 // If we are breaking after '(', '{', '<', or this is the break after a ':'
1385 // to start a member initializer list in a constructor, this should not
1386 // be considered bin packing unless the relevant AllowAll option is false or
1387 // this is a dict/object literal.
1388 bool PreviousIsBreakingCtorInitializerColon =
1389 PreviousNonComment && PreviousNonComment->is(TT_CtorInitializerColon) &&
1390 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon;
1391 bool AllowAllConstructorInitializersOnNextLine =
1392 Style.PackConstructorInitializers == FormatStyle::PCIS_NextLine ||
1393 Style.PackConstructorInitializers == FormatStyle::PCIS_NextLineOnly;
1394 if ((Previous.isNoneOf(tok::l_paren, tok::l_brace, TT_BinaryOperator) &&
1395 !PreviousIsBreakingCtorInitializerColon) ||
1396 (!Style.AllowAllParametersOfDeclarationOnNextLine &&
1397 State.Line->MustBeDeclaration) ||
1398 (!Style.AllowAllArgumentsOnNextLine &&
1399 !State.Line->MustBeDeclaration) ||
1400 (!AllowAllConstructorInitializersOnNextLine &&
1401 PreviousIsBreakingCtorInitializerColon) ||
1402 Previous.is(TT_DictLiteral)) {
1403 CurrentState.BreakBeforeParameter = true;
1404 }
1405
1406 // If we are breaking after a ':' to start a member initializer list,
1407 // and we allow all arguments on the next line, we should not break
1408 // before the next parameter.
1409 if (PreviousIsBreakingCtorInitializerColon &&
1410 AllowAllConstructorInitializersOnNextLine) {
1411 CurrentState.BreakBeforeParameter = false;
1412 }
1413 }
1414
1415 if (mustBreakBinaryOperation(Current, Style))
1416 CurrentState.BreakBeforeParameter = true;
1417
1418 return Penalty;
1419}
1420
1422ContinuationIndenter::getNewLineColumn(const LineState &State) {
1423 if (!State.NextToken || !State.NextToken->Previous)
1424 return 0;
1425
1426 FormatToken &Current = *State.NextToken;
1427 const auto &CurrentState = State.Stack.back();
1428
1429 if (CurrentState.IsCSharpGenericTypeConstraint &&
1430 Current.isNot(TT_CSharpGenericTypeConstraint)) {
1431 return CurrentState.ColonPos + 2;
1432 }
1433
1434 const FormatToken &Previous = *Current.Previous;
1435 // If we are continuing an expression, we want to use the continuation indent.
1436 const auto ContinuationIndent =
1437 std::max(IndentationAndAlignment(CurrentState.LastSpace),
1438 CurrentState.Indent) +
1439 Style.ContinuationIndentWidth;
1440 const FormatToken *PreviousNonComment = Current.getPreviousNonComment();
1441 const FormatToken *NextNonComment = Previous.getNextNonComment();
1442 if (!NextNonComment)
1443 NextNonComment = &Current;
1444
1445 // Java specific bits.
1446 if (Style.isJava() &&
1447 Current.isOneOf(Keywords.kw_implements, Keywords.kw_extends)) {
1448 return std::max(IndentationAndAlignment(CurrentState.LastSpace),
1449 CurrentState.Indent + Style.ContinuationIndentWidth);
1450 }
1451
1452 // Indentation of the statement following a Verilog case label is taken care
1453 // of in moveStateToNextToken.
1454 if (Style.isVerilog() && PreviousNonComment &&
1455 Keywords.isVerilogEndOfLabel(*PreviousNonComment)) {
1456 return State.FirstIndent;
1457 }
1458
1459 if (Style.BreakBeforeBraces == FormatStyle::BS_Whitesmiths &&
1460 State.Line->First->is(tok::kw_enum)) {
1461 return IndentationAndAlignment(Style.IndentWidth *
1462 State.Line->First->IndentLevel) +
1463 Style.IndentWidth;
1464 }
1465
1466 if (Style.BraceWrapping.BeforeLambdaBody &&
1467 Style.BraceWrapping.IndentBraces && Current.is(TT_LambdaLBrace)) {
1468 const auto From = Style.LambdaBodyIndentation == FormatStyle::LBI_Signature
1469 ? CurrentState.Indent
1470 : State.FirstIndent;
1471 return From + Style.IndentWidth;
1472 }
1473
1474 if ((NextNonComment->is(tok::l_brace) && NextNonComment->is(BK_Block)) ||
1475 (Style.isVerilog() && Keywords.isVerilogBegin(*NextNonComment))) {
1476 if (Current.NestingLevel == 0 ||
1477 (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope &&
1478 State.NextToken->is(TT_LambdaLBrace))) {
1479 return State.FirstIndent;
1480 }
1481 return CurrentState.Indent;
1482 }
1483 if (Current.is(TT_LambdaArrow) &&
1484 Previous.isOneOf(tok::kw_noexcept, tok::kw_mutable, tok::kw_constexpr,
1485 tok::kw_consteval, tok::kw_static,
1486 TT_AttributeRSquare)) {
1487 return ContinuationIndent;
1488 }
1489 if ((Current.isOneOf(tok::r_brace, tok::r_square) ||
1490 (Current.is(tok::greater) && (Style.isProto() || Style.isTableGen()))) &&
1491 State.Stack.size() > 1) {
1492 if (Current.closesBlockOrBlockTypeList(Style))
1493 return State.Stack[State.Stack.size() - 2].NestedBlockIndent;
1494 if (Current.MatchingParen && Current.MatchingParen->is(BK_BracedInit))
1495 return State.Stack[State.Stack.size() - 2].LastSpace;
1496 return State.FirstIndent;
1497 }
1498 // Indent a closing parenthesis at the previous level if followed by a semi,
1499 // const, or opening brace. This allows indentations such as:
1500 // foo(
1501 // a,
1502 // );
1503 // int Foo::getter(
1504 // //
1505 // ) const {
1506 // return foo;
1507 // }
1508 // function foo(
1509 // a,
1510 // ) {
1511 // code(); //
1512 // }
1513 if (Current.is(tok::r_paren) && State.Stack.size() > 1 &&
1514 (!Current.Next ||
1515 Current.Next->isOneOf(tok::semi, tok::kw_const, tok::l_brace))) {
1516 return State.Stack[State.Stack.size() - 2].LastSpace;
1517 }
1518 // When DAGArg closer exists top of line, it should be aligned in the similar
1519 // way as function call above.
1520 if (Style.isTableGen() && Current.is(TT_TableGenDAGArgCloser) &&
1521 State.Stack.size() > 1) {
1522 return State.Stack[State.Stack.size() - 2].LastSpace;
1523 }
1524 if (Style.BreakBeforeCloseBracketBracedList && Current.is(tok::r_brace) &&
1525 Current.MatchingParen && Current.MatchingParen->is(BK_BracedInit) &&
1526 State.Stack.size() > 1) {
1527 return State.Stack[State.Stack.size() - 2].LastSpace;
1528 }
1529 if ((Style.BreakBeforeCloseBracketFunction ||
1530 Style.BreakBeforeCloseBracketIf || Style.BreakBeforeCloseBracketLoop ||
1531 Style.BreakBeforeCloseBracketSwitch) &&
1532 Current.is(tok::r_paren) && State.Stack.size() > 1) {
1533 return State.Stack[State.Stack.size() - 2].LastSpace;
1534 }
1535 if (Style.BreakBeforeTemplateCloser && Current.is(TT_TemplateCloser) &&
1536 State.Stack.size() > 1) {
1537 return State.Stack[State.Stack.size() - 2].LastSpace;
1538 }
1539 if (NextNonComment->is(TT_TemplateString) && NextNonComment->closesScope())
1540 return State.Stack[State.Stack.size() - 2].LastSpace;
1541 // Field labels in a nested type should be aligned to the brace. For example
1542 // in ProtoBuf:
1543 // optional int32 b = 2 [(foo_options) = {aaaaaaaaaaaaaaaaaaa: 123,
1544 // bbbbbbbbbbbbbbbbbbbbbbbb:"baz"}];
1545 // For Verilog, a quote following a brace is treated as an identifier. And
1546 // Both braces and colons get annotated as TT_DictLiteral. So we have to
1547 // check.
1548 if (Current.is(tok::identifier) && Current.Next &&
1549 (!Style.isVerilog() || Current.Next->is(tok::colon)) &&
1550 (Current.Next->is(TT_DictLiteral) ||
1551 (Style.isProto() && Current.Next->isOneOf(tok::less, tok::l_brace)))) {
1552 return CurrentState.Indent;
1553 }
1554 if (NextNonComment->is(TT_ObjCStringLiteral) &&
1555 State.StartOfStringLiteral != 0) {
1556 return State.StartOfStringLiteral - 1;
1557 }
1558 if (NextNonComment->isStringLiteral() && State.StartOfStringLiteral != 0)
1559 return State.StartOfStringLiteral;
1560 if (NextNonComment->is(tok::lessless) && CurrentState.FirstLessLess != 0)
1561 return CurrentState.FirstLessLess;
1562 if (NextNonComment->isMemberAccess()) {
1563 if (CurrentState.CallContinuation == 0)
1564 return ContinuationIndent;
1565 return CurrentState.CallContinuation;
1566 }
1567 if (CurrentState.QuestionColumn != 0 &&
1568 ((NextNonComment->is(tok::colon) &&
1569 NextNonComment->is(TT_ConditionalExpr)) ||
1570 Previous.is(TT_ConditionalExpr))) {
1571 if (((NextNonComment->is(tok::colon) && NextNonComment->Next &&
1572 !NextNonComment->Next->FakeLParens.empty() &&
1573 NextNonComment->Next->FakeLParens.back() == prec::Conditional) ||
1574 (Previous.is(tok::colon) && !Current.FakeLParens.empty() &&
1575 Current.FakeLParens.back() == prec::Conditional)) &&
1576 !CurrentState.IsWrappedConditional) {
1577 // NOTE: we may tweak this slightly:
1578 // * not remove the 'lead' ContinuationIndentWidth
1579 // * always un-indent by the operator when
1580 // BreakBeforeTernaryOperators=true
1581 unsigned Indent = CurrentState.Indent.Total;
1582 if (Style.AlignOperands != FormatStyle::OAS_DontAlign)
1583 Indent -= Style.ContinuationIndentWidth;
1584 if (Style.BreakBeforeTernaryOperators && CurrentState.UnindentOperator)
1585 Indent -= 2;
1586 return Indent;
1587 }
1588 return CurrentState.QuestionColumn;
1589 }
1590 if (Previous.is(tok::comma) && CurrentState.VariablePos != 0)
1591 return CurrentState.VariablePos;
1592 if (Current.is(TT_RequiresClause)) {
1593 if (Style.IndentRequiresClause)
1594 return CurrentState.Indent + Style.IndentWidth;
1595 switch (Style.RequiresClausePosition) {
1596 case FormatStyle::RCPS_OwnLine:
1597 case FormatStyle::RCPS_WithFollowing:
1598 case FormatStyle::RCPS_OwnLineWithBrace:
1599 return CurrentState.Indent;
1600 default:
1601 break;
1602 }
1603 }
1604 if (NextNonComment->isOneOf(TT_CtorInitializerColon, TT_InheritanceColon,
1605 TT_InheritanceComma)) {
1606 return State.FirstIndent + Style.ConstructorInitializerIndentWidth;
1607 }
1608 if ((PreviousNonComment &&
1609 (PreviousNonComment->ClosesTemplateDeclaration ||
1610 PreviousNonComment->ClosesRequiresClause ||
1611 (PreviousNonComment->is(TT_AttributeMacro) &&
1612 Current.isNot(tok::l_paren) &&
1613 !Current.endsSequence(TT_StartOfName, TT_AttributeMacro,
1614 TT_PointerOrReference)) ||
1615 PreviousNonComment->isOneOf(TT_AttributeRParen, TT_AttributeRSquare,
1616 TT_FunctionAnnotationRParen,
1617 TT_JavaAnnotation,
1618 TT_LeadingJavaAnnotation))) ||
1619 (!Style.IndentWrappedFunctionNames &&
1620 NextNonComment->isOneOf(tok::kw_operator, TT_FunctionDeclarationName))) {
1621 return std::max(IndentationAndAlignment(CurrentState.LastSpace),
1622 CurrentState.Indent);
1623 }
1624 if (NextNonComment->is(TT_SelectorName)) {
1625 if (!CurrentState.ObjCSelectorNameFound) {
1626 auto MinIndent = CurrentState.Indent;
1627 if (shouldIndentWrappedSelectorName(Style, State.Line->Type)) {
1628 MinIndent =
1629 std::max(MinIndent, IndentationAndAlignment(State.FirstIndent) +
1630 Style.ContinuationIndentWidth);
1631 }
1632 // If LongestObjCSelectorName is 0, we are indenting the first
1633 // part of an ObjC selector (or a selector component which is
1634 // not colon-aligned due to block formatting).
1635 //
1636 // Otherwise, we are indenting a subsequent part of an ObjC
1637 // selector which should be colon-aligned to the longest
1638 // component of the ObjC selector.
1639 //
1640 // In either case, we want to respect Style.IndentWrappedFunctionNames.
1641 return MinIndent.addPadding(
1642 std::max(NextNonComment->LongestObjCSelectorName,
1643 NextNonComment->ColumnWidth) -
1644 NextNonComment->ColumnWidth);
1645 }
1646 if (!CurrentState.AlignColons)
1647 return CurrentState.Indent;
1648 if (CurrentState.ColonPos > NextNonComment->ColumnWidth)
1649 return CurrentState.ColonPos - NextNonComment->ColumnWidth;
1650 return CurrentState.Indent;
1651 }
1652 if (NextNonComment->is(tok::colon) && NextNonComment->is(TT_ObjCMethodExpr))
1653 return CurrentState.ColonPos;
1654 if (NextNonComment->is(TT_ArraySubscriptLSquare)) {
1655 if (CurrentState.StartOfArraySubscripts != 0) {
1656 return CurrentState.StartOfArraySubscripts;
1657 } else if (Style.isCSharp()) { // C# allows `["key"] = value` inside object
1658 // initializers.
1659 return CurrentState.Indent;
1660 }
1661 return ContinuationIndent;
1662 }
1663
1664 // OpenMP clauses want to get additional indentation when they are pushed onto
1665 // the next line.
1666 if (State.Line->InPragmaDirective) {
1667 FormatToken *PragmaType = State.Line->First->Next->Next;
1668 if (PragmaType && PragmaType->TokenText == "omp")
1669 return CurrentState.Indent + Style.ContinuationIndentWidth;
1670 }
1671
1672 // This ensure that we correctly format ObjC methods calls without inputs,
1673 // i.e. where the last element isn't selector like: [callee method];
1674 if (NextNonComment->is(tok::identifier) && NextNonComment->FakeRParens == 0 &&
1675 NextNonComment->Next && NextNonComment->Next->is(TT_ObjCMethodExpr)) {
1676 return CurrentState.Indent;
1677 }
1678
1679 if (NextNonComment->isOneOf(TT_StartOfName, TT_PointerOrReference) ||
1680 Previous.isOneOf(tok::coloncolon, tok::equal, TT_JsTypeColon)) {
1681 return ContinuationIndent;
1682 }
1683 if (PreviousNonComment && PreviousNonComment->is(tok::colon) &&
1684 PreviousNonComment->isOneOf(TT_ObjCMethodExpr, TT_DictLiteral)) {
1685 return ContinuationIndent;
1686 }
1687 if (NextNonComment->is(TT_CtorInitializerComma))
1688 return CurrentState.Indent;
1689 if (PreviousNonComment && PreviousNonComment->is(TT_CtorInitializerColon) &&
1690 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon) {
1691 return CurrentState.Indent;
1692 }
1693 if (PreviousNonComment && PreviousNonComment->is(TT_InheritanceColon) &&
1694 Style.BreakInheritanceList == FormatStyle::BILS_AfterColon) {
1695 return CurrentState.Indent;
1696 }
1697 if (Previous.is(tok::r_paren) &&
1698 Previous.isNot(TT_TableGenDAGArgOperatorToBreak) &&
1699 !Current.isBinaryOperator() &&
1700 Current.isNoneOf(tok::colon, tok::comment)) {
1701 return ContinuationIndent;
1702 }
1703 if (Current.is(TT_ProtoExtensionLSquare))
1704 return CurrentState.Indent;
1705 if (Current.isBinaryOperator() && CurrentState.UnindentOperator) {
1706 return CurrentState.Indent - Current.Tok.getLength() -
1707 Current.SpacesRequiredBefore;
1708 }
1709 if (Current.is(tok::comment) && NextNonComment->isBinaryOperator() &&
1710 CurrentState.UnindentOperator) {
1711 return CurrentState.Indent - NextNonComment->Tok.getLength() -
1712 NextNonComment->SpacesRequiredBefore;
1713 }
1714 if (CurrentState.Indent.Total == State.FirstIndent && PreviousNonComment &&
1715 PreviousNonComment->isNoneOf(tok::r_brace, TT_CtorInitializerComma)) {
1716 // Ensure that we fall back to the continuation indent width instead of
1717 // just flushing continuations left.
1718 return CurrentState.Indent + Style.ContinuationIndentWidth;
1719 }
1720 return CurrentState.Indent;
1721}
1722
1724 const FormatToken &Current,
1725 const FormatStyle &Style) {
1726 if (Previous->isNot(tok::l_paren))
1727 return true;
1728 if (Previous->ParameterCount > 1)
1729 return true;
1730
1731 // Also a nested block if contains a lambda inside function with 1 parameter.
1732 return Style.BraceWrapping.BeforeLambdaBody && Current.is(TT_LambdaLSquare);
1733}
1734
1735unsigned ContinuationIndenter::moveStateToNextToken(LineState &State,
1736 bool DryRun, bool Newline) {
1737 assert(State.Stack.size());
1738 const FormatToken &Current = *State.NextToken;
1739 auto &CurrentState = State.Stack.back();
1740
1741 if (Current.is(TT_CSharpGenericTypeConstraint))
1742 CurrentState.IsCSharpGenericTypeConstraint = true;
1743 if (Current.isOneOf(tok::comma, TT_BinaryOperator))
1744 CurrentState.NoLineBreakInOperand = false;
1745 if (Current.isOneOf(TT_InheritanceColon, TT_CSharpGenericTypeConstraintColon))
1746 CurrentState.AvoidBinPacking = true;
1747 if (Current.is(tok::lessless) && Current.isNot(TT_OverloadedOperator)) {
1748 if (CurrentState.FirstLessLess == 0)
1749 CurrentState.FirstLessLess = State.Column;
1750 else
1751 CurrentState.LastOperatorWrapped = Newline;
1752 }
1753 if (Current.is(TT_BinaryOperator) && Current.isNot(tok::lessless))
1754 CurrentState.LastOperatorWrapped = Newline;
1755 if (Current.is(TT_ConditionalExpr) && Current.Previous &&
1756 Current.Previous->isNot(TT_ConditionalExpr)) {
1757 CurrentState.LastOperatorWrapped = Newline;
1758 }
1759 if (Current.is(TT_ArraySubscriptLSquare) &&
1760 CurrentState.StartOfArraySubscripts == 0) {
1761 CurrentState.StartOfArraySubscripts = State.Column;
1762 }
1763
1764 auto IsWrappedConditional = [](const FormatToken &Tok) {
1765 if (!(Tok.is(TT_ConditionalExpr) && Tok.is(tok::question)))
1766 return false;
1767 if (Tok.MustBreakBefore)
1768 return true;
1769
1770 const FormatToken *Next = Tok.getNextNonComment();
1771 return Next && Next->MustBreakBefore;
1772 };
1773 if (IsWrappedConditional(Current))
1774 CurrentState.IsWrappedConditional = true;
1775 if (Style.BreakBeforeTernaryOperators && Current.is(tok::question))
1776 CurrentState.QuestionColumn = State.Column;
1777 if (!Style.BreakBeforeTernaryOperators && Current.isNot(tok::colon)) {
1778 const FormatToken *Previous = Current.Previous;
1779 while (Previous && Previous->isTrailingComment())
1780 Previous = Previous->Previous;
1781 if (Previous && Previous->is(tok::question))
1782 CurrentState.QuestionColumn = State.Column;
1783 }
1784 if (!Current.opensScope() && !Current.closesScope() &&
1785 Current.isNot(TT_PointerOrReference)) {
1786 State.LowestLevelOnLine =
1787 std::min(State.LowestLevelOnLine, Current.NestingLevel);
1788 }
1789 if (Current.isMemberAccess())
1790 CurrentState.StartOfFunctionCall = !Current.NextOperator ? 0 : State.Column;
1791 if (Current.is(TT_SelectorName))
1792 CurrentState.ObjCSelectorNameFound = true;
1793 if (Current.is(TT_CtorInitializerColon) &&
1794 Style.BreakConstructorInitializers != FormatStyle::BCIS_AfterColon) {
1795 // Indent 2 from the column, so:
1796 // SomeClass::SomeClass()
1797 // : First(...), ...
1798 // Next(...)
1799 // ^ line up here.
1800 CurrentState.Indent = State.Column + (Style.BreakConstructorInitializers ==
1801 FormatStyle::BCIS_BeforeComma
1802 ? 0
1803 : 2);
1804 CurrentState.NestedBlockIndent = CurrentState.Indent.Total;
1805 if (Style.PackConstructorInitializers > FormatStyle::PCIS_BinPack) {
1806 CurrentState.AvoidBinPacking = true;
1807 CurrentState.BreakBeforeParameter =
1808 Style.ColumnLimit > 0 &&
1809 Style.PackConstructorInitializers != FormatStyle::PCIS_NextLine &&
1810 Style.PackConstructorInitializers != FormatStyle::PCIS_NextLineOnly;
1811 } else {
1812 CurrentState.BreakBeforeParameter = false;
1813 }
1814 }
1815 if (Current.is(TT_CtorInitializerColon) &&
1816 Style.BreakConstructorInitializers == FormatStyle::BCIS_AfterColon) {
1817 CurrentState.Indent =
1818 State.FirstIndent + Style.ConstructorInitializerIndentWidth;
1819 CurrentState.NestedBlockIndent = CurrentState.Indent.Total;
1820 if (Style.PackConstructorInitializers > FormatStyle::PCIS_BinPack)
1821 CurrentState.AvoidBinPacking = true;
1822 else
1823 CurrentState.BreakBeforeParameter = false;
1824 }
1825 if (Current.is(TT_InheritanceColon)) {
1826 CurrentState.Indent =
1827 State.FirstIndent + Style.ConstructorInitializerIndentWidth;
1828 }
1829 if (Current.isOneOf(TT_BinaryOperator, TT_ConditionalExpr) && Newline)
1830 CurrentState.NestedBlockIndent = State.Column + Current.ColumnWidth + 1;
1831 if (Current.isOneOf(TT_LambdaLSquare, TT_LambdaArrow))
1832 CurrentState.LastSpace = State.Column;
1833 if (Current.is(TT_RequiresExpression) &&
1834 Style.RequiresExpressionIndentation == FormatStyle::REI_Keyword) {
1835 CurrentState.NestedBlockIndent = State.Column;
1836 }
1837
1838 // Insert scopes created by fake parenthesis.
1839 const FormatToken *Previous = Current.getPreviousNonComment();
1840
1841 // Add special behavior to support a format commonly used for JavaScript
1842 // closures:
1843 // SomeFunction(function() {
1844 // foo();
1845 // bar();
1846 // }, a, b, c);
1847 if (Current.isNot(tok::comment) && !Current.ClosesRequiresClause &&
1848 Previous && Previous->isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) &&
1849 Previous->isNot(TT_DictLiteral) && State.Stack.size() > 1 &&
1850 !CurrentState.HasMultipleNestedBlocks) {
1851 if (State.Stack[State.Stack.size() - 2].NestedBlockInlined && Newline)
1852 for (ParenState &PState : llvm::drop_end(State.Stack))
1853 PState.NoLineBreak = true;
1854 State.Stack[State.Stack.size() - 2].NestedBlockInlined = false;
1855 }
1856 if (Previous && (Previous->isOneOf(TT_BinaryOperator, TT_ConditionalExpr) ||
1857 (Previous->isOneOf(tok::l_paren, tok::comma, tok::colon) &&
1858 Previous->isNoneOf(TT_DictLiteral, TT_ObjCMethodExpr,
1859 TT_CtorInitializerColon)))) {
1860 CurrentState.NestedBlockInlined =
1861 !Newline && hasNestedBlockInlined(Previous, Current, Style);
1862 }
1863
1864 moveStatePastFakeLParens(State, Newline);
1865 moveStatePastScopeCloser(State);
1866 // Do not use CurrentState here, since the two functions before may change the
1867 // Stack.
1868 bool AllowBreak = !State.Stack.back().NoLineBreak &&
1869 !State.Stack.back().NoLineBreakInOperand;
1870 moveStatePastScopeOpener(State, Newline);
1871 moveStatePastFakeRParens(State);
1872
1873 if (Current.is(TT_ObjCStringLiteral) && State.StartOfStringLiteral == 0)
1874 State.StartOfStringLiteral = State.Column + 1;
1875 if (Current.is(TT_CSharpStringLiteral) && State.StartOfStringLiteral == 0) {
1876 State.StartOfStringLiteral = State.Column + 1;
1877 } else if (Current.is(TT_TableGenMultiLineString) &&
1878 State.StartOfStringLiteral == 0) {
1879 State.StartOfStringLiteral = State.Column + 1;
1880 } else if (Current.isStringLiteral() && State.StartOfStringLiteral == 0) {
1881 State.StartOfStringLiteral = State.Column;
1882 } else if (Current.isNoneOf(tok::comment, tok::identifier, tok::hash) &&
1883 !Current.isStringLiteral()) {
1884 State.StartOfStringLiteral = 0;
1885 }
1886
1887 State.Column += Current.ColumnWidth;
1888 State.NextToken = State.NextToken->Next;
1889 // Verilog case labels are on the same unwrapped lines as the statements that
1890 // follow. TokenAnnotator identifies them and sets MustBreakBefore.
1891 // Indentation is taken care of here. A case label can only have 1 statement
1892 // in Verilog, so we don't have to worry about lines that follow.
1893 if (Style.isVerilog() && State.NextToken &&
1894 State.NextToken->MustBreakBefore &&
1895 Keywords.isVerilogEndOfLabel(Current)) {
1896 State.FirstIndent += Style.IndentWidth;
1897 CurrentState.Indent = State.FirstIndent;
1898 }
1899
1900 unsigned Penalty =
1901 handleEndOfLine(Current, State, DryRun, AllowBreak, Newline);
1902
1903 if (Current.Role)
1904 Current.Role->formatFromToken(State, this, DryRun);
1905 // If the previous has a special role, let it consume tokens as appropriate.
1906 // It is necessary to start at the previous token for the only implemented
1907 // role (comma separated list). That way, the decision whether or not to break
1908 // after the "{" is already done and both options are tried and evaluated.
1909 // FIXME: This is ugly, find a better way.
1910 if (Previous && Previous->Role)
1911 Penalty += Previous->Role->formatAfterToken(State, this, DryRun);
1912
1913 return Penalty;
1914}
1915
1916void ContinuationIndenter::moveStatePastFakeLParens(LineState &State,
1917 bool Newline) {
1918 const FormatToken &Current = *State.NextToken;
1919 if (Current.FakeLParens.empty())
1920 return;
1921
1922 const FormatToken *Previous = Current.getPreviousNonComment();
1923
1924 // Don't add extra indentation for the first fake parenthesis after
1925 // 'return', assignments, opening <({[, or requires clauses. The indentation
1926 // for these cases is special cased.
1927 bool SkipFirstExtraIndent =
1928 Previous &&
1929 (Previous->opensScope() ||
1930 Previous->isOneOf(tok::semi, tok::kw_return, TT_RequiresClause) ||
1931 (Previous->getPrecedence() == prec::Assignment &&
1932 Style.AlignOperands != FormatStyle::OAS_DontAlign) ||
1933 Previous->is(TT_ObjCMethodExpr));
1934 for (const auto &PrecedenceLevel : llvm::reverse(Current.FakeLParens)) {
1935 const auto &CurrentState = State.Stack.back();
1936 ParenState NewParenState = CurrentState;
1937 NewParenState.Tok = nullptr;
1938 NewParenState.ContainsLineBreak = false;
1939 NewParenState.LastOperatorWrapped = true;
1940 NewParenState.IsChainedConditional = false;
1941 NewParenState.IsWrappedConditional = false;
1942 NewParenState.UnindentOperator = false;
1943 NewParenState.NoLineBreak =
1944 NewParenState.NoLineBreak || CurrentState.NoLineBreakInOperand;
1945
1946 // Don't propagate AvoidBinPacking into subexpressions of arg/param lists.
1947 if (PrecedenceLevel > prec::Comma)
1948 NewParenState.AvoidBinPacking = false;
1949
1950 // Indent from 'LastSpace' unless these are fake parentheses encapsulating
1951 // a builder type call after 'return' or, if the alignment after opening
1952 // brackets is disabled.
1953 if (!Current.isTrailingComment() &&
1954 (Style.AlignOperands != FormatStyle::OAS_DontAlign ||
1955 PrecedenceLevel < prec::Assignment) &&
1956 (!Previous || Previous->isNot(tok::kw_return) ||
1957 (!Style.isJava() && PrecedenceLevel > 0)) &&
1958 (Style.AlignAfterOpenBracket || PrecedenceLevel > prec::Comma ||
1959 Current.NestingLevel == 0) &&
1960 (!Style.isTableGen() ||
1961 (Previous && Previous->isOneOf(TT_TableGenDAGArgListComma,
1962 TT_TableGenDAGArgListCommaToBreak)))) {
1963 NewParenState.Indent =
1964 std::max({IndentationAndAlignment(State.Column), NewParenState.Indent,
1965 IndentationAndAlignment(CurrentState.LastSpace)});
1966 }
1967
1968 // Special case for generic selection expressions, its comma-separated
1969 // expressions are not aligned to the opening paren like regular calls, but
1970 // rather continuation-indented relative to the _Generic keyword.
1971 if (Previous && Previous->endsSequence(tok::l_paren, tok::kw__Generic) &&
1972 State.Stack.size() > 1) {
1973 NewParenState.Indent = State.Stack[State.Stack.size() - 2].Indent +
1974 Style.ContinuationIndentWidth;
1975 }
1976
1977 if ((shouldUnindentNextOperator(Current) ||
1978 (Previous &&
1979 (PrecedenceLevel == prec::Conditional &&
1980 Previous->is(tok::question) && Previous->is(TT_ConditionalExpr)))) &&
1981 !Newline) {
1982 // If BreakBeforeBinaryOperators is set, un-indent a bit to account for
1983 // the operator and keep the operands aligned.
1984 if (Style.AlignOperands == FormatStyle::OAS_AlignAfterOperator)
1985 NewParenState.UnindentOperator = true;
1986 // Mark indentation as alignment if the expression is aligned.
1987 if (Style.AlignOperands != FormatStyle::OAS_DontAlign)
1988 NewParenState.IsAligned = true;
1989 }
1990
1991 // Do not indent relative to the fake parentheses inserted for "." or "->".
1992 // This is a special case to make the following to statements consistent:
1993 // OuterFunction(InnerFunctionCall( // break
1994 // ParameterToInnerFunction));
1995 // OuterFunction(SomeObject.InnerFunctionCall( // break
1996 // ParameterToInnerFunction));
1997 if (PrecedenceLevel > prec::Unknown)
1998 NewParenState.LastSpace = std::max(NewParenState.LastSpace, State.Column);
1999 if (PrecedenceLevel != prec::Conditional &&
2000 Current.isNot(TT_UnaryOperator) && Style.AlignAfterOpenBracket) {
2001 NewParenState.StartOfFunctionCall = State.Column;
2002 }
2003
2004 // Indent conditional expressions, unless they are chained "else-if"
2005 // conditionals. Never indent expression where the 'operator' is ',', ';' or
2006 // an assignment (i.e. *I <= prec::Assignment) as those have different
2007 // indentation rules. Indent other expression, unless the indentation needs
2008 // to be skipped.
2009 if (PrecedenceLevel == prec::Conditional && Previous &&
2010 Previous->is(tok::colon) && Previous->is(TT_ConditionalExpr) &&
2011 &PrecedenceLevel == &Current.FakeLParens.back() &&
2012 !CurrentState.IsWrappedConditional) {
2013 NewParenState.IsChainedConditional = true;
2014 NewParenState.UnindentOperator = State.Stack.back().UnindentOperator;
2015 } else if (PrecedenceLevel == prec::Conditional ||
2016 (!SkipFirstExtraIndent && PrecedenceLevel > prec::Assignment &&
2017 !Current.isTrailingComment())) {
2018 NewParenState.Indent += Style.ContinuationIndentWidth;
2019 }
2020 if ((Previous && !Previous->opensScope()) || PrecedenceLevel != prec::Comma)
2021 NewParenState.BreakBeforeParameter = false;
2022 State.Stack.push_back(NewParenState);
2023 SkipFirstExtraIndent = false;
2024 }
2025}
2026
2027void ContinuationIndenter::moveStatePastFakeRParens(LineState &State) {
2028 for (unsigned i = 0, e = State.NextToken->FakeRParens; i != e; ++i) {
2029 unsigned VariablePos = State.Stack.back().VariablePos;
2030 if (State.Stack.size() == 1) {
2031 // Do not pop the last element.
2032 break;
2033 }
2034 State.Stack.pop_back();
2035 State.Stack.back().VariablePos = VariablePos;
2036 }
2037
2038 if (State.NextToken->ClosesRequiresClause && Style.IndentRequiresClause) {
2039 // Remove the indentation of the requires clauses (which is not in Indent,
2040 // but in LastSpace).
2041 State.Stack.back().LastSpace -= Style.IndentWidth;
2042 }
2043}
2044
2045void ContinuationIndenter::moveStatePastScopeOpener(LineState &State,
2046 bool Newline) {
2047 const FormatToken &Current = *State.NextToken;
2048 if (!Current.opensScope())
2049 return;
2050
2051 const auto &CurrentState = State.Stack.back();
2052
2053 // Don't allow '<' or '(' in C# generic type constraints to start new scopes.
2054 if (Current.isOneOf(tok::less, tok::l_paren) &&
2055 CurrentState.IsCSharpGenericTypeConstraint) {
2056 return;
2057 }
2058
2059 if (Current.MatchingParen && Current.is(BK_Block)) {
2060 moveStateToNewBlock(State, Newline);
2061 return;
2062 }
2063
2064 const bool EndsInComma = [](const FormatToken *Tok) {
2065 if (!Tok)
2066 return false;
2067 const auto *Prev = Tok->getPreviousNonComment();
2068 if (!Prev)
2069 return false;
2070 return Prev->is(tok::comma);
2071 }(Current.MatchingParen);
2072
2073 IndentationAndAlignment NewIndent = 0;
2074 unsigned LastSpace = CurrentState.LastSpace;
2075 bool AvoidBinPacking;
2076 bool BreakBeforeParameter = false;
2077 unsigned NestedBlockIndent = std::max(CurrentState.StartOfFunctionCall,
2078 CurrentState.NestedBlockIndent);
2079 if (Current.isOneOf(tok::l_brace, TT_ArrayInitializerLSquare) ||
2080 opensProtoMessageField(Current, Style)) {
2081 if (Current.opensBlockOrBlockTypeList(Style)) {
2082 NewIndent = Style.IndentWidth +
2083 std::min(State.Column, CurrentState.NestedBlockIndent);
2084 } else if (Current.is(tok::l_brace)) {
2085 const auto Width = Style.BracedInitializerIndentWidth;
2086 NewIndent = IndentationAndAlignment(CurrentState.LastSpace) +
2087 (Width < 0 ? Style.ContinuationIndentWidth : Width);
2088 } else {
2089 NewIndent = CurrentState.LastSpace + Style.ContinuationIndentWidth;
2090 }
2091 const FormatToken *NextNonComment = Current.getNextNonComment();
2092 AvoidBinPacking = EndsInComma || Current.is(TT_DictLiteral) ||
2093 Style.isProto() || !Style.BinPackArguments ||
2094 (NextNonComment && NextNonComment->isOneOf(
2095 TT_DesignatedInitializerPeriod,
2096 TT_DesignatedInitializerLSquare));
2097 BreakBeforeParameter = EndsInComma;
2098 if (Current.ParameterCount > 1)
2099 NestedBlockIndent = std::max(NestedBlockIndent, State.Column + 1);
2100 } else {
2101 NewIndent = IndentationAndAlignment(std::max(
2102 CurrentState.LastSpace, CurrentState.StartOfFunctionCall)) +
2103 Style.ContinuationIndentWidth;
2104
2105 if (Style.isTableGen() && Current.is(TT_TableGenDAGArgOpenerToBreak) &&
2106 Style.TableGenBreakInsideDAGArg == FormatStyle::DAS_BreakElements) {
2107 // For the case the next token is a TableGen DAGArg operator identifier
2108 // that is not marked to have a line break after it.
2109 // In this case the option DAS_BreakElements requires to align the
2110 // DAGArg elements to the operator.
2111 const FormatToken *Next = Current.Next;
2112 if (Next && Next->is(TT_TableGenDAGArgOperatorID))
2113 NewIndent = State.Column + Next->TokenText.size() + 2;
2114 }
2115
2116 // Ensure that different different brackets force relative alignment, e.g.:
2117 // void SomeFunction(vector< // break
2118 // int> v);
2119 // FIXME: We likely want to do this for more combinations of brackets.
2120 if (Current.is(tok::less) && Current.ParentBracket == tok::l_paren) {
2121 NewIndent = std::max(NewIndent, CurrentState.Indent);
2122 LastSpace = std::max(LastSpace, CurrentState.Indent.Total);
2123 }
2124
2125 // If ObjCBinPackProtocolList is unspecified, fall back to BinPackParameters
2126 // for backwards compatibility.
2128 (Style.ObjCBinPackProtocolList == FormatStyle::BPS_Auto &&
2129 Style.BinPackParameters == FormatStyle::BPPS_BinPack) ||
2130 Style.ObjCBinPackProtocolList == FormatStyle::BPS_Always;
2131
2132 bool BinPackDeclaration =
2133 (State.Line->Type != LT_ObjCDecl &&
2134 Style.BinPackParameters == FormatStyle::BPPS_BinPack) ||
2135 (State.Line->Type == LT_ObjCDecl && ObjCBinPackProtocolList);
2136
2137 bool GenericSelection =
2138 Current.getPreviousNonComment() &&
2139 Current.getPreviousNonComment()->is(tok::kw__Generic);
2140
2141 AvoidBinPacking =
2142 (CurrentState.IsCSharpGenericTypeConstraint) || GenericSelection ||
2143 (Style.isJavaScript() && EndsInComma) ||
2144 (State.Line->MustBeDeclaration && !BinPackDeclaration) ||
2145 (!State.Line->MustBeDeclaration && !Style.BinPackArguments) ||
2146 (Style.ExperimentalAutoDetectBinPacking &&
2147 (Current.is(PPK_OnePerLine) ||
2148 (!BinPackInconclusiveFunctions && Current.is(PPK_Inconclusive))));
2149
2150 if (Current.is(TT_ObjCMethodExpr) && Current.MatchingParen &&
2151 Style.ObjCBreakBeforeNestedBlockParam) {
2152 if (Style.ColumnLimit) {
2153 // If this '[' opens an ObjC call, determine whether all parameters fit
2154 // into one line and put one per line if they don't.
2155 if (getLengthToMatchingParen(Current, State.Stack) + State.Column >
2156 getColumnLimit(State)) {
2157 BreakBeforeParameter = true;
2158 }
2159 } else {
2160 // For ColumnLimit = 0, we have to figure out whether there is or has to
2161 // be a line break within this call.
2162 for (const FormatToken *Tok = &Current;
2163 Tok && Tok != Current.MatchingParen; Tok = Tok->Next) {
2164 if (Tok->MustBreakBefore ||
2165 (Tok->CanBreakBefore && Tok->NewlinesBefore > 0)) {
2166 BreakBeforeParameter = true;
2167 break;
2168 }
2169 }
2170 }
2171 }
2172
2173 if (Style.isJavaScript() && EndsInComma)
2174 BreakBeforeParameter = true;
2175 }
2176 // Generally inherit NoLineBreak from the current scope to nested scope.
2177 // However, don't do this for non-empty nested blocks, dict literals and
2178 // array literals as these follow different indentation rules.
2179 bool NoLineBreak =
2180 Current.Children.empty() &&
2181 Current.isNoneOf(TT_DictLiteral, TT_ArrayInitializerLSquare) &&
2182 (CurrentState.NoLineBreak || CurrentState.NoLineBreakInOperand ||
2183 (Current.is(TT_TemplateOpener) &&
2184 CurrentState.ContainsUnwrappedBuilder));
2185 State.Stack.push_back(
2186 ParenState(&Current, NewIndent, LastSpace, AvoidBinPacking, NoLineBreak));
2187 auto &NewState = State.Stack.back();
2188 NewState.NestedBlockIndent = NestedBlockIndent;
2189 NewState.BreakBeforeParameter = BreakBeforeParameter;
2190 NewState.HasMultipleNestedBlocks = (Current.BlockParameterCount > 1);
2191
2192 if (Style.BraceWrapping.BeforeLambdaBody && Current.Next &&
2193 Current.is(tok::l_paren)) {
2194 // Search for any parameter that is a lambda.
2195 FormatToken const *next = Current.Next;
2196 while (next) {
2197 if (next->is(TT_LambdaLSquare)) {
2198 NewState.HasMultipleNestedBlocks = true;
2199 break;
2200 }
2201 next = next->Next;
2202 }
2203 }
2204
2205 NewState.IsInsideObjCArrayLiteral = Current.is(TT_ArrayInitializerLSquare) &&
2206 Current.Previous &&
2207 Current.Previous->is(tok::at);
2208}
2209
2210void ContinuationIndenter::moveStatePastScopeCloser(LineState &State) {
2211 const FormatToken &Current = *State.NextToken;
2212 if (!Current.closesScope())
2213 return;
2214
2215 // If we encounter a closing ), ], } or >, we can remove a level from our
2216 // stacks.
2217 if (State.Stack.size() > 1 &&
2218 (Current.isOneOf(tok::r_paren, tok::r_square, TT_TemplateString) ||
2219 (Current.is(tok::r_brace) && State.NextToken != State.Line->First) ||
2220 State.NextToken->is(TT_TemplateCloser) ||
2221 State.NextToken->is(TT_TableGenListCloser) ||
2222 (Current.is(tok::greater) && Current.is(TT_DictLiteral)))) {
2223 State.Stack.pop_back();
2224 }
2225
2226 auto &CurrentState = State.Stack.back();
2227
2228 // Reevaluate whether ObjC message arguments fit into one line.
2229 // If a receiver spans multiple lines, e.g.:
2230 // [[object block:^{
2231 // return 42;
2232 // }] a:42 b:42];
2233 // BreakBeforeParameter is calculated based on an incorrect assumption
2234 // (it is checked whether the whole expression fits into one line without
2235 // considering a line break inside a message receiver).
2236 // We check whether arguments fit after receiver scope closer (into the same
2237 // line).
2238 if (CurrentState.BreakBeforeParameter && Current.MatchingParen &&
2239 Current.MatchingParen->Previous) {
2240 const FormatToken &CurrentScopeOpener = *Current.MatchingParen->Previous;
2241 if (CurrentScopeOpener.is(TT_ObjCMethodExpr) &&
2242 CurrentScopeOpener.MatchingParen) {
2243 int NecessarySpaceInLine =
2244 getLengthToMatchingParen(CurrentScopeOpener, State.Stack) +
2245 CurrentScopeOpener.TotalLength - Current.TotalLength - 1;
2246 if (State.Column + Current.ColumnWidth + NecessarySpaceInLine <=
2247 Style.ColumnLimit) {
2248 CurrentState.BreakBeforeParameter = false;
2249 }
2250 }
2251 }
2252
2253 if (Current.is(tok::r_square)) {
2254 // If this ends the array subscript expr, reset the corresponding value.
2255 const FormatToken *NextNonComment = Current.getNextNonComment();
2256 if (NextNonComment && NextNonComment->isNot(tok::l_square))
2257 CurrentState.StartOfArraySubscripts = 0;
2258 }
2259}
2260
2261void ContinuationIndenter::moveStateToNewBlock(LineState &State, bool NewLine) {
2262 if (Style.LambdaBodyIndentation == FormatStyle::LBI_OuterScope &&
2263 State.NextToken->is(TT_LambdaLBrace) &&
2264 !State.Line->MightBeFunctionDecl) {
2265 const auto Indent = Style.IndentWidth * Style.BraceWrapping.IndentBraces;
2266 State.Stack.back().NestedBlockIndent = State.FirstIndent + Indent;
2267 }
2268 unsigned NestedBlockIndent = State.Stack.back().NestedBlockIndent;
2269 // ObjC block sometimes follow special indentation rules.
2270 unsigned NewIndent =
2271 NestedBlockIndent + (State.NextToken->is(TT_ObjCBlockLBrace)
2272 ? Style.ObjCBlockIndentWidth
2273 : Style.IndentWidth);
2274
2275 // Even when wrapping before lambda body, the left brace can still be added to
2276 // the same line. This occurs when checking whether the whole lambda body can
2277 // go on a single line. In this case we have to make sure there are no line
2278 // breaks in the body, otherwise we could just end up with a regular lambda
2279 // body without the brace wrapped.
2280 bool NoLineBreak = Style.BraceWrapping.BeforeLambdaBody && !NewLine &&
2281 State.NextToken->is(TT_LambdaLBrace);
2282
2283 State.Stack.push_back(ParenState(State.NextToken, NewIndent,
2284 State.Stack.back().LastSpace,
2285 /*AvoidBinPacking=*/true, NoLineBreak));
2286 State.Stack.back().NestedBlockIndent = NestedBlockIndent;
2287 State.Stack.back().BreakBeforeParameter = true;
2288}
2289
2290static unsigned getLastLineEndColumn(StringRef Text, unsigned StartColumn,
2291 unsigned TabWidth,
2292 encoding::Encoding Encoding) {
2293 size_t LastNewlinePos = Text.find_last_of("\n");
2294 if (LastNewlinePos == StringRef::npos) {
2295 return StartColumn +
2296 encoding::columnWidthWithTabs(Text, StartColumn, TabWidth, Encoding);
2297 } else {
2298 return encoding::columnWidthWithTabs(Text.substr(LastNewlinePos),
2299 /*StartColumn=*/0, TabWidth, Encoding);
2300 }
2301}
2302
2303unsigned ContinuationIndenter::reformatRawStringLiteral(
2304 const FormatToken &Current, LineState &State,
2305 const FormatStyle &RawStringStyle, bool DryRun, bool Newline) {
2306 unsigned StartColumn = State.Column - Current.ColumnWidth;
2307 StringRef OldDelimiter = *getRawStringDelimiter(Current.TokenText);
2308 StringRef NewDelimiter =
2309 getCanonicalRawStringDelimiter(Style, RawStringStyle.Language);
2310 if (NewDelimiter.empty())
2311 NewDelimiter = OldDelimiter;
2312 // The text of a raw string is between the leading 'R"delimiter(' and the
2313 // trailing 'delimiter)"'.
2314 unsigned OldPrefixSize = 3 + OldDelimiter.size();
2315 unsigned OldSuffixSize = 2 + OldDelimiter.size();
2316 // We create a virtual text environment which expects a null-terminated
2317 // string, so we cannot use StringRef.
2318 std::string RawText = std::string(
2319 Current.TokenText.substr(OldPrefixSize).drop_back(OldSuffixSize));
2320 if (NewDelimiter != OldDelimiter) {
2321 // Don't update to the canonical delimiter 'deli' if ')deli"' occurs in the
2322 // raw string.
2323 std::string CanonicalDelimiterSuffix = (")" + NewDelimiter + "\"").str();
2324 if (StringRef(RawText).contains(CanonicalDelimiterSuffix))
2325 NewDelimiter = OldDelimiter;
2326 }
2327
2328 unsigned NewPrefixSize = 3 + NewDelimiter.size();
2329 unsigned NewSuffixSize = 2 + NewDelimiter.size();
2330
2331 // The first start column is the column the raw text starts after formatting.
2332 unsigned FirstStartColumn = StartColumn + NewPrefixSize;
2333
2334 // The next start column is the intended indentation a line break inside
2335 // the raw string at level 0. It is determined by the following rules:
2336 // - if the content starts on newline, it is one level more than the current
2337 // indent, and
2338 // - if the content does not start on a newline, it is the first start
2339 // column.
2340 // These rules have the advantage that the formatted content both does not
2341 // violate the rectangle rule and visually flows within the surrounding
2342 // source.
2343 bool ContentStartsOnNewline = Current.TokenText[OldPrefixSize] == '\n';
2344 // If this token is the last parameter (checked by looking if it's followed by
2345 // `)` and is not on a newline, the base the indent off the line's nested
2346 // block indent. Otherwise, base the indent off the arguments indent, so we
2347 // can achieve:
2348 //
2349 // fffffffffff(1, 2, 3, R"pb(
2350 // key1: 1 #
2351 // key2: 2)pb");
2352 //
2353 // fffffffffff(1, 2, 3,
2354 // R"pb(
2355 // key1: 1 #
2356 // key2: 2
2357 // )pb");
2358 //
2359 // fffffffffff(1, 2, 3,
2360 // R"pb(
2361 // key1: 1 #
2362 // key2: 2
2363 // )pb",
2364 // 5);
2365 unsigned CurrentIndent =
2366 (!Newline && Current.Next && Current.Next->is(tok::r_paren))
2367 ? State.Stack.back().NestedBlockIndent
2368 : State.Stack.back().Indent.Total;
2369 unsigned NextStartColumn = ContentStartsOnNewline
2370 ? CurrentIndent + Style.IndentWidth
2371 : FirstStartColumn;
2372
2373 // The last start column is the column the raw string suffix starts if it is
2374 // put on a newline.
2375 // The last start column is the intended indentation of the raw string postfix
2376 // if it is put on a newline. It is determined by the following rules:
2377 // - if the raw string prefix starts on a newline, it is the column where
2378 // that raw string prefix starts, and
2379 // - if the raw string prefix does not start on a newline, it is the current
2380 // indent.
2381 unsigned LastStartColumn =
2382 Current.NewlinesBefore ? FirstStartColumn - NewPrefixSize : CurrentIndent;
2383
2384 std::pair<tooling::Replacements, unsigned> Fixes = internal::reformat(
2385 RawStringStyle, RawText, {tooling::Range(0, RawText.size())},
2386 FirstStartColumn, NextStartColumn, LastStartColumn, "<stdin>",
2387 /*Status=*/nullptr);
2388
2389 auto NewCode = applyAllReplacements(RawText, Fixes.first);
2390 if (!NewCode)
2391 return addMultilineToken(Current, State);
2392 if (!DryRun) {
2393 if (NewDelimiter != OldDelimiter) {
2394 // In 'R"delimiter(...', the delimiter starts 2 characters after the start
2395 // of the token.
2396 SourceLocation PrefixDelimiterStart =
2397 Current.Tok.getLocation().getLocWithOffset(2);
2398 auto PrefixErr = Whitespaces.addReplacement(tooling::Replacement(
2399 SourceMgr, PrefixDelimiterStart, OldDelimiter.size(), NewDelimiter));
2400 if (PrefixErr) {
2401 llvm::errs()
2402 << "Failed to update the prefix delimiter of a raw string: "
2403 << llvm::toString(std::move(PrefixErr)) << "\n";
2404 }
2405 // In 'R"delimiter(...)delimiter"', the suffix delimiter starts at
2406 // position length - 1 - |delimiter|.
2407 SourceLocation SuffixDelimiterStart =
2408 Current.Tok.getLocation().getLocWithOffset(Current.TokenText.size() -
2409 1 - OldDelimiter.size());
2410 auto SuffixErr = Whitespaces.addReplacement(tooling::Replacement(
2411 SourceMgr, SuffixDelimiterStart, OldDelimiter.size(), NewDelimiter));
2412 if (SuffixErr) {
2413 llvm::errs()
2414 << "Failed to update the suffix delimiter of a raw string: "
2415 << llvm::toString(std::move(SuffixErr)) << "\n";
2416 }
2417 }
2418 SourceLocation OriginLoc =
2419 Current.Tok.getLocation().getLocWithOffset(OldPrefixSize);
2420 for (const tooling::Replacement &Fix : Fixes.first) {
2421 auto Err = Whitespaces.addReplacement(tooling::Replacement(
2422 SourceMgr, OriginLoc.getLocWithOffset(Fix.getOffset()),
2423 Fix.getLength(), Fix.getReplacementText()));
2424 if (Err) {
2425 llvm::errs() << "Failed to reformat raw string: "
2426 << llvm::toString(std::move(Err)) << "\n";
2427 }
2428 }
2429 }
2430 unsigned RawLastLineEndColumn = getLastLineEndColumn(
2431 *NewCode, FirstStartColumn, Style.TabWidth, Encoding);
2432 State.Column = RawLastLineEndColumn + NewSuffixSize;
2433 // Since we're updating the column to after the raw string literal here, we
2434 // have to manually add the penalty for the prefix R"delim( over the column
2435 // limit.
2436 unsigned PrefixExcessCharacters =
2437 StartColumn + NewPrefixSize > Style.ColumnLimit
2438 ? StartColumn + NewPrefixSize - Style.ColumnLimit
2439 : 0;
2440 bool IsMultiline =
2441 ContentStartsOnNewline || (NewCode->find('\n') != std::string::npos);
2442 if (IsMultiline) {
2443 // Break before further function parameters on all levels.
2444 for (ParenState &Paren : State.Stack)
2445 Paren.BreakBeforeParameter = true;
2446 }
2447 return Fixes.second + PrefixExcessCharacters * Style.PenaltyExcessCharacter;
2448}
2449
2450unsigned ContinuationIndenter::addMultilineToken(const FormatToken &Current,
2451 LineState &State) {
2452 // Break before further function parameters on all levels.
2453 for (ParenState &Paren : State.Stack)
2454 Paren.BreakBeforeParameter = true;
2455
2456 unsigned ColumnsUsed = State.Column;
2457 // We can only affect layout of the first and the last line, so the penalty
2458 // for all other lines is constant, and we ignore it.
2459 State.Column = Current.LastLineColumnWidth;
2460
2461 if (ColumnsUsed > getColumnLimit(State))
2462 return Style.PenaltyExcessCharacter * (ColumnsUsed - getColumnLimit(State));
2463 return 0;
2464}
2465
2466unsigned ContinuationIndenter::handleEndOfLine(const FormatToken &Current,
2467 LineState &State, bool DryRun,
2468 bool AllowBreak, bool Newline) {
2469 unsigned Penalty = 0;
2470 // Compute the raw string style to use in case this is a raw string literal
2471 // that can be reformatted.
2472 auto RawStringStyle = getRawStringStyle(Current, State);
2473 if (RawStringStyle && !Current.Finalized) {
2474 Penalty = reformatRawStringLiteral(Current, State, *RawStringStyle, DryRun,
2475 Newline);
2476 } else if (Current.IsMultiline && Current.isNot(TT_BlockComment)) {
2477 // Don't break multi-line tokens other than block comments and raw string
2478 // literals. Instead, just update the state.
2479 Penalty = addMultilineToken(Current, State);
2480 } else if (State.Line->Type != LT_ImportStatement) {
2481 // We generally don't break import statements.
2482 LineState OriginalState = State;
2483
2484 // Whether we force the reflowing algorithm to stay strictly within the
2485 // column limit.
2486 bool Strict = false;
2487 // Whether the first non-strict attempt at reflowing did intentionally
2488 // exceed the column limit.
2489 bool Exceeded = false;
2490 std::tie(Penalty, Exceeded) = breakProtrudingToken(
2491 Current, State, AllowBreak, /*DryRun=*/true, Strict);
2492 if (Exceeded) {
2493 // If non-strict reflowing exceeds the column limit, try whether strict
2494 // reflowing leads to an overall lower penalty.
2495 LineState StrictState = OriginalState;
2496 unsigned StrictPenalty =
2497 breakProtrudingToken(Current, StrictState, AllowBreak,
2498 /*DryRun=*/true, /*Strict=*/true)
2499 .first;
2500 Strict = StrictPenalty <= Penalty;
2501 if (Strict) {
2502 Penalty = StrictPenalty;
2503 State = StrictState;
2504 }
2505 }
2506 if (!DryRun) {
2507 // If we're not in dry-run mode, apply the changes with the decision on
2508 // strictness made above.
2509 breakProtrudingToken(Current, OriginalState, AllowBreak, /*DryRun=*/false,
2510 Strict);
2511 }
2512 }
2513 if (State.Column > getColumnLimit(State)) {
2514 unsigned ExcessCharacters = State.Column - getColumnLimit(State);
2515 Penalty += Style.PenaltyExcessCharacter * ExcessCharacters;
2516 }
2517 return Penalty;
2518}
2519
2520// Returns the enclosing function name of a token, or the empty string if not
2521// found.
2522static StringRef getEnclosingFunctionName(const FormatToken &Current) {
2523 // Look for: 'function(' or 'function<templates>(' before Current.
2524 auto Tok = Current.getPreviousNonComment();
2525 if (!Tok || Tok->isNot(tok::l_paren))
2526 return "";
2527 Tok = Tok->getPreviousNonComment();
2528 if (!Tok)
2529 return "";
2530 if (Tok->is(TT_TemplateCloser)) {
2531 Tok = Tok->MatchingParen;
2532 if (Tok)
2533 Tok = Tok->getPreviousNonComment();
2534 }
2535 if (!Tok || Tok->isNot(tok::identifier))
2536 return "";
2537 return Tok->TokenText;
2538}
2539
2540std::optional<FormatStyle>
2541ContinuationIndenter::getRawStringStyle(const FormatToken &Current,
2542 const LineState &State) {
2543 if (!Current.isStringLiteral())
2544 return std::nullopt;
2545 auto Delimiter = getRawStringDelimiter(Current.TokenText);
2546 if (!Delimiter)
2547 return std::nullopt;
2548 auto RawStringStyle = RawStringFormats.getDelimiterStyle(*Delimiter);
2549 if (!RawStringStyle && Delimiter->empty()) {
2550 RawStringStyle = RawStringFormats.getEnclosingFunctionStyle(
2551 getEnclosingFunctionName(Current));
2552 }
2553 if (!RawStringStyle)
2554 return std::nullopt;
2555 RawStringStyle->ColumnLimit = getColumnLimit(State);
2556 return RawStringStyle;
2557}
2558
2559std::unique_ptr<BreakableToken>
2560ContinuationIndenter::createBreakableToken(const FormatToken &Current,
2561 LineState &State, bool AllowBreak) {
2562 unsigned StartColumn = State.Column - Current.ColumnWidth;
2563 if (Current.isStringLiteral()) {
2564 // Strings in JSON cannot be broken. Breaking strings in JavaScript is
2565 // disabled for now.
2566 if (Style.isJson() || Style.isJavaScript() || !Style.BreakStringLiterals ||
2567 !AllowBreak) {
2568 return nullptr;
2569 }
2570
2571 // Don't break string literals inside preprocessor directives (except for
2572 // #define directives, as their contents are stored in separate lines and
2573 // are not affected by this check).
2574 // This way we avoid breaking code with line directives and unknown
2575 // preprocessor directives that contain long string literals.
2576 if (State.Line->Type == LT_PreprocessorDirective)
2577 return nullptr;
2578 // Exempts unterminated string literals from line breaking. The user will
2579 // likely want to terminate the string before any line breaking is done.
2580 if (Current.IsUnterminatedLiteral)
2581 return nullptr;
2582 // Don't break string literals inside Objective-C array literals (doing so
2583 // raises the warning -Wobjc-string-concatenation).
2584 if (State.Stack.back().IsInsideObjCArrayLiteral)
2585 return nullptr;
2586
2587 // The "DPI"/"DPI-C" in SystemVerilog direct programming interface
2588 // imports/exports cannot be split, e.g.
2589 // `import "DPI" function foo();`
2590 // FIXME: make this use same infra as C++ import checks
2591 if (Style.isVerilog() && Current.Previous &&
2592 Current.Previous->isOneOf(tok::kw_export, Keywords.kw_import)) {
2593 return nullptr;
2594 }
2595 StringRef Text = Current.TokenText;
2596
2597 // We need this to address the case where there is an unbreakable tail only
2598 // if certain other formatting decisions have been taken. The
2599 // UnbreakableTailLength of Current is an overapproximation in that case and
2600 // we need to be correct here.
2601 unsigned UnbreakableTailLength = (State.NextToken && canBreak(State))
2602 ? 0
2603 : Current.UnbreakableTailLength;
2604
2605 if (Style.isVerilog() || Style.isJava() || Style.isJavaScript() ||
2606 Style.isCSharp()) {
2608 if (Style.isJavaScript() && Text.starts_with("'") &&
2609 Text.ends_with("'")) {
2611 } else if (Style.isCSharp() && Text.starts_with("@\"") &&
2612 Text.ends_with("\"")) {
2614 } else if (Text.starts_with("\"") && Text.ends_with("\"")) {
2616 } else {
2617 return nullptr;
2618 }
2619 return std::make_unique<BreakableStringLiteralUsingOperators>(
2620 Current, QuoteStyle,
2621 /*UnindentPlus=*/shouldUnindentNextOperator(Current), StartColumn,
2622 UnbreakableTailLength, State.Line->InPPDirective, Encoding, Style);
2623 }
2624
2625 StringRef Prefix;
2626 StringRef Postfix;
2627 // FIXME: Handle whitespace between '_T', '(', '"..."', and ')'.
2628 // FIXME: Store Prefix and Suffix (or PrefixLength and SuffixLength to
2629 // reduce the overhead) for each FormatToken, which is a string, so that we
2630 // don't run multiple checks here on the hot path.
2631 if ((Text.ends_with(Postfix = "\"") &&
2632 (Text.starts_with(Prefix = "@\"") || Text.starts_with(Prefix = "\"") ||
2633 Text.starts_with(Prefix = "u\"") ||
2634 Text.starts_with(Prefix = "U\"") ||
2635 Text.starts_with(Prefix = "u8\"") ||
2636 Text.starts_with(Prefix = "L\""))) ||
2637 (Text.starts_with(Prefix = "_T(\"") &&
2638 Text.ends_with(Postfix = "\")"))) {
2639 return std::make_unique<BreakableStringLiteral>(
2640 Current, StartColumn, Prefix, Postfix, UnbreakableTailLength,
2641 State.Line->InPPDirective, Encoding, Style);
2642 }
2643 } else if (Current.is(TT_BlockComment)) {
2644 if (Style.ReflowComments == FormatStyle::RCS_Never ||
2645 // If a comment token switches formatting, like
2646 // /* clang-format on */, we don't want to break it further,
2647 // but we may still want to adjust its indentation.
2648 switchesFormatting(Current)) {
2649 return nullptr;
2650 }
2651 return std::make_unique<BreakableBlockComment>(
2652 Current, StartColumn, Current.OriginalColumn, !Current.Previous,
2653 State.Line->InPPDirective, Encoding, Style, Whitespaces.useCRLF());
2654 } else if (Current.is(TT_LineComment) &&
2655 (!Current.Previous ||
2656 Current.Previous->isNot(TT_ImplicitStringLiteral))) {
2657 bool RegularComments = [&]() {
2658 for (const FormatToken *T = &Current; T && T->is(TT_LineComment);
2659 T = T->Next) {
2660 if (!(T->TokenText.starts_with("//") || T->TokenText.starts_with("#")))
2661 return false;
2662 }
2663 return true;
2664 }();
2665 if (Style.ReflowComments == FormatStyle::RCS_Never ||
2666 CommentPragmasRegex.match(Current.TokenText.substr(2)) ||
2667 switchesFormatting(Current) || !RegularComments) {
2668 return nullptr;
2669 }
2670 return std::make_unique<BreakableLineCommentSection>(
2671 Current, StartColumn, /*InPPDirective=*/false, Encoding, Style);
2672 }
2673 return nullptr;
2674}
2675
2676std::pair<unsigned, bool>
2677ContinuationIndenter::breakProtrudingToken(const FormatToken &Current,
2678 LineState &State, bool AllowBreak,
2679 bool DryRun, bool Strict) {
2680 std::unique_ptr<const BreakableToken> Token =
2681 createBreakableToken(Current, State, AllowBreak);
2682 if (!Token)
2683 return {0, false};
2684 assert(Token->getLineCount() > 0);
2685 unsigned ColumnLimit = getColumnLimit(State);
2686 if (Current.is(TT_LineComment)) {
2687 // We don't insert backslashes when breaking line comments.
2688 ColumnLimit = Style.ColumnLimit;
2689 }
2690 if (ColumnLimit == 0) {
2691 // To make the rest of the function easier set the column limit to the
2692 // maximum, if there should be no limit.
2693 ColumnLimit = std::numeric_limits<decltype(ColumnLimit)>::max();
2694 }
2695 if (Current.UnbreakableTailLength >= ColumnLimit)
2696 return {0, false};
2697 // ColumnWidth was already accounted into State.Column before calling
2698 // breakProtrudingToken.
2699 unsigned StartColumn = State.Column - Current.ColumnWidth;
2700 unsigned NewBreakPenalty = Current.isStringLiteral()
2701 ? Style.PenaltyBreakString
2702 : Style.PenaltyBreakComment;
2703 // Stores whether we intentionally decide to let a line exceed the column
2704 // limit.
2705 bool Exceeded = false;
2706 // Stores whether we introduce a break anywhere in the token.
2707 bool BreakInserted = Token->introducesBreakBeforeToken();
2708 // Store whether we inserted a new line break at the end of the previous
2709 // logical line.
2710 bool NewBreakBefore = false;
2711 // We use a conservative reflowing strategy. Reflow starts after a line is
2712 // broken or the corresponding whitespace compressed. Reflow ends as soon as a
2713 // line that doesn't get reflown with the previous line is reached.
2714 bool Reflow = false;
2715 // Keep track of where we are in the token:
2716 // Where we are in the content of the current logical line.
2717 unsigned TailOffset = 0;
2718 // The column number we're currently at.
2719 unsigned ContentStartColumn =
2720 Token->getContentStartColumn(0, /*Break=*/false);
2721 // The number of columns left in the current logical line after TailOffset.
2722 unsigned RemainingTokenColumns =
2723 Token->getRemainingLength(0, TailOffset, ContentStartColumn);
2724 // Adapt the start of the token, for example indent.
2725 if (!DryRun)
2726 Token->adaptStartOfLine(0, Whitespaces);
2727
2728 unsigned ContentIndent = 0;
2729 unsigned Penalty = 0;
2730 LLVM_DEBUG(llvm::dbgs() << "Breaking protruding token at column "
2731 << StartColumn << ".\n");
2732 for (unsigned LineIndex = 0, EndIndex = Token->getLineCount();
2733 LineIndex != EndIndex; ++LineIndex) {
2734 LLVM_DEBUG(llvm::dbgs()
2735 << " Line: " << LineIndex << " (Reflow: " << Reflow << ")\n");
2736 NewBreakBefore = false;
2737 // If we did reflow the previous line, we'll try reflowing again. Otherwise
2738 // we'll start reflowing if the current line is broken or whitespace is
2739 // compressed.
2740 bool TryReflow = Reflow;
2741 // Break the current token until we can fit the rest of the line.
2742 while (ContentStartColumn + RemainingTokenColumns > ColumnLimit) {
2743 LLVM_DEBUG(llvm::dbgs() << " Over limit, need: "
2744 << (ContentStartColumn + RemainingTokenColumns)
2745 << ", space: " << ColumnLimit
2746 << ", reflown prefix: " << ContentStartColumn
2747 << ", offset in line: " << TailOffset << "\n");
2748 // If the current token doesn't fit, find the latest possible split in the
2749 // current line so that breaking at it will be under the column limit.
2750 // FIXME: Use the earliest possible split while reflowing to correctly
2751 // compress whitespace within a line.
2753 Token->getSplit(LineIndex, TailOffset, ColumnLimit,
2754 ContentStartColumn, CommentPragmasRegex);
2755 if (Split.first == StringRef::npos) {
2756 // No break opportunity - update the penalty and continue with the next
2757 // logical line.
2758 if (LineIndex < EndIndex - 1) {
2759 // The last line's penalty is handled in addNextStateToQueue() or when
2760 // calling replaceWhitespaceAfterLastLine below.
2761 Penalty += Style.PenaltyExcessCharacter *
2762 (ContentStartColumn + RemainingTokenColumns - ColumnLimit);
2763 }
2764 LLVM_DEBUG(llvm::dbgs() << " No break opportunity.\n");
2765 break;
2766 }
2767 assert(Split.first != 0);
2768
2769 if (Token->supportsReflow()) {
2770 // Check whether the next natural split point after the current one can
2771 // still fit the line, either because we can compress away whitespace,
2772 // or because the penalty the excess characters introduce is lower than
2773 // the break penalty.
2774 // We only do this for tokens that support reflowing, and thus allow us
2775 // to change the whitespace arbitrarily (e.g. comments).
2776 // Other tokens, like string literals, can be broken on arbitrary
2777 // positions.
2778
2779 // First, compute the columns from TailOffset to the next possible split
2780 // position.
2781 // For example:
2782 // ColumnLimit: |
2783 // // Some text that breaks
2784 // ^ tail offset
2785 // ^-- split
2786 // ^-------- to split columns
2787 // ^--- next split
2788 // ^--------------- to next split columns
2789 unsigned ToSplitColumns = Token->getRangeLength(
2790 LineIndex, TailOffset, Split.first, ContentStartColumn);
2791 LLVM_DEBUG(llvm::dbgs() << " ToSplit: " << ToSplitColumns << "\n");
2792
2793 BreakableToken::Split NextSplit = Token->getSplit(
2794 LineIndex, TailOffset + Split.first + Split.second, ColumnLimit,
2795 ContentStartColumn + ToSplitColumns + 1, CommentPragmasRegex);
2796 // Compute the columns necessary to fit the next non-breakable sequence
2797 // into the current line.
2798 unsigned ToNextSplitColumns = 0;
2799 if (NextSplit.first == StringRef::npos) {
2800 ToNextSplitColumns = Token->getRemainingLength(LineIndex, TailOffset,
2801 ContentStartColumn);
2802 } else {
2803 ToNextSplitColumns = Token->getRangeLength(
2804 LineIndex, TailOffset,
2805 Split.first + Split.second + NextSplit.first, ContentStartColumn);
2806 }
2807 // Compress the whitespace between the break and the start of the next
2808 // unbreakable sequence.
2809 ToNextSplitColumns =
2810 Token->getLengthAfterCompression(ToNextSplitColumns, Split);
2811 LLVM_DEBUG(llvm::dbgs()
2812 << " ContentStartColumn: " << ContentStartColumn << "\n");
2813 LLVM_DEBUG(llvm::dbgs()
2814 << " ToNextSplit: " << ToNextSplitColumns << "\n");
2815 // If the whitespace compression makes us fit, continue on the current
2816 // line.
2817 bool ContinueOnLine =
2818 ContentStartColumn + ToNextSplitColumns <= ColumnLimit;
2819 unsigned ExcessCharactersPenalty = 0;
2820 if (!ContinueOnLine && !Strict) {
2821 // Similarly, if the excess characters' penalty is lower than the
2822 // penalty of introducing a new break, continue on the current line.
2823 ExcessCharactersPenalty =
2824 (ContentStartColumn + ToNextSplitColumns - ColumnLimit) *
2825 Style.PenaltyExcessCharacter;
2826 LLVM_DEBUG(llvm::dbgs()
2827 << " Penalty excess: " << ExcessCharactersPenalty
2828 << "\n break : " << NewBreakPenalty << "\n");
2829 if (ExcessCharactersPenalty < NewBreakPenalty) {
2830 Exceeded = true;
2831 ContinueOnLine = true;
2832 }
2833 }
2834 if (ContinueOnLine) {
2835 LLVM_DEBUG(llvm::dbgs() << " Continuing on line...\n");
2836 // The current line fits after compressing the whitespace - reflow
2837 // the next line into it if possible.
2838 TryReflow = true;
2839 if (!DryRun) {
2840 Token->compressWhitespace(LineIndex, TailOffset, Split,
2841 Whitespaces);
2842 }
2843 // When we continue on the same line, leave one space between content.
2844 ContentStartColumn += ToSplitColumns + 1;
2845 Penalty += ExcessCharactersPenalty;
2846 TailOffset += Split.first + Split.second;
2847 RemainingTokenColumns = Token->getRemainingLength(
2848 LineIndex, TailOffset, ContentStartColumn);
2849 continue;
2850 }
2851 }
2852 LLVM_DEBUG(llvm::dbgs() << " Breaking...\n");
2853 // Update the ContentIndent only if the current line was not reflown with
2854 // the previous line, since in that case the previous line should still
2855 // determine the ContentIndent. Also never intent the last line.
2856 if (!Reflow)
2857 ContentIndent = Token->getContentIndent(LineIndex);
2858 LLVM_DEBUG(llvm::dbgs()
2859 << " ContentIndent: " << ContentIndent << "\n");
2860 ContentStartColumn = ContentIndent + Token->getContentStartColumn(
2861 LineIndex, /*Break=*/true);
2862
2863 unsigned NewRemainingTokenColumns = Token->getRemainingLength(
2864 LineIndex, TailOffset + Split.first + Split.second,
2865 ContentStartColumn);
2866 if (NewRemainingTokenColumns == 0) {
2867 // No content to indent.
2868 ContentIndent = 0;
2869 ContentStartColumn =
2870 Token->getContentStartColumn(LineIndex, /*Break=*/true);
2871 NewRemainingTokenColumns = Token->getRemainingLength(
2872 LineIndex, TailOffset + Split.first + Split.second,
2873 ContentStartColumn);
2874 }
2875
2876 // When breaking before a tab character, it may be moved by a few columns,
2877 // but will still be expanded to the next tab stop, so we don't save any
2878 // columns.
2879 if (NewRemainingTokenColumns >= RemainingTokenColumns) {
2880 // FIXME: Do we need to adjust the penalty?
2881 break;
2882 }
2883
2884 LLVM_DEBUG(llvm::dbgs() << " Breaking at: " << TailOffset + Split.first
2885 << ", " << Split.second << "\n");
2886 if (!DryRun) {
2887 Token->insertBreak(LineIndex, TailOffset, Split, ContentIndent,
2888 Whitespaces);
2889 }
2890
2891 Penalty += NewBreakPenalty;
2892 TailOffset += Split.first + Split.second;
2893 RemainingTokenColumns = NewRemainingTokenColumns;
2894 BreakInserted = true;
2895 NewBreakBefore = true;
2896 }
2897 // In case there's another line, prepare the state for the start of the next
2898 // line.
2899 if (LineIndex + 1 != EndIndex) {
2900 unsigned NextLineIndex = LineIndex + 1;
2901 if (NewBreakBefore) {
2902 // After breaking a line, try to reflow the next line into the current
2903 // one once RemainingTokenColumns fits.
2904 TryReflow = true;
2905 }
2906 if (TryReflow) {
2907 // We decided that we want to try reflowing the next line into the
2908 // current one.
2909 // We will now adjust the state as if the reflow is successful (in
2910 // preparation for the next line), and see whether that works. If we
2911 // decide that we cannot reflow, we will later reset the state to the
2912 // start of the next line.
2913 Reflow = false;
2914 // As we did not continue breaking the line, RemainingTokenColumns is
2915 // known to fit after ContentStartColumn. Adapt ContentStartColumn to
2916 // the position at which we want to format the next line if we do
2917 // actually reflow.
2918 // When we reflow, we need to add a space between the end of the current
2919 // line and the next line's start column.
2920 ContentStartColumn += RemainingTokenColumns + 1;
2921 // Get the split that we need to reflow next logical line into the end
2922 // of the current one; the split will include any leading whitespace of
2923 // the next logical line.
2924 BreakableToken::Split SplitBeforeNext =
2925 Token->getReflowSplit(NextLineIndex, CommentPragmasRegex);
2926 LLVM_DEBUG(llvm::dbgs()
2927 << " Size of reflown text: " << ContentStartColumn
2928 << "\n Potential reflow split: ");
2929 if (SplitBeforeNext.first != StringRef::npos) {
2930 LLVM_DEBUG(llvm::dbgs() << SplitBeforeNext.first << ", "
2931 << SplitBeforeNext.second << "\n");
2932 TailOffset = SplitBeforeNext.first + SplitBeforeNext.second;
2933 // If the rest of the next line fits into the current line below the
2934 // column limit, we can safely reflow.
2935 RemainingTokenColumns = Token->getRemainingLength(
2936 NextLineIndex, TailOffset, ContentStartColumn);
2937 Reflow = true;
2938 if (ContentStartColumn + RemainingTokenColumns > ColumnLimit) {
2939 LLVM_DEBUG(llvm::dbgs()
2940 << " Over limit after reflow, need: "
2941 << (ContentStartColumn + RemainingTokenColumns)
2942 << ", space: " << ColumnLimit
2943 << ", reflown prefix: " << ContentStartColumn
2944 << ", offset in line: " << TailOffset << "\n");
2945 // If the whole next line does not fit, try to find a point in
2946 // the next line at which we can break so that attaching the part
2947 // of the next line to that break point onto the current line is
2948 // below the column limit.
2950 Token->getSplit(NextLineIndex, TailOffset, ColumnLimit,
2951 ContentStartColumn, CommentPragmasRegex);
2952 if (Split.first == StringRef::npos) {
2953 LLVM_DEBUG(llvm::dbgs() << " Did not find later break\n");
2954 Reflow = false;
2955 } else {
2956 // Check whether the first split point gets us below the column
2957 // limit. Note that we will execute this split below as part of
2958 // the normal token breaking and reflow logic within the line.
2959 unsigned ToSplitColumns = Token->getRangeLength(
2960 NextLineIndex, TailOffset, Split.first, ContentStartColumn);
2961 if (ContentStartColumn + ToSplitColumns > ColumnLimit) {
2962 LLVM_DEBUG(llvm::dbgs() << " Next split protrudes, need: "
2963 << (ContentStartColumn + ToSplitColumns)
2964 << ", space: " << ColumnLimit);
2965 unsigned ExcessCharactersPenalty =
2966 (ContentStartColumn + ToSplitColumns - ColumnLimit) *
2967 Style.PenaltyExcessCharacter;
2968 if (NewBreakPenalty < ExcessCharactersPenalty)
2969 Reflow = false;
2970 }
2971 }
2972 }
2973 } else {
2974 LLVM_DEBUG(llvm::dbgs() << "not found.\n");
2975 }
2976 }
2977 if (!Reflow) {
2978 // If we didn't reflow into the next line, the only space to consider is
2979 // the next logical line. Reset our state to match the start of the next
2980 // line.
2981 TailOffset = 0;
2982 ContentStartColumn =
2983 Token->getContentStartColumn(NextLineIndex, /*Break=*/false);
2984 RemainingTokenColumns = Token->getRemainingLength(
2985 NextLineIndex, TailOffset, ContentStartColumn);
2986 // Adapt the start of the token, for example indent.
2987 if (!DryRun)
2988 Token->adaptStartOfLine(NextLineIndex, Whitespaces);
2989 } else {
2990 // If we found a reflow split and have added a new break before the next
2991 // line, we are going to remove the line break at the start of the next
2992 // logical line. For example, here we'll add a new line break after
2993 // 'text', and subsequently delete the line break between 'that' and
2994 // 'reflows'.
2995 // // some text that
2996 // // reflows
2997 // ->
2998 // // some text
2999 // // that reflows
3000 // When adding the line break, we also added the penalty for it, so we
3001 // need to subtract that penalty again when we remove the line break due
3002 // to reflowing.
3003 if (NewBreakBefore) {
3004 assert(Penalty >= NewBreakPenalty);
3005 Penalty -= NewBreakPenalty;
3006 }
3007 if (!DryRun)
3008 Token->reflow(NextLineIndex, Whitespaces);
3009 }
3010 }
3011 }
3012
3013 BreakableToken::Split SplitAfterLastLine =
3014 Token->getSplitAfterLastLine(TailOffset);
3015 if (SplitAfterLastLine.first != StringRef::npos) {
3016 LLVM_DEBUG(llvm::dbgs() << "Replacing whitespace after last line.\n");
3017
3018 // We add the last line's penalty here, since that line is going to be split
3019 // now.
3020 Penalty += Style.PenaltyExcessCharacter *
3021 (ContentStartColumn + RemainingTokenColumns - ColumnLimit);
3022
3023 if (!DryRun) {
3024 Token->replaceWhitespaceAfterLastLine(TailOffset, SplitAfterLastLine,
3025 Whitespaces);
3026 }
3027 ContentStartColumn =
3028 Token->getContentStartColumn(Token->getLineCount() - 1, /*Break=*/true);
3029 RemainingTokenColumns = Token->getRemainingLength(
3030 Token->getLineCount() - 1,
3031 TailOffset + SplitAfterLastLine.first + SplitAfterLastLine.second,
3032 ContentStartColumn);
3033 }
3034
3035 State.Column = ContentStartColumn + RemainingTokenColumns -
3036 Current.UnbreakableTailLength;
3037
3038 if (BreakInserted) {
3039 if (!DryRun)
3040 Token->updateAfterBroken(Whitespaces);
3041
3042 // If we break the token inside a parameter list, we need to break before
3043 // the next parameter on all levels, so that the next parameter is clearly
3044 // visible. Line comments already introduce a break.
3045 if (Current.isNot(TT_LineComment))
3046 for (ParenState &Paren : State.Stack)
3047 Paren.BreakBeforeParameter = true;
3048
3049 if (Current.is(TT_BlockComment))
3050 State.NoContinuation = true;
3051
3052 State.Stack.back().LastSpace = StartColumn;
3053 }
3054
3055 Token->updateNextToken(State);
3056
3057 return {Penalty, Exceeded};
3058}
3059
3061 // In preprocessor directives reserve two chars for trailing " \".
3062 return Style.ColumnLimit - (State.Line->InPPDirective ? 2 : 0);
3063}
3064
3065bool ContinuationIndenter::nextIsMultilineString(const LineState &State) {
3066 const FormatToken &Current = *State.NextToken;
3067 if (!Current.isStringLiteral() || Current.is(TT_ImplicitStringLiteral))
3068 return false;
3069 // We never consider raw string literals "multiline" for the purpose of
3070 // AlwaysBreakBeforeMultilineStrings implementation as they are special-cased
3071 // (see TokenAnnotator::mustBreakBefore().
3072 if (Current.TokenText.starts_with("R\""))
3073 return false;
3074 if (Current.IsMultiline)
3075 return true;
3076 if (Current.getNextNonComment() &&
3077 Current.getNextNonComment()->isStringLiteral()) {
3078 return true; // Implicit concatenation.
3079 }
3080 if (Style.ColumnLimit != 0 && Style.BreakStringLiterals &&
3081 State.Column + Current.ColumnWidth + Current.UnbreakableTailLength >
3082 Style.ColumnLimit) {
3083 return true; // String will be split.
3084 }
3085 return false;
3086}
3087
3088} // namespace format
3089} // 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:4050
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:2275
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:1705
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:5597
std::vector< RawStringFormat > RawStringFormats
Defines hints for detecting supported languages code blocks in raw strings.
Definition Format.h:4337
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:3957
unsigned MaxEmptyLinesToKeep
The maximum number of consecutive empty lines to keep.
Definition Format.h:3806
Encapsulates keywords that are context sensitive or for languages not properly supported by Clang's l...
See documentation of RawStringFormats.
Definition Format.h:4280
std::vector< std::string > Delimiters
A list of raw string delimiters that match this language.
Definition Format.h:4284
std::vector< std::string > EnclosingFunctions
A list of enclosing function names that match this language.
Definition Format.h:4286
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:4292
LanguageKind Language
The language of this raw string.
Definition Format.h:4282
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