xref: /freebsd-src/contrib/llvm-project/clang/lib/Format/UnwrappedLineFormatter.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
1 //===--- UnwrappedLineFormatter.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 #include "UnwrappedLineFormatter.h"
10 #include "FormatToken.h"
11 #include "NamespaceEndCommentsFixer.h"
12 #include "WhitespaceManager.h"
13 #include "llvm/Support/Debug.h"
14 #include <queue>
15 
16 #define DEBUG_TYPE "format-formatter"
17 
18 namespace clang {
19 namespace format {
20 
21 namespace {
22 
23 bool startsExternCBlock(const AnnotatedLine &Line) {
24   const FormatToken *Next = Line.First->getNextNonComment();
25   const FormatToken *NextNext = Next ? Next->getNextNonComment() : nullptr;
26   return Line.startsWith(tok::kw_extern) && Next && Next->isStringLiteral() &&
27          NextNext && NextNext->is(tok::l_brace);
28 }
29 
30 bool isRecordLBrace(const FormatToken &Tok) {
31   return Tok.isOneOf(TT_ClassLBrace, TT_EnumLBrace, TT_RecordLBrace,
32                      TT_StructLBrace, TT_UnionLBrace);
33 }
34 
35 /// Tracks the indent level of \c AnnotatedLines across levels.
36 ///
37 /// \c nextLine must be called for each \c AnnotatedLine, after which \c
38 /// getIndent() will return the indent for the last line \c nextLine was called
39 /// with.
40 /// If the line is not formatted (and thus the indent does not change), calling
41 /// \c adjustToUnmodifiedLine after the call to \c nextLine will cause
42 /// subsequent lines on the same level to be indented at the same level as the
43 /// given line.
44 class LevelIndentTracker {
45 public:
46   LevelIndentTracker(const FormatStyle &Style,
47                      const AdditionalKeywords &Keywords, unsigned StartLevel,
48                      int AdditionalIndent)
49       : Style(Style), Keywords(Keywords), AdditionalIndent(AdditionalIndent) {
50     for (unsigned i = 0; i != StartLevel; ++i)
51       IndentForLevel.push_back(Style.IndentWidth * i + AdditionalIndent);
52   }
53 
54   /// Returns the indent for the current line.
55   unsigned getIndent() const { return Indent; }
56 
57   /// Update the indent state given that \p Line is going to be formatted
58   /// next.
59   void nextLine(const AnnotatedLine &Line) {
60     Offset = getIndentOffset(*Line.First);
61     // Update the indent level cache size so that we can rely on it
62     // having the right size in adjustToUnmodifiedline.
63     if (Line.Level >= IndentForLevel.size())
64       IndentForLevel.resize(Line.Level + 1, -1);
65     if (Style.IndentPPDirectives != FormatStyle::PPDIS_None &&
66         (Line.InPPDirective ||
67          (Style.IndentPPDirectives == FormatStyle::PPDIS_BeforeHash &&
68           Line.Type == LT_CommentAbovePPDirective))) {
69       unsigned PPIndentWidth =
70           (Style.PPIndentWidth >= 0) ? Style.PPIndentWidth : Style.IndentWidth;
71       Indent = Line.InMacroBody
72                    ? Line.PPLevel * PPIndentWidth +
73                          (Line.Level - Line.PPLevel) * Style.IndentWidth
74                    : Line.Level * PPIndentWidth;
75       Indent += AdditionalIndent;
76     } else {
77       // When going to lower levels, forget previous higher levels so that we
78       // recompute future higher levels. But don't forget them if we enter a PP
79       // directive, since these do not terminate a C++ code block.
80       if (!Line.InPPDirective) {
81         assert(Line.Level <= IndentForLevel.size());
82         IndentForLevel.resize(Line.Level + 1);
83       }
84       Indent = getIndent(Line.Level);
85     }
86     if (static_cast<int>(Indent) + Offset >= 0)
87       Indent += Offset;
88     if (Line.IsContinuation)
89       Indent = Line.Level * Style.IndentWidth + Style.ContinuationIndentWidth;
90   }
91 
92   /// Update the level indent to adapt to the given \p Line.
93   ///
94   /// When a line is not formatted, we move the subsequent lines on the same
95   /// level to the same indent.
96   /// Note that \c nextLine must have been called before this method.
97   void adjustToUnmodifiedLine(const AnnotatedLine &Line) {
98     if (Line.InPPDirective)
99       return;
100     assert(Line.Level < IndentForLevel.size());
101     if (Line.First->is(tok::comment) && IndentForLevel[Line.Level] != -1)
102       return;
103     unsigned LevelIndent = Line.First->OriginalColumn;
104     if (static_cast<int>(LevelIndent) - Offset >= 0)
105       LevelIndent -= Offset;
106     IndentForLevel[Line.Level] = LevelIndent;
107   }
108 
109 private:
110   /// Get the offset of the line relatively to the level.
111   ///
112   /// For example, 'public:' labels in classes are offset by 1 or 2
113   /// characters to the left from their level.
114   int getIndentOffset(const FormatToken &RootToken) {
115     if (Style.Language == FormatStyle::LK_Java || Style.isJavaScript() ||
116         Style.isCSharp()) {
117       return 0;
118     }
119 
120     auto IsAccessModifier = [this, &RootToken]() {
121       if (RootToken.isAccessSpecifier(Style.isCpp())) {
122         return true;
123       } else if (RootToken.isObjCAccessSpecifier()) {
124         return true;
125       }
126       // Handle Qt signals.
127       else if (RootToken.isOneOf(Keywords.kw_signals, Keywords.kw_qsignals) &&
128                RootToken.Next && RootToken.Next->is(tok::colon)) {
129         return true;
130       } else if (RootToken.Next &&
131                  RootToken.Next->isOneOf(Keywords.kw_slots,
132                                          Keywords.kw_qslots) &&
133                  RootToken.Next->Next && RootToken.Next->Next->is(tok::colon)) {
134         return true;
135       }
136       // Handle malformed access specifier e.g. 'private' without trailing ':'.
137       else if (!RootToken.Next && RootToken.isAccessSpecifier(false)) {
138         return true;
139       }
140       return false;
141     };
142 
143     if (IsAccessModifier()) {
144       // The AccessModifierOffset may be overridden by IndentAccessModifiers,
145       // in which case we take a negative value of the IndentWidth to simulate
146       // the upper indent level.
147       return Style.IndentAccessModifiers ? -Style.IndentWidth
148                                          : Style.AccessModifierOffset;
149     }
150     return 0;
151   }
152 
153   /// Get the indent of \p Level from \p IndentForLevel.
154   ///
155   /// \p IndentForLevel must contain the indent for the level \c l
156   /// at \p IndentForLevel[l], or a value < 0 if the indent for
157   /// that level is unknown.
158   unsigned getIndent(unsigned Level) const {
159     assert(Level < IndentForLevel.size());
160     if (IndentForLevel[Level] != -1)
161       return IndentForLevel[Level];
162     if (Level == 0)
163       return 0;
164     return getIndent(Level - 1) + Style.IndentWidth;
165   }
166 
167   const FormatStyle &Style;
168   const AdditionalKeywords &Keywords;
169   const unsigned AdditionalIndent;
170 
171   /// The indent in characters for each level. It remembers the indent of
172   /// previous lines (that are not PP directives) of equal or lower levels. This
173   /// is used to align formatted lines to the indent of previous non-formatted
174   /// lines. Think about the --lines parameter of clang-format.
175   SmallVector<int> IndentForLevel;
176 
177   /// Offset of the current line relative to the indent level.
178   ///
179   /// For example, the 'public' keywords is often indented with a negative
180   /// offset.
181   int Offset = 0;
182 
183   /// The current line's indent.
184   unsigned Indent = 0;
185 };
186 
187 const FormatToken *getMatchingNamespaceToken(
188     const AnnotatedLine *Line,
189     const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
190   if (!Line->startsWith(tok::r_brace))
191     return nullptr;
192   size_t StartLineIndex = Line->MatchingOpeningBlockLineIndex;
193   if (StartLineIndex == UnwrappedLine::kInvalidIndex)
194     return nullptr;
195   assert(StartLineIndex < AnnotatedLines.size());
196   return AnnotatedLines[StartLineIndex]->First->getNamespaceToken();
197 }
198 
199 StringRef getNamespaceTokenText(const AnnotatedLine *Line) {
200   const FormatToken *NamespaceToken = Line->First->getNamespaceToken();
201   return NamespaceToken ? NamespaceToken->TokenText : StringRef();
202 }
203 
204 StringRef getMatchingNamespaceTokenText(
205     const AnnotatedLine *Line,
206     const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines) {
207   const FormatToken *NamespaceToken =
208       getMatchingNamespaceToken(Line, AnnotatedLines);
209   return NamespaceToken ? NamespaceToken->TokenText : StringRef();
210 }
211 
212 class LineJoiner {
213 public:
214   LineJoiner(const FormatStyle &Style, const AdditionalKeywords &Keywords,
215              const SmallVectorImpl<AnnotatedLine *> &Lines)
216       : Style(Style), Keywords(Keywords), End(Lines.end()), Next(Lines.begin()),
217         AnnotatedLines(Lines) {}
218 
219   /// Returns the next line, merging multiple lines into one if possible.
220   const AnnotatedLine *getNextMergedLine(bool DryRun,
221                                          LevelIndentTracker &IndentTracker) {
222     if (Next == End)
223       return nullptr;
224     const AnnotatedLine *Current = *Next;
225     IndentTracker.nextLine(*Current);
226     unsigned MergedLines = tryFitMultipleLinesInOne(IndentTracker, Next, End);
227     if (MergedLines > 0 && Style.ColumnLimit == 0) {
228       // Disallow line merging if there is a break at the start of one of the
229       // input lines.
230       for (unsigned i = 0; i < MergedLines; ++i)
231         if (Next[i + 1]->First->NewlinesBefore > 0)
232           MergedLines = 0;
233     }
234     if (!DryRun)
235       for (unsigned i = 0; i < MergedLines; ++i)
236         join(*Next[0], *Next[i + 1]);
237     Next = Next + MergedLines + 1;
238     return Current;
239   }
240 
241 private:
242   /// Calculates how many lines can be merged into 1 starting at \p I.
243   unsigned
244   tryFitMultipleLinesInOne(LevelIndentTracker &IndentTracker,
245                            SmallVectorImpl<AnnotatedLine *>::const_iterator I,
246                            SmallVectorImpl<AnnotatedLine *>::const_iterator E) {
247     const unsigned Indent = IndentTracker.getIndent();
248 
249     // Can't join the last line with anything.
250     if (I + 1 == E)
251       return 0;
252     // We can never merge stuff if there are trailing line comments.
253     const AnnotatedLine *TheLine = *I;
254     if (TheLine->Last->is(TT_LineComment))
255       return 0;
256     const auto &NextLine = *I[1];
257     if (NextLine.Type == LT_Invalid || NextLine.First->MustBreakBefore)
258       return 0;
259     if (TheLine->InPPDirective &&
260         (!NextLine.InPPDirective || NextLine.First->HasUnescapedNewline)) {
261       return 0;
262     }
263 
264     if (Style.ColumnLimit > 0 && Indent > Style.ColumnLimit)
265       return 0;
266 
267     unsigned Limit =
268         Style.ColumnLimit == 0 ? UINT_MAX : Style.ColumnLimit - Indent;
269     // If we already exceed the column limit, we set 'Limit' to 0. The different
270     // tryMerge..() functions can then decide whether to still do merging.
271     Limit = TheLine->Last->TotalLength > Limit
272                 ? 0
273                 : Limit - TheLine->Last->TotalLength;
274 
275     if (TheLine->Last->is(TT_FunctionLBrace) &&
276         TheLine->First == TheLine->Last &&
277         !Style.BraceWrapping.SplitEmptyFunction &&
278         NextLine.First->is(tok::r_brace)) {
279       return tryMergeSimpleBlock(I, E, Limit);
280     }
281 
282     const auto *PreviousLine = I != AnnotatedLines.begin() ? I[-1] : nullptr;
283     // Handle empty record blocks where the brace has already been wrapped.
284     if (PreviousLine && TheLine->Last->is(tok::l_brace) &&
285         TheLine->First == TheLine->Last) {
286       bool EmptyBlock = NextLine.First->is(tok::r_brace);
287 
288       const FormatToken *Tok = PreviousLine->First;
289       if (Tok && Tok->is(tok::comment))
290         Tok = Tok->getNextNonComment();
291 
292       if (Tok && Tok->getNamespaceToken()) {
293         return !Style.BraceWrapping.SplitEmptyNamespace && EmptyBlock
294                    ? tryMergeSimpleBlock(I, E, Limit)
295                    : 0;
296       }
297 
298       if (Tok && Tok->is(tok::kw_typedef))
299         Tok = Tok->getNextNonComment();
300       if (Tok && Tok->isOneOf(tok::kw_class, tok::kw_struct, tok::kw_union,
301                               tok::kw_extern, Keywords.kw_interface)) {
302         return !Style.BraceWrapping.SplitEmptyRecord && EmptyBlock
303                    ? tryMergeSimpleBlock(I, E, Limit)
304                    : 0;
305       }
306 
307       if (Tok && Tok->is(tok::kw_template) &&
308           Style.BraceWrapping.SplitEmptyRecord && EmptyBlock) {
309         return 0;
310       }
311     }
312 
313     auto ShouldMergeShortFunctions = [this, &I, &NextLine, PreviousLine,
314                                       TheLine]() {
315       if (Style.AllowShortFunctionsOnASingleLine == FormatStyle::SFS_All)
316         return true;
317       if (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty &&
318           NextLine.First->is(tok::r_brace)) {
319         return true;
320       }
321 
322       if (Style.AllowShortFunctionsOnASingleLine &
323           FormatStyle::SFS_InlineOnly) {
324         // Just checking TheLine->Level != 0 is not enough, because it
325         // provokes treating functions inside indented namespaces as short.
326         if (Style.isJavaScript() && TheLine->Last->is(TT_FunctionLBrace))
327           return true;
328 
329         if (TheLine->Level != 0) {
330           if (!PreviousLine)
331             return false;
332 
333           // TODO: Use IndentTracker to avoid loop?
334           // Find the last line with lower level.
335           const AnnotatedLine *Line = nullptr;
336           for (auto J = I - 1; J >= AnnotatedLines.begin(); --J) {
337             assert(*J);
338             if (!(*J)->InPPDirective && !(*J)->isComment() &&
339                 (*J)->Level < TheLine->Level) {
340               Line = *J;
341               break;
342             }
343           }
344 
345           if (!Line)
346             return false;
347 
348           // Check if the found line starts a record.
349           const auto *LastNonComment = Line->getLastNonComment();
350           // There must be another token (usually `{`), because we chose a
351           // non-PPDirective and non-comment line that has a smaller level.
352           assert(LastNonComment);
353           return isRecordLBrace(*LastNonComment);
354         }
355       }
356 
357       return false;
358     };
359 
360     bool MergeShortFunctions = ShouldMergeShortFunctions();
361 
362     const auto *FirstNonComment = TheLine->getFirstNonComment();
363     if (!FirstNonComment)
364       return 0;
365     // FIXME: There are probably cases where we should use FirstNonComment
366     // instead of TheLine->First.
367 
368     if (Style.CompactNamespaces) {
369       if (const auto *NSToken = TheLine->First->getNamespaceToken()) {
370         int J = 1;
371         assert(TheLine->MatchingClosingBlockLineIndex > 0);
372         for (auto ClosingLineIndex = TheLine->MatchingClosingBlockLineIndex - 1;
373              I + J != E && NSToken->TokenText == getNamespaceTokenText(I[J]) &&
374              ClosingLineIndex == I[J]->MatchingClosingBlockLineIndex &&
375              I[J]->Last->TotalLength < Limit;
376              ++J, --ClosingLineIndex) {
377           Limit -= I[J]->Last->TotalLength;
378 
379           // Reduce indent level for bodies of namespaces which were compacted,
380           // but only if their content was indented in the first place.
381           auto *ClosingLine = AnnotatedLines.begin() + ClosingLineIndex + 1;
382           const int OutdentBy = I[J]->Level - TheLine->Level;
383           assert(OutdentBy >= 0);
384           for (auto *CompactedLine = I + J; CompactedLine <= ClosingLine;
385                ++CompactedLine) {
386             if (!(*CompactedLine)->InPPDirective) {
387               const int Level = (*CompactedLine)->Level;
388               (*CompactedLine)->Level = std::max(Level - OutdentBy, 0);
389             }
390           }
391         }
392         return J - 1;
393       }
394 
395       if (auto nsToken = getMatchingNamespaceToken(TheLine, AnnotatedLines)) {
396         int i = 0;
397         unsigned openingLine = TheLine->MatchingOpeningBlockLineIndex - 1;
398         for (; I + 1 + i != E &&
399                nsToken->TokenText ==
400                    getMatchingNamespaceTokenText(I[i + 1], AnnotatedLines) &&
401                openingLine == I[i + 1]->MatchingOpeningBlockLineIndex;
402              i++, --openingLine) {
403           // No space between consecutive braces.
404           I[i + 1]->First->SpacesRequiredBefore =
405               I[i]->Last->isNot(tok::r_brace);
406 
407           // Indent like the outer-most namespace.
408           IndentTracker.nextLine(*I[i + 1]);
409         }
410         return i;
411       }
412     }
413 
414     const auto *LastNonComment = TheLine->getLastNonComment();
415     assert(LastNonComment);
416     // FIXME: There are probably cases where we should use LastNonComment
417     // instead of TheLine->Last.
418 
419     // Try to merge a function block with left brace unwrapped.
420     if (LastNonComment->is(TT_FunctionLBrace) &&
421         TheLine->First != LastNonComment) {
422       return MergeShortFunctions ? tryMergeSimpleBlock(I, E, Limit) : 0;
423     }
424     // Try to merge a control statement block with left brace unwrapped.
425     if (TheLine->Last->is(tok::l_brace) && FirstNonComment != TheLine->Last &&
426         FirstNonComment->isOneOf(tok::kw_if, tok::kw_while, tok::kw_for,
427                                  TT_ForEachMacro)) {
428       return Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never
429                  ? tryMergeSimpleBlock(I, E, Limit)
430                  : 0;
431     }
432     // Try to merge a control statement block with left brace wrapped.
433     if (NextLine.First->is(tok::l_brace)) {
434       if ((TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
435                                    tok::kw_for, tok::kw_switch, tok::kw_try,
436                                    tok::kw_do, TT_ForEachMacro) ||
437            (TheLine->First->is(tok::r_brace) && TheLine->First->Next &&
438             TheLine->First->Next->isOneOf(tok::kw_else, tok::kw_catch))) &&
439           Style.BraceWrapping.AfterControlStatement ==
440               FormatStyle::BWACS_MultiLine) {
441         // If possible, merge the next line's wrapped left brace with the
442         // current line. Otherwise, leave it on the next line, as this is a
443         // multi-line control statement.
444         return (Style.ColumnLimit == 0 || TheLine->Level * Style.IndentWidth +
445                                                   TheLine->Last->TotalLength <=
446                                               Style.ColumnLimit)
447                    ? 1
448                    : 0;
449       }
450       if (TheLine->First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
451                                   tok::kw_for, TT_ForEachMacro)) {
452         return (Style.BraceWrapping.AfterControlStatement ==
453                 FormatStyle::BWACS_Always)
454                    ? tryMergeSimpleBlock(I, E, Limit)
455                    : 0;
456       }
457       if (TheLine->First->isOneOf(tok::kw_else, tok::kw_catch) &&
458           Style.BraceWrapping.AfterControlStatement ==
459               FormatStyle::BWACS_MultiLine) {
460         // This case if different from the upper BWACS_MultiLine processing
461         // in that a preceding r_brace is not on the same line as else/catch
462         // most likely because of BeforeElse/BeforeCatch set to true.
463         // If the line length doesn't fit ColumnLimit, leave l_brace on the
464         // next line to respect the BWACS_MultiLine.
465         return (Style.ColumnLimit == 0 ||
466                 TheLine->Last->TotalLength <= Style.ColumnLimit)
467                    ? 1
468                    : 0;
469       }
470     }
471     if (PreviousLine && TheLine->First->is(tok::l_brace)) {
472       switch (PreviousLine->First->Tok.getKind()) {
473       case tok::at:
474         // Don't merge block with left brace wrapped after ObjC special blocks.
475         if (PreviousLine->First->Next) {
476           tok::ObjCKeywordKind kwId =
477               PreviousLine->First->Next->Tok.getObjCKeywordID();
478           if (kwId == tok::objc_autoreleasepool ||
479               kwId == tok::objc_synchronized) {
480             return 0;
481           }
482         }
483         break;
484 
485       case tok::kw_case:
486       case tok::kw_default:
487         // Don't merge block with left brace wrapped after case labels.
488         return 0;
489 
490       default:
491         break;
492       }
493     }
494 
495     // Don't merge an empty template class or struct if SplitEmptyRecords
496     // is defined.
497     if (PreviousLine && Style.BraceWrapping.SplitEmptyRecord &&
498         TheLine->Last->is(tok::l_brace) && PreviousLine->Last) {
499       const FormatToken *Previous = PreviousLine->Last;
500       if (Previous) {
501         if (Previous->is(tok::comment))
502           Previous = Previous->getPreviousNonComment();
503         if (Previous) {
504           if (Previous->is(tok::greater) && !PreviousLine->InPPDirective)
505             return 0;
506           if (Previous->is(tok::identifier)) {
507             const FormatToken *PreviousPrevious =
508                 Previous->getPreviousNonComment();
509             if (PreviousPrevious &&
510                 PreviousPrevious->isOneOf(tok::kw_class, tok::kw_struct)) {
511               return 0;
512             }
513           }
514         }
515       }
516     }
517 
518     if (TheLine->Last->is(tok::l_brace)) {
519       bool ShouldMerge = false;
520       // Try to merge records.
521       if (TheLine->Last->is(TT_EnumLBrace)) {
522         ShouldMerge = Style.AllowShortEnumsOnASingleLine;
523       } else if (TheLine->Last->is(TT_RequiresExpressionLBrace)) {
524         ShouldMerge = Style.AllowShortCompoundRequirementOnASingleLine;
525       } else if (TheLine->Last->isOneOf(TT_ClassLBrace, TT_StructLBrace)) {
526         // NOTE: We use AfterClass (whereas AfterStruct exists) for both classes
527         // and structs, but it seems that wrapping is still handled correctly
528         // elsewhere.
529         ShouldMerge = !Style.BraceWrapping.AfterClass ||
530                       (NextLine.First->is(tok::r_brace) &&
531                        !Style.BraceWrapping.SplitEmptyRecord);
532       } else if (TheLine->InPPDirective ||
533                  !TheLine->First->isOneOf(tok::kw_class, tok::kw_enum,
534                                           tok::kw_struct)) {
535         // Try to merge a block with left brace unwrapped that wasn't yet
536         // covered.
537         ShouldMerge = !Style.BraceWrapping.AfterFunction ||
538                       (NextLine.First->is(tok::r_brace) &&
539                        !Style.BraceWrapping.SplitEmptyFunction);
540       }
541       return ShouldMerge ? tryMergeSimpleBlock(I, E, Limit) : 0;
542     }
543 
544     // Try to merge a function block with left brace wrapped.
545     if (NextLine.First->is(TT_FunctionLBrace) &&
546         Style.BraceWrapping.AfterFunction) {
547       if (NextLine.Last->is(TT_LineComment))
548         return 0;
549 
550       // Check for Limit <= 2 to account for the " {".
551       if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(TheLine)))
552         return 0;
553       Limit -= 2;
554 
555       unsigned MergedLines = 0;
556       if (MergeShortFunctions ||
557           (Style.AllowShortFunctionsOnASingleLine >= FormatStyle::SFS_Empty &&
558            NextLine.First == NextLine.Last && I + 2 != E &&
559            I[2]->First->is(tok::r_brace))) {
560         MergedLines = tryMergeSimpleBlock(I + 1, E, Limit);
561         // If we managed to merge the block, count the function header, which is
562         // on a separate line.
563         if (MergedLines > 0)
564           ++MergedLines;
565       }
566       return MergedLines;
567     }
568     auto IsElseLine = [&TheLine]() -> bool {
569       const FormatToken *First = TheLine->First;
570       if (First->is(tok::kw_else))
571         return true;
572 
573       return First->is(tok::r_brace) && First->Next &&
574              First->Next->is(tok::kw_else);
575     };
576     if (TheLine->First->is(tok::kw_if) ||
577         (IsElseLine() && (Style.AllowShortIfStatementsOnASingleLine ==
578                           FormatStyle::SIS_AllIfsAndElse))) {
579       return Style.AllowShortIfStatementsOnASingleLine
580                  ? tryMergeSimpleControlStatement(I, E, Limit)
581                  : 0;
582     }
583     if (TheLine->First->isOneOf(tok::kw_for, tok::kw_while, tok::kw_do,
584                                 TT_ForEachMacro)) {
585       return Style.AllowShortLoopsOnASingleLine
586                  ? tryMergeSimpleControlStatement(I, E, Limit)
587                  : 0;
588     }
589     if (TheLine->First->isOneOf(tok::kw_case, tok::kw_default)) {
590       return Style.AllowShortCaseLabelsOnASingleLine
591                  ? tryMergeShortCaseLabels(I, E, Limit)
592                  : 0;
593     }
594     if (TheLine->InPPDirective &&
595         (TheLine->First->HasUnescapedNewline || TheLine->First->IsFirst)) {
596       return tryMergeSimplePPDirective(I, E, Limit);
597     }
598     return 0;
599   }
600 
601   unsigned
602   tryMergeSimplePPDirective(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
603                             SmallVectorImpl<AnnotatedLine *>::const_iterator E,
604                             unsigned Limit) {
605     if (Limit == 0)
606       return 0;
607     if (I + 2 != E && I[2]->InPPDirective && !I[2]->First->HasUnescapedNewline)
608       return 0;
609     if (1 + I[1]->Last->TotalLength > Limit)
610       return 0;
611     return 1;
612   }
613 
614   unsigned tryMergeSimpleControlStatement(
615       SmallVectorImpl<AnnotatedLine *>::const_iterator I,
616       SmallVectorImpl<AnnotatedLine *>::const_iterator E, unsigned Limit) {
617     if (Limit == 0)
618       return 0;
619     if (Style.BraceWrapping.AfterControlStatement ==
620             FormatStyle::BWACS_Always &&
621         I[1]->First->is(tok::l_brace) &&
622         Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never) {
623       return 0;
624     }
625     if (I[1]->InPPDirective != (*I)->InPPDirective ||
626         (I[1]->InPPDirective && I[1]->First->HasUnescapedNewline)) {
627       return 0;
628     }
629     Limit = limitConsideringMacros(I + 1, E, Limit);
630     AnnotatedLine &Line = **I;
631     if (Line.First->isNot(tok::kw_do) && Line.First->isNot(tok::kw_else) &&
632         Line.Last->isNot(tok::kw_else) && Line.Last->isNot(tok::r_paren)) {
633       return 0;
634     }
635     // Only merge `do while` if `do` is the only statement on the line.
636     if (Line.First->is(tok::kw_do) && Line.Last->isNot(tok::kw_do))
637       return 0;
638     if (1 + I[1]->Last->TotalLength > Limit)
639       return 0;
640     // Don't merge with loops, ifs, a single semicolon or a line comment.
641     if (I[1]->First->isOneOf(tok::semi, tok::kw_if, tok::kw_for, tok::kw_while,
642                              TT_ForEachMacro, TT_LineComment)) {
643       return 0;
644     }
645     // Only inline simple if's (no nested if or else), unless specified
646     if (Style.AllowShortIfStatementsOnASingleLine ==
647         FormatStyle::SIS_WithoutElse) {
648       if (I + 2 != E && Line.startsWith(tok::kw_if) &&
649           I[2]->First->is(tok::kw_else)) {
650         return 0;
651       }
652     }
653     return 1;
654   }
655 
656   unsigned
657   tryMergeShortCaseLabels(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
658                           SmallVectorImpl<AnnotatedLine *>::const_iterator E,
659                           unsigned Limit) {
660     if (Limit == 0 || I + 1 == E ||
661         I[1]->First->isOneOf(tok::kw_case, tok::kw_default)) {
662       return 0;
663     }
664     if (I[0]->Last->is(tok::l_brace) || I[1]->First->is(tok::l_brace))
665       return 0;
666     unsigned NumStmts = 0;
667     unsigned Length = 0;
668     bool EndsWithComment = false;
669     bool InPPDirective = I[0]->InPPDirective;
670     bool InMacroBody = I[0]->InMacroBody;
671     const unsigned Level = I[0]->Level;
672     for (; NumStmts < 3; ++NumStmts) {
673       if (I + 1 + NumStmts == E)
674         break;
675       const AnnotatedLine *Line = I[1 + NumStmts];
676       if (Line->InPPDirective != InPPDirective)
677         break;
678       if (Line->InMacroBody != InMacroBody)
679         break;
680       if (Line->First->isOneOf(tok::kw_case, tok::kw_default, tok::r_brace))
681         break;
682       if (Line->First->isOneOf(tok::kw_if, tok::kw_for, tok::kw_switch,
683                                tok::kw_while) ||
684           EndsWithComment) {
685         return 0;
686       }
687       if (Line->First->is(tok::comment)) {
688         if (Level != Line->Level)
689           return 0;
690         SmallVectorImpl<AnnotatedLine *>::const_iterator J = I + 2 + NumStmts;
691         for (; J != E; ++J) {
692           Line = *J;
693           if (Line->InPPDirective != InPPDirective)
694             break;
695           if (Line->First->isOneOf(tok::kw_case, tok::kw_default, tok::r_brace))
696             break;
697           if (Line->First->isNot(tok::comment) || Level != Line->Level)
698             return 0;
699         }
700         break;
701       }
702       if (Line->Last->is(tok::comment))
703         EndsWithComment = true;
704       Length += I[1 + NumStmts]->Last->TotalLength + 1; // 1 for the space.
705     }
706     if (NumStmts == 0 || NumStmts == 3 || Length > Limit)
707       return 0;
708     return NumStmts;
709   }
710 
711   unsigned
712   tryMergeSimpleBlock(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
713                       SmallVectorImpl<AnnotatedLine *>::const_iterator E,
714                       unsigned Limit) {
715     // Don't merge with a preprocessor directive.
716     if (I[1]->Type == LT_PreprocessorDirective)
717       return 0;
718 
719     AnnotatedLine &Line = **I;
720 
721     // Don't merge ObjC @ keywords and methods.
722     // FIXME: If an option to allow short exception handling clauses on a single
723     // line is added, change this to not return for @try and friends.
724     if (Style.Language != FormatStyle::LK_Java &&
725         Line.First->isOneOf(tok::at, tok::minus, tok::plus)) {
726       return 0;
727     }
728 
729     // Check that the current line allows merging. This depends on whether we
730     // are in a control flow statements as well as several style flags.
731     if (Line.First->is(tok::kw_case) ||
732         (Line.First->Next && Line.First->Next->is(tok::kw_else))) {
733       return 0;
734     }
735     // default: in switch statement
736     if (Line.First->is(tok::kw_default)) {
737       const FormatToken *Tok = Line.First->getNextNonComment();
738       if (Tok && Tok->is(tok::colon))
739         return 0;
740     }
741 
742     auto IsCtrlStmt = [](const auto &Line) {
743       return Line.First->isOneOf(tok::kw_if, tok::kw_else, tok::kw_while,
744                                  tok::kw_do, tok::kw_for, TT_ForEachMacro);
745     };
746 
747     const bool IsSplitBlock =
748         Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Never ||
749         (Style.AllowShortBlocksOnASingleLine == FormatStyle::SBS_Empty &&
750          I[1]->First->isNot(tok::r_brace));
751 
752     if (IsCtrlStmt(Line) ||
753         Line.First->isOneOf(tok::kw_try, tok::kw___try, tok::kw_catch,
754                             tok::kw___finally, tok::r_brace,
755                             Keywords.kw___except)) {
756       if (IsSplitBlock)
757         return 0;
758       // Don't merge when we can't except the case when
759       // the control statement block is empty
760       if (!Style.AllowShortIfStatementsOnASingleLine &&
761           Line.First->isOneOf(tok::kw_if, tok::kw_else) &&
762           !Style.BraceWrapping.AfterControlStatement &&
763           I[1]->First->isNot(tok::r_brace)) {
764         return 0;
765       }
766       if (!Style.AllowShortIfStatementsOnASingleLine &&
767           Line.First->isOneOf(tok::kw_if, tok::kw_else) &&
768           Style.BraceWrapping.AfterControlStatement ==
769               FormatStyle::BWACS_Always &&
770           I + 2 != E && I[2]->First->isNot(tok::r_brace)) {
771         return 0;
772       }
773       if (!Style.AllowShortLoopsOnASingleLine &&
774           Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for,
775                               TT_ForEachMacro) &&
776           !Style.BraceWrapping.AfterControlStatement &&
777           I[1]->First->isNot(tok::r_brace)) {
778         return 0;
779       }
780       if (!Style.AllowShortLoopsOnASingleLine &&
781           Line.First->isOneOf(tok::kw_while, tok::kw_do, tok::kw_for,
782                               TT_ForEachMacro) &&
783           Style.BraceWrapping.AfterControlStatement ==
784               FormatStyle::BWACS_Always &&
785           I + 2 != E && I[2]->First->isNot(tok::r_brace)) {
786         return 0;
787       }
788       // FIXME: Consider an option to allow short exception handling clauses on
789       // a single line.
790       // FIXME: This isn't covered by tests.
791       // FIXME: For catch, __except, __finally the first token on the line
792       // is '}', so this isn't correct here.
793       if (Line.First->isOneOf(tok::kw_try, tok::kw___try, tok::kw_catch,
794                               Keywords.kw___except, tok::kw___finally)) {
795         return 0;
796       }
797     }
798 
799     if (const auto *LastNonComment = Line.getLastNonComment();
800         LastNonComment && LastNonComment->is(tok::l_brace)) {
801       if (IsSplitBlock && Line.First == Line.Last &&
802           I > AnnotatedLines.begin() &&
803           (I[-1]->endsWith(tok::kw_else) || IsCtrlStmt(*I[-1]))) {
804         return 0;
805       }
806       FormatToken *Tok = I[1]->First;
807       auto ShouldMerge = [Tok]() {
808         if (Tok->isNot(tok::r_brace) || Tok->MustBreakBefore)
809           return false;
810         const FormatToken *Next = Tok->getNextNonComment();
811         return !Next || Next->is(tok::semi);
812       };
813 
814       if (ShouldMerge()) {
815         // We merge empty blocks even if the line exceeds the column limit.
816         Tok->SpacesRequiredBefore =
817             (Style.SpaceInEmptyBlock || Line.Last->is(tok::comment)) ? 1 : 0;
818         Tok->CanBreakBefore = true;
819         return 1;
820       } else if (Limit != 0 && !Line.startsWithNamespace() &&
821                  !startsExternCBlock(Line)) {
822         // We don't merge short records.
823         if (isRecordLBrace(*Line.Last))
824           return 0;
825 
826         // Check that we still have three lines and they fit into the limit.
827         if (I + 2 == E || I[2]->Type == LT_Invalid)
828           return 0;
829         Limit = limitConsideringMacros(I + 2, E, Limit);
830 
831         if (!nextTwoLinesFitInto(I, Limit))
832           return 0;
833 
834         // Second, check that the next line does not contain any braces - if it
835         // does, readability declines when putting it into a single line.
836         if (I[1]->Last->is(TT_LineComment))
837           return 0;
838         do {
839           if (Tok->is(tok::l_brace) && Tok->isNot(BK_BracedInit))
840             return 0;
841           Tok = Tok->Next;
842         } while (Tok);
843 
844         // Last, check that the third line starts with a closing brace.
845         Tok = I[2]->First;
846         if (Tok->isNot(tok::r_brace))
847           return 0;
848 
849         // Don't merge "if (a) { .. } else {".
850         if (Tok->Next && Tok->Next->is(tok::kw_else))
851           return 0;
852 
853         // Don't merge a trailing multi-line control statement block like:
854         // } else if (foo &&
855         //            bar)
856         // { <-- current Line
857         //   baz();
858         // }
859         if (Line.First == Line.Last && Line.First->isNot(TT_FunctionLBrace) &&
860             Style.BraceWrapping.AfterControlStatement ==
861                 FormatStyle::BWACS_MultiLine) {
862           return 0;
863         }
864 
865         return 2;
866       }
867     } else if (I[1]->First->is(tok::l_brace)) {
868       if (I[1]->Last->is(TT_LineComment))
869         return 0;
870 
871       // Check for Limit <= 2 to account for the " {".
872       if (Limit <= 2 || (Style.ColumnLimit == 0 && containsMustBreak(*I)))
873         return 0;
874       Limit -= 2;
875       unsigned MergedLines = 0;
876       if (Style.AllowShortBlocksOnASingleLine != FormatStyle::SBS_Never ||
877           (I[1]->First == I[1]->Last && I + 2 != E &&
878            I[2]->First->is(tok::r_brace))) {
879         MergedLines = tryMergeSimpleBlock(I + 1, E, Limit);
880         // If we managed to merge the block, count the statement header, which
881         // is on a separate line.
882         if (MergedLines > 0)
883           ++MergedLines;
884       }
885       return MergedLines;
886     }
887     return 0;
888   }
889 
890   /// Returns the modified column limit for \p I if it is inside a macro and
891   /// needs a trailing '\'.
892   unsigned
893   limitConsideringMacros(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
894                          SmallVectorImpl<AnnotatedLine *>::const_iterator E,
895                          unsigned Limit) {
896     if (I[0]->InPPDirective && I + 1 != E &&
897         !I[1]->First->HasUnescapedNewline && I[1]->First->isNot(tok::eof)) {
898       return Limit < 2 ? 0 : Limit - 2;
899     }
900     return Limit;
901   }
902 
903   bool nextTwoLinesFitInto(SmallVectorImpl<AnnotatedLine *>::const_iterator I,
904                            unsigned Limit) {
905     if (I[1]->First->MustBreakBefore || I[2]->First->MustBreakBefore)
906       return false;
907     return 1 + I[1]->Last->TotalLength + 1 + I[2]->Last->TotalLength <= Limit;
908   }
909 
910   bool containsMustBreak(const AnnotatedLine *Line) {
911     assert(Line->First);
912     // Ignore the first token, because in this situation, it applies more to the
913     // last token of the previous line.
914     for (const FormatToken *Tok = Line->First->Next; Tok; Tok = Tok->Next)
915       if (Tok->MustBreakBefore)
916         return true;
917     return false;
918   }
919 
920   void join(AnnotatedLine &A, const AnnotatedLine &B) {
921     assert(!A.Last->Next);
922     assert(!B.First->Previous);
923     if (B.Affected)
924       A.Affected = true;
925     A.Last->Next = B.First;
926     B.First->Previous = A.Last;
927     B.First->CanBreakBefore = true;
928     unsigned LengthA = A.Last->TotalLength + B.First->SpacesRequiredBefore;
929     for (FormatToken *Tok = B.First; Tok; Tok = Tok->Next) {
930       Tok->TotalLength += LengthA;
931       A.Last = Tok;
932     }
933   }
934 
935   const FormatStyle &Style;
936   const AdditionalKeywords &Keywords;
937   const SmallVectorImpl<AnnotatedLine *>::const_iterator End;
938 
939   SmallVectorImpl<AnnotatedLine *>::const_iterator Next;
940   const SmallVectorImpl<AnnotatedLine *> &AnnotatedLines;
941 };
942 
943 static void markFinalized(FormatToken *Tok) {
944   if (Tok->is(tok::hash) && !Tok->Previous && Tok->Next &&
945       Tok->Next->isOneOf(tok::pp_if, tok::pp_ifdef, tok::pp_ifndef,
946                          tok::pp_elif, tok::pp_elifdef, tok::pp_elifndef,
947                          tok::pp_else, tok::pp_endif)) {
948     Tok = Tok->Next;
949   }
950   for (; Tok; Tok = Tok->Next) {
951     if (Tok->MacroCtx && Tok->MacroCtx->Role == MR_ExpandedArg) {
952       // In the first pass we format all macro arguments in the expanded token
953       // stream. Instead of finalizing the macro arguments, we mark that they
954       // will be modified as unexpanded arguments (as part of the macro call
955       // formatting) in the next pass.
956       Tok->MacroCtx->Role = MR_UnexpandedArg;
957       // Reset whether spaces are required before this token, as that is context
958       // dependent, and that context may change when formatting the macro call.
959       // For example, given M(x) -> 2 * x, and the macro call M(var),
960       // the token 'var' will have SpacesRequiredBefore = 1 after being
961       // formatted as part of the expanded macro, but SpacesRequiredBefore = 0
962       // for its position within the macro call.
963       Tok->SpacesRequiredBefore = 0;
964     } else {
965       Tok->Finalized = true;
966     }
967   }
968 }
969 
970 #ifndef NDEBUG
971 static void printLineState(const LineState &State) {
972   llvm::dbgs() << "State: ";
973   for (const ParenState &P : State.Stack) {
974     llvm::dbgs() << (P.Tok ? P.Tok->TokenText : "F") << "|" << P.Indent << "|"
975                  << P.LastSpace << "|" << P.NestedBlockIndent << " ";
976   }
977   llvm::dbgs() << State.NextToken->TokenText << "\n";
978 }
979 #endif
980 
981 /// Base class for classes that format one \c AnnotatedLine.
982 class LineFormatter {
983 public:
984   LineFormatter(ContinuationIndenter *Indenter, WhitespaceManager *Whitespaces,
985                 const FormatStyle &Style,
986                 UnwrappedLineFormatter *BlockFormatter)
987       : Indenter(Indenter), Whitespaces(Whitespaces), Style(Style),
988         BlockFormatter(BlockFormatter) {}
989   virtual ~LineFormatter() {}
990 
991   /// Formats an \c AnnotatedLine and returns the penalty.
992   ///
993   /// If \p DryRun is \c false, directly applies the changes.
994   virtual unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
995                               unsigned FirstStartColumn, bool DryRun) = 0;
996 
997 protected:
998   /// If the \p State's next token is an r_brace closing a nested block,
999   /// format the nested block before it.
1000   ///
1001   /// Returns \c true if all children could be placed successfully and adapts
1002   /// \p Penalty as well as \p State. If \p DryRun is false, also directly
1003   /// creates changes using \c Whitespaces.
1004   ///
1005   /// The crucial idea here is that children always get formatted upon
1006   /// encountering the closing brace right after the nested block. Now, if we
1007   /// are currently trying to keep the "}" on the same line (i.e. \p NewLine is
1008   /// \c false), the entire block has to be kept on the same line (which is only
1009   /// possible if it fits on the line, only contains a single statement, etc.
1010   ///
1011   /// If \p NewLine is true, we format the nested block on separate lines, i.e.
1012   /// break after the "{", format all lines with correct indentation and the put
1013   /// the closing "}" on yet another new line.
1014   ///
1015   /// This enables us to keep the simple structure of the
1016   /// \c UnwrappedLineFormatter, where we only have two options for each token:
1017   /// break or don't break.
1018   bool formatChildren(LineState &State, bool NewLine, bool DryRun,
1019                       unsigned &Penalty) {
1020     const FormatToken *LBrace = State.NextToken->getPreviousNonComment();
1021     bool HasLBrace = LBrace && LBrace->is(tok::l_brace) && LBrace->is(BK_Block);
1022     FormatToken &Previous = *State.NextToken->Previous;
1023     if (Previous.Children.size() == 0 || (!HasLBrace && !LBrace->MacroParent)) {
1024       // The previous token does not open a block. Nothing to do. We don't
1025       // assert so that we can simply call this function for all tokens.
1026       return true;
1027     }
1028 
1029     if (NewLine || Previous.MacroParent) {
1030       const ParenState &P = State.Stack.back();
1031 
1032       int AdditionalIndent =
1033           P.Indent - Previous.Children[0]->Level * Style.IndentWidth;
1034       Penalty +=
1035           BlockFormatter->format(Previous.Children, DryRun, AdditionalIndent,
1036                                  /*FixBadIndentation=*/true);
1037       return true;
1038     }
1039 
1040     if (Previous.Children[0]->First->MustBreakBefore)
1041       return false;
1042 
1043     // Cannot merge into one line if this line ends on a comment.
1044     if (Previous.is(tok::comment))
1045       return false;
1046 
1047     // Cannot merge multiple statements into a single line.
1048     if (Previous.Children.size() > 1)
1049       return false;
1050 
1051     const AnnotatedLine *Child = Previous.Children[0];
1052     // We can't put the closing "}" on a line with a trailing comment.
1053     if (Child->Last->isTrailingComment())
1054       return false;
1055 
1056     // If the child line exceeds the column limit, we wouldn't want to merge it.
1057     // We add +2 for the trailing " }".
1058     if (Style.ColumnLimit > 0 &&
1059         Child->Last->TotalLength + State.Column + 2 > Style.ColumnLimit) {
1060       return false;
1061     }
1062 
1063     if (!DryRun) {
1064       Whitespaces->replaceWhitespace(
1065           *Child->First, /*Newlines=*/0, /*Spaces=*/1,
1066           /*StartOfTokenColumn=*/State.Column, /*IsAligned=*/false,
1067           State.Line->InPPDirective);
1068     }
1069     Penalty +=
1070         formatLine(*Child, State.Column + 1, /*FirstStartColumn=*/0, DryRun);
1071     if (!DryRun)
1072       markFinalized(Child->First);
1073 
1074     State.Column += 1 + Child->Last->TotalLength;
1075     return true;
1076   }
1077 
1078   ContinuationIndenter *Indenter;
1079 
1080 private:
1081   WhitespaceManager *Whitespaces;
1082   const FormatStyle &Style;
1083   UnwrappedLineFormatter *BlockFormatter;
1084 };
1085 
1086 /// Formatter that keeps the existing line breaks.
1087 class NoColumnLimitLineFormatter : public LineFormatter {
1088 public:
1089   NoColumnLimitLineFormatter(ContinuationIndenter *Indenter,
1090                              WhitespaceManager *Whitespaces,
1091                              const FormatStyle &Style,
1092                              UnwrappedLineFormatter *BlockFormatter)
1093       : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {}
1094 
1095   /// Formats the line, simply keeping all of the input's line breaking
1096   /// decisions.
1097   unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
1098                       unsigned FirstStartColumn, bool DryRun) override {
1099     assert(!DryRun);
1100     LineState State = Indenter->getInitialState(FirstIndent, FirstStartColumn,
1101                                                 &Line, /*DryRun=*/false);
1102     while (State.NextToken) {
1103       bool Newline =
1104           Indenter->mustBreak(State) ||
1105           (Indenter->canBreak(State) && State.NextToken->NewlinesBefore > 0);
1106       unsigned Penalty = 0;
1107       formatChildren(State, Newline, /*DryRun=*/false, Penalty);
1108       Indenter->addTokenToState(State, Newline, /*DryRun=*/false);
1109     }
1110     return 0;
1111   }
1112 };
1113 
1114 /// Formatter that puts all tokens into a single line without breaks.
1115 class NoLineBreakFormatter : public LineFormatter {
1116 public:
1117   NoLineBreakFormatter(ContinuationIndenter *Indenter,
1118                        WhitespaceManager *Whitespaces, const FormatStyle &Style,
1119                        UnwrappedLineFormatter *BlockFormatter)
1120       : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {}
1121 
1122   /// Puts all tokens into a single line.
1123   unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
1124                       unsigned FirstStartColumn, bool DryRun) override {
1125     unsigned Penalty = 0;
1126     LineState State =
1127         Indenter->getInitialState(FirstIndent, FirstStartColumn, &Line, DryRun);
1128     while (State.NextToken) {
1129       formatChildren(State, /*NewLine=*/false, DryRun, Penalty);
1130       Indenter->addTokenToState(
1131           State, /*Newline=*/State.NextToken->MustBreakBefore, DryRun);
1132     }
1133     return Penalty;
1134   }
1135 };
1136 
1137 /// Finds the best way to break lines.
1138 class OptimizingLineFormatter : public LineFormatter {
1139 public:
1140   OptimizingLineFormatter(ContinuationIndenter *Indenter,
1141                           WhitespaceManager *Whitespaces,
1142                           const FormatStyle &Style,
1143                           UnwrappedLineFormatter *BlockFormatter)
1144       : LineFormatter(Indenter, Whitespaces, Style, BlockFormatter) {}
1145 
1146   /// Formats the line by finding the best line breaks with line lengths
1147   /// below the column limit.
1148   unsigned formatLine(const AnnotatedLine &Line, unsigned FirstIndent,
1149                       unsigned FirstStartColumn, bool DryRun) override {
1150     LineState State =
1151         Indenter->getInitialState(FirstIndent, FirstStartColumn, &Line, DryRun);
1152 
1153     // If the ObjC method declaration does not fit on a line, we should format
1154     // it with one arg per line.
1155     if (State.Line->Type == LT_ObjCMethodDecl)
1156       State.Stack.back().BreakBeforeParameter = true;
1157 
1158     // Find best solution in solution space.
1159     return analyzeSolutionSpace(State, DryRun);
1160   }
1161 
1162 private:
1163   struct CompareLineStatePointers {
1164     bool operator()(LineState *obj1, LineState *obj2) const {
1165       return *obj1 < *obj2;
1166     }
1167   };
1168 
1169   /// A pair of <penalty, count> that is used to prioritize the BFS on.
1170   ///
1171   /// In case of equal penalties, we want to prefer states that were inserted
1172   /// first. During state generation we make sure that we insert states first
1173   /// that break the line as late as possible.
1174   typedef std::pair<unsigned, unsigned> OrderedPenalty;
1175 
1176   /// An edge in the solution space from \c Previous->State to \c State,
1177   /// inserting a newline dependent on the \c NewLine.
1178   struct StateNode {
1179     StateNode(const LineState &State, bool NewLine, StateNode *Previous)
1180         : State(State), NewLine(NewLine), Previous(Previous) {}
1181     LineState State;
1182     bool NewLine;
1183     StateNode *Previous;
1184   };
1185 
1186   /// An item in the prioritized BFS search queue. The \c StateNode's
1187   /// \c State has the given \c OrderedPenalty.
1188   typedef std::pair<OrderedPenalty, StateNode *> QueueItem;
1189 
1190   /// The BFS queue type.
1191   typedef std::priority_queue<QueueItem, SmallVector<QueueItem>,
1192                               std::greater<QueueItem>>
1193       QueueType;
1194 
1195   /// Analyze the entire solution space starting from \p InitialState.
1196   ///
1197   /// This implements a variant of Dijkstra's algorithm on the graph that spans
1198   /// the solution space (\c LineStates are the nodes). The algorithm tries to
1199   /// find the shortest path (the one with lowest penalty) from \p InitialState
1200   /// to a state where all tokens are placed. Returns the penalty.
1201   ///
1202   /// If \p DryRun is \c false, directly applies the changes.
1203   unsigned analyzeSolutionSpace(LineState &InitialState, bool DryRun) {
1204     std::set<LineState *, CompareLineStatePointers> Seen;
1205 
1206     // Increasing count of \c StateNode items we have created. This is used to
1207     // create a deterministic order independent of the container.
1208     unsigned Count = 0;
1209     QueueType Queue;
1210 
1211     // Insert start element into queue.
1212     StateNode *RootNode =
1213         new (Allocator.Allocate()) StateNode(InitialState, false, nullptr);
1214     Queue.push(QueueItem(OrderedPenalty(0, Count), RootNode));
1215     ++Count;
1216 
1217     unsigned Penalty = 0;
1218 
1219     // While not empty, take first element and follow edges.
1220     while (!Queue.empty()) {
1221       // Quit if we still haven't found a solution by now.
1222       if (Count > 25000000)
1223         return 0;
1224 
1225       Penalty = Queue.top().first.first;
1226       StateNode *Node = Queue.top().second;
1227       if (!Node->State.NextToken) {
1228         LLVM_DEBUG(llvm::dbgs()
1229                    << "\n---\nPenalty for line: " << Penalty << "\n");
1230         break;
1231       }
1232       Queue.pop();
1233 
1234       // Cut off the analysis of certain solutions if the analysis gets too
1235       // complex. See description of IgnoreStackForComparison.
1236       if (Count > 50000)
1237         Node->State.IgnoreStackForComparison = true;
1238 
1239       if (!Seen.insert(&Node->State).second) {
1240         // State already examined with lower penalty.
1241         continue;
1242       }
1243 
1244       FormatDecision LastFormat = Node->State.NextToken->getDecision();
1245       if (LastFormat == FD_Unformatted || LastFormat == FD_Continue)
1246         addNextStateToQueue(Penalty, Node, /*NewLine=*/false, &Count, &Queue);
1247       if (LastFormat == FD_Unformatted || LastFormat == FD_Break)
1248         addNextStateToQueue(Penalty, Node, /*NewLine=*/true, &Count, &Queue);
1249     }
1250 
1251     if (Queue.empty()) {
1252       // We were unable to find a solution, do nothing.
1253       // FIXME: Add diagnostic?
1254       LLVM_DEBUG(llvm::dbgs() << "Could not find a solution.\n");
1255       return 0;
1256     }
1257 
1258     // Reconstruct the solution.
1259     if (!DryRun)
1260       reconstructPath(InitialState, Queue.top().second);
1261 
1262     LLVM_DEBUG(llvm::dbgs()
1263                << "Total number of analyzed states: " << Count << "\n");
1264     LLVM_DEBUG(llvm::dbgs() << "---\n");
1265 
1266     return Penalty;
1267   }
1268 
1269   /// Add the following state to the analysis queue \c Queue.
1270   ///
1271   /// Assume the current state is \p PreviousNode and has been reached with a
1272   /// penalty of \p Penalty. Insert a line break if \p NewLine is \c true.
1273   void addNextStateToQueue(unsigned Penalty, StateNode *PreviousNode,
1274                            bool NewLine, unsigned *Count, QueueType *Queue) {
1275     if (NewLine && !Indenter->canBreak(PreviousNode->State))
1276       return;
1277     if (!NewLine && Indenter->mustBreak(PreviousNode->State))
1278       return;
1279 
1280     StateNode *Node = new (Allocator.Allocate())
1281         StateNode(PreviousNode->State, NewLine, PreviousNode);
1282     if (!formatChildren(Node->State, NewLine, /*DryRun=*/true, Penalty))
1283       return;
1284 
1285     Penalty += Indenter->addTokenToState(Node->State, NewLine, true);
1286 
1287     Queue->push(QueueItem(OrderedPenalty(Penalty, *Count), Node));
1288     ++(*Count);
1289   }
1290 
1291   /// Applies the best formatting by reconstructing the path in the
1292   /// solution space that leads to \c Best.
1293   void reconstructPath(LineState &State, StateNode *Best) {
1294     llvm::SmallVector<StateNode *> Path;
1295     // We do not need a break before the initial token.
1296     while (Best->Previous) {
1297       Path.push_back(Best);
1298       Best = Best->Previous;
1299     }
1300     for (const auto &Node : llvm::reverse(Path)) {
1301       unsigned Penalty = 0;
1302       formatChildren(State, Node->NewLine, /*DryRun=*/false, Penalty);
1303       Penalty += Indenter->addTokenToState(State, Node->NewLine, false);
1304 
1305       LLVM_DEBUG({
1306         printLineState(Node->Previous->State);
1307         if (Node->NewLine) {
1308           llvm::dbgs() << "Penalty for placing "
1309                        << Node->Previous->State.NextToken->Tok.getName()
1310                        << " on a new line: " << Penalty << "\n";
1311         }
1312       });
1313     }
1314   }
1315 
1316   llvm::SpecificBumpPtrAllocator<StateNode> Allocator;
1317 };
1318 
1319 } // anonymous namespace
1320 
1321 unsigned UnwrappedLineFormatter::format(
1322     const SmallVectorImpl<AnnotatedLine *> &Lines, bool DryRun,
1323     int AdditionalIndent, bool FixBadIndentation, unsigned FirstStartColumn,
1324     unsigned NextStartColumn, unsigned LastStartColumn) {
1325   LineJoiner Joiner(Style, Keywords, Lines);
1326 
1327   // Try to look up already computed penalty in DryRun-mode.
1328   std::pair<const SmallVectorImpl<AnnotatedLine *> *, unsigned> CacheKey(
1329       &Lines, AdditionalIndent);
1330   auto CacheIt = PenaltyCache.find(CacheKey);
1331   if (DryRun && CacheIt != PenaltyCache.end())
1332     return CacheIt->second;
1333 
1334   assert(!Lines.empty());
1335   unsigned Penalty = 0;
1336   LevelIndentTracker IndentTracker(Style, Keywords, Lines[0]->Level,
1337                                    AdditionalIndent);
1338   const AnnotatedLine *PrevPrevLine = nullptr;
1339   const AnnotatedLine *PreviousLine = nullptr;
1340   const AnnotatedLine *NextLine = nullptr;
1341 
1342   // The minimum level of consecutive lines that have been formatted.
1343   unsigned RangeMinLevel = UINT_MAX;
1344 
1345   bool FirstLine = true;
1346   for (const AnnotatedLine *Line =
1347            Joiner.getNextMergedLine(DryRun, IndentTracker);
1348        Line; PrevPrevLine = PreviousLine, PreviousLine = Line, Line = NextLine,
1349                            FirstLine = false) {
1350     assert(Line->First);
1351     const AnnotatedLine &TheLine = *Line;
1352     unsigned Indent = IndentTracker.getIndent();
1353 
1354     // We continue formatting unchanged lines to adjust their indent, e.g. if a
1355     // scope was added. However, we need to carefully stop doing this when we
1356     // exit the scope of affected lines to prevent indenting the entire
1357     // remaining file if it currently missing a closing brace.
1358     bool PreviousRBrace =
1359         PreviousLine && PreviousLine->startsWith(tok::r_brace);
1360     bool ContinueFormatting =
1361         TheLine.Level > RangeMinLevel ||
1362         (TheLine.Level == RangeMinLevel && !PreviousRBrace &&
1363          !TheLine.startsWith(tok::r_brace));
1364 
1365     bool FixIndentation = (FixBadIndentation || ContinueFormatting) &&
1366                           Indent != TheLine.First->OriginalColumn;
1367     bool ShouldFormat = TheLine.Affected || FixIndentation;
1368     // We cannot format this line; if the reason is that the line had a
1369     // parsing error, remember that.
1370     if (ShouldFormat && TheLine.Type == LT_Invalid && Status) {
1371       Status->FormatComplete = false;
1372       Status->Line =
1373           SourceMgr.getSpellingLineNumber(TheLine.First->Tok.getLocation());
1374     }
1375 
1376     if (ShouldFormat && TheLine.Type != LT_Invalid) {
1377       if (!DryRun) {
1378         bool LastLine = TheLine.First->is(tok::eof);
1379         formatFirstToken(TheLine, PreviousLine, PrevPrevLine, Lines, Indent,
1380                          LastLine ? LastStartColumn : NextStartColumn + Indent);
1381       }
1382 
1383       NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker);
1384       unsigned ColumnLimit = getColumnLimit(TheLine.InPPDirective, NextLine);
1385       bool FitsIntoOneLine =
1386           !TheLine.ContainsMacroCall &&
1387           (TheLine.Last->TotalLength + Indent <= ColumnLimit ||
1388            (TheLine.Type == LT_ImportStatement &&
1389             (!Style.isJavaScript() || !Style.JavaScriptWrapImports)) ||
1390            (Style.isCSharp() &&
1391             TheLine.InPPDirective)); // don't split #regions in C#
1392       if (Style.ColumnLimit == 0) {
1393         NoColumnLimitLineFormatter(Indenter, Whitespaces, Style, this)
1394             .formatLine(TheLine, NextStartColumn + Indent,
1395                         FirstLine ? FirstStartColumn : 0, DryRun);
1396       } else if (FitsIntoOneLine) {
1397         Penalty += NoLineBreakFormatter(Indenter, Whitespaces, Style, this)
1398                        .formatLine(TheLine, NextStartColumn + Indent,
1399                                    FirstLine ? FirstStartColumn : 0, DryRun);
1400       } else {
1401         Penalty += OptimizingLineFormatter(Indenter, Whitespaces, Style, this)
1402                        .formatLine(TheLine, NextStartColumn + Indent,
1403                                    FirstLine ? FirstStartColumn : 0, DryRun);
1404       }
1405       RangeMinLevel = std::min(RangeMinLevel, TheLine.Level);
1406     } else {
1407       // If no token in the current line is affected, we still need to format
1408       // affected children.
1409       if (TheLine.ChildrenAffected) {
1410         for (const FormatToken *Tok = TheLine.First; Tok; Tok = Tok->Next)
1411           if (!Tok->Children.empty())
1412             format(Tok->Children, DryRun);
1413       }
1414 
1415       // Adapt following lines on the current indent level to the same level
1416       // unless the current \c AnnotatedLine is not at the beginning of a line.
1417       bool StartsNewLine =
1418           TheLine.First->NewlinesBefore > 0 || TheLine.First->IsFirst;
1419       if (StartsNewLine)
1420         IndentTracker.adjustToUnmodifiedLine(TheLine);
1421       if (!DryRun) {
1422         bool ReformatLeadingWhitespace =
1423             StartsNewLine && ((PreviousLine && PreviousLine->Affected) ||
1424                               TheLine.LeadingEmptyLinesAffected);
1425         // Format the first token.
1426         if (ReformatLeadingWhitespace) {
1427           formatFirstToken(TheLine, PreviousLine, PrevPrevLine, Lines,
1428                            TheLine.First->OriginalColumn,
1429                            TheLine.First->OriginalColumn);
1430         } else {
1431           Whitespaces->addUntouchableToken(*TheLine.First,
1432                                            TheLine.InPPDirective);
1433         }
1434 
1435         // Notify the WhitespaceManager about the unchanged whitespace.
1436         for (FormatToken *Tok = TheLine.First->Next; Tok; Tok = Tok->Next)
1437           Whitespaces->addUntouchableToken(*Tok, TheLine.InPPDirective);
1438       }
1439       NextLine = Joiner.getNextMergedLine(DryRun, IndentTracker);
1440       RangeMinLevel = UINT_MAX;
1441     }
1442     if (!DryRun)
1443       markFinalized(TheLine.First);
1444   }
1445   PenaltyCache[CacheKey] = Penalty;
1446   return Penalty;
1447 }
1448 
1449 static auto computeNewlines(const AnnotatedLine &Line,
1450                             const AnnotatedLine *PreviousLine,
1451                             const AnnotatedLine *PrevPrevLine,
1452                             const SmallVectorImpl<AnnotatedLine *> &Lines,
1453                             const FormatStyle &Style) {
1454   const auto &RootToken = *Line.First;
1455   auto Newlines =
1456       std::min(RootToken.NewlinesBefore, Style.MaxEmptyLinesToKeep + 1);
1457   // Remove empty lines before "}" where applicable.
1458   if (RootToken.is(tok::r_brace) &&
1459       (!RootToken.Next ||
1460        (RootToken.Next->is(tok::semi) && !RootToken.Next->Next)) &&
1461       // Do not remove empty lines before namespace closing "}".
1462       !getNamespaceToken(&Line, Lines)) {
1463     Newlines = std::min(Newlines, 1u);
1464   }
1465   // Remove empty lines at the start of nested blocks (lambdas/arrow functions)
1466   if (!PreviousLine && Line.Level > 0)
1467     Newlines = std::min(Newlines, 1u);
1468   if (Newlines == 0 && !RootToken.IsFirst)
1469     Newlines = 1;
1470   if (RootToken.IsFirst && !RootToken.HasUnescapedNewline)
1471     Newlines = 0;
1472 
1473   // Remove empty lines after "{".
1474   if (!Style.KeepEmptyLinesAtTheStartOfBlocks && PreviousLine &&
1475       PreviousLine->Last->is(tok::l_brace) &&
1476       !PreviousLine->startsWithNamespace() &&
1477       !(PrevPrevLine && PrevPrevLine->startsWithNamespace() &&
1478         PreviousLine->startsWith(tok::l_brace)) &&
1479       !startsExternCBlock(*PreviousLine)) {
1480     Newlines = 1;
1481   }
1482 
1483   // Insert or remove empty line before access specifiers.
1484   if (PreviousLine && RootToken.isAccessSpecifier()) {
1485     switch (Style.EmptyLineBeforeAccessModifier) {
1486     case FormatStyle::ELBAMS_Never:
1487       if (Newlines > 1)
1488         Newlines = 1;
1489       break;
1490     case FormatStyle::ELBAMS_Leave:
1491       Newlines = std::max(RootToken.NewlinesBefore, 1u);
1492       break;
1493     case FormatStyle::ELBAMS_LogicalBlock:
1494       if (PreviousLine->Last->isOneOf(tok::semi, tok::r_brace) && Newlines <= 1)
1495         Newlines = 2;
1496       if (PreviousLine->First->isAccessSpecifier())
1497         Newlines = 1; // Previous is an access modifier remove all new lines.
1498       break;
1499     case FormatStyle::ELBAMS_Always: {
1500       const FormatToken *previousToken;
1501       if (PreviousLine->Last->is(tok::comment))
1502         previousToken = PreviousLine->Last->getPreviousNonComment();
1503       else
1504         previousToken = PreviousLine->Last;
1505       if ((!previousToken || previousToken->isNot(tok::l_brace)) &&
1506           Newlines <= 1) {
1507         Newlines = 2;
1508       }
1509     } break;
1510     }
1511   }
1512 
1513   // Insert or remove empty line after access specifiers.
1514   if (PreviousLine && PreviousLine->First->isAccessSpecifier() &&
1515       (!PreviousLine->InPPDirective || !RootToken.HasUnescapedNewline)) {
1516     // EmptyLineBeforeAccessModifier is handling the case when two access
1517     // modifiers follow each other.
1518     if (!RootToken.isAccessSpecifier()) {
1519       switch (Style.EmptyLineAfterAccessModifier) {
1520       case FormatStyle::ELAAMS_Never:
1521         Newlines = 1;
1522         break;
1523       case FormatStyle::ELAAMS_Leave:
1524         Newlines = std::max(Newlines, 1u);
1525         break;
1526       case FormatStyle::ELAAMS_Always:
1527         if (RootToken.is(tok::r_brace)) // Do not add at end of class.
1528           Newlines = 1u;
1529         else
1530           Newlines = std::max(Newlines, 2u);
1531         break;
1532       }
1533     }
1534   }
1535 
1536   return Newlines;
1537 }
1538 
1539 void UnwrappedLineFormatter::formatFirstToken(
1540     const AnnotatedLine &Line, const AnnotatedLine *PreviousLine,
1541     const AnnotatedLine *PrevPrevLine,
1542     const SmallVectorImpl<AnnotatedLine *> &Lines, unsigned Indent,
1543     unsigned NewlineIndent) {
1544   FormatToken &RootToken = *Line.First;
1545   if (RootToken.is(tok::eof)) {
1546     unsigned Newlines =
1547         std::min(RootToken.NewlinesBefore,
1548                  Style.KeepEmptyLinesAtEOF ? Style.MaxEmptyLinesToKeep + 1 : 1);
1549     unsigned TokenIndent = Newlines ? NewlineIndent : 0;
1550     Whitespaces->replaceWhitespace(RootToken, Newlines, TokenIndent,
1551                                    TokenIndent);
1552     return;
1553   }
1554 
1555   if (RootToken.Newlines < 0) {
1556     RootToken.Newlines =
1557         computeNewlines(Line, PreviousLine, PrevPrevLine, Lines, Style);
1558     assert(RootToken.Newlines >= 0);
1559   }
1560 
1561   if (RootToken.Newlines > 0)
1562     Indent = NewlineIndent;
1563 
1564   // Preprocessor directives get indented before the hash only if specified. In
1565   // Javascript import statements are indented like normal statements.
1566   if (!Style.isJavaScript() &&
1567       Style.IndentPPDirectives != FormatStyle::PPDIS_BeforeHash &&
1568       (Line.Type == LT_PreprocessorDirective ||
1569        Line.Type == LT_ImportStatement)) {
1570     Indent = 0;
1571   }
1572 
1573   Whitespaces->replaceWhitespace(RootToken, RootToken.Newlines, Indent, Indent,
1574                                  /*IsAligned=*/false,
1575                                  Line.InPPDirective &&
1576                                      !RootToken.HasUnescapedNewline);
1577 }
1578 
1579 unsigned
1580 UnwrappedLineFormatter::getColumnLimit(bool InPPDirective,
1581                                        const AnnotatedLine *NextLine) const {
1582   // In preprocessor directives reserve two chars for trailing " \" if the
1583   // next line continues the preprocessor directive.
1584   bool ContinuesPPDirective =
1585       InPPDirective &&
1586       // If there is no next line, this is likely a child line and the parent
1587       // continues the preprocessor directive.
1588       (!NextLine ||
1589        (NextLine->InPPDirective &&
1590         // If there is an unescaped newline between this line and the next, the
1591         // next line starts a new preprocessor directive.
1592         !NextLine->First->HasUnescapedNewline));
1593   return Style.ColumnLimit - (ContinuesPPDirective ? 2 : 0);
1594 }
1595 
1596 } // namespace format
1597 } // namespace clang
1598