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