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